如何将冲突检测添加到 XNA Framework 应用程序

2012/2/9

本主题演示如何检测用户何时点按此 XNA Framework 应用程序中围绕屏幕移动的方块图形对象。在上一个的主题中,已创建基本的游戏基础结构。我们在此通过添加功能扩展了该逻辑,从而使其可以检测何时用户点按屏幕,以及何时点按命中方块图形对象或与之冲突。具备此功能之后,我们可以将命中数记录为当前分数。本系列中的后续主题将进一步对其进行扩展,以添加级别和记分板,从而显示当前分数和当前级别。到该系列结束时,将在应用程序中添加实现试用体验的功能。

执行此步骤之前,您需完成以下主题。

注意注意:

以下过程中的步骤用于 Visual Studio 2010 Express for Windows Phone。 当您使用用于 Visual Studio 2010 Professional 或 Visual Studio 2010 Ultimate 的插件时,您可能会看到菜单命令或窗口布局中的一些微小改变。

上一个主题(如何创建 XNA Framework 应用程序)中介绍的游戏会导致图形对象以恒速围绕屏幕弹跳。为使游戏充满趣味性,我们将添加一项功能,跟踪玩家点按围绕屏幕弹跳图形对象的次数。

在玩家点按图形对象时进行检测

  1. Game1 构造函数中,添加以下代码行。这使点按手势成为此应用程序的有效手势。当用户短暂触摸屏幕上单个点时,点按手势就发生了。

    
       TouchPanel.EnabledGestures = GestureType.Tap;
    
    
  2. Game1 类的 Update 方法中,在对 UpdateSprite 的调用前添加以下代码。因为任何时候都可以在触摸板上注册多个手势,因此我们在 While 循环中调用 TouchPanel.IsGestureAvailable。读取每一个手势,并且如果手势是 GestureType.Tap,则调用 CheckForTouchCollision,并传递所记录点按在屏幕上发生的位置。在此过程的下一步中实现 CheckForTouchCollision

    
                   while (TouchPanel.IsGestureAvailable)
                    {
                        GestureSample gs = TouchPanel.ReadGesture();
                        if (gs.GestureType == GestureType.Tap)
                        {
                            CheckForTouchCollision(gs.Position);
                        }
                    }
    
    
    
  3. “Game1.cs”中,添加以下代码。此代码分别定义图形对象和手势的两个边界框或矩形。它使用 BoundingBoxIntersects 方法确定两个框是否重叠。如果该方法返回 true,则已经检测到冲突,这意味着手势命中图形对象。在这种情况下,冲突计数递增。最后,检查是否达到目标冲突数。如果达到,则游戏移到下一级别。在本系列的下一个主题中,我们将实现此 GoToNextLevel 方法。

    
            // Number of collisions recorded in this round
            int collisionCount = 0;
    
            // The target number of collisions to detect to complete a level
            const int COLLISION_TARGET = 5;
    
            // A tolerance for the position of the tap gesture, to more accurately detect if 
            // the tap overlapped with the graphic object
            const float TAP_TOLERANCE = 20.0f;
    
            void CheckForTouchCollision(Vector2 position)
            {
                BoundingBox bb1 = new BoundingBox(new Vector3(spritePosition.X - (sprite1Width / 2), spritePosition.Y - (sprite1Height / 2), 0), 
                                                  new Vector3(spritePosition.X + (sprite1Width / 2), spritePosition.Y + (sprite1Height / 2), 0));
                BoundingBox bbG = new BoundingBox(new Vector3(position.X - TAP_TOLERANCE, position.Y - TAP_TOLERANCE, 0), 
                                                  new Vector3(position.X - TAP_TOLERANCE, position.Y + TAP_TOLERANCE, 0));
                           
                if (bb1.Intersects(bbG))
                {
                    // Update collision count and scoreboard
                    collisionCount++;
    
                    // Has the level been completed?
                    if (collisionCount == COLLISION_TARGET)
                    {
                        // Level Complete
                           GoToNextLevel();
    
                    }
                }
    
            }
    
    
    

本系列的下一个主题将演示如何将级别添加到应用程序。此时,我们已有由方块围绕屏幕移动构成的简单游戏,并且我们可以检测用户何时点按方块并将其记录为分数。若要演示试用体验,游戏最好有多个级别。在之后的主题中介绍的试用体验,能够根据游戏许可证(试用或完整)限制用户能够玩的级数。级别实现将定义每一级方块围绕屏幕移动的速度。级别越高,围绕屏幕弹跳的方块的移动速度越快。

如何将级别添加到 XNA Framework 应用程序

显示: