XNA游戏开发学习笔记系列(三)

碰撞检测

在游戏的开发中,碰撞检测是最常遇到的,对于每个游戏,碰撞检测都几乎是不可避免的,无论是精灵与精灵的碰撞,精灵与屏幕边框的碰撞。下面我们就来谈谈碰撞检测最常用的方法。

实验一:不让精灵跑出游戏窗口

如何让精灵限制在游戏窗口内而不跑出窗口,思路是一旦精灵移动到屏幕边缘,就做相应的处理,让精灵不再动了

if (ringsPosition.X < 0)
       ringsPosition.X = 0;
if (ringsPosition.Y < 0)
       ringsPosition.Y = 0;
if (ringsPosition.X > Window.ClientBounds.Width - ringsFrameSize.X)
       ringsPosition.X = Window.ClientBounds.Width - ringsFrameSize.X;
if (ringsPosition.Y > Window.ClientBounds.Height - ringsFrameSize.Y)
       ringsPosition.Y = Window.ClientBounds.Height - ringsFrameSize.Y;

 

实验二:精灵与精灵间的碰撞检测

思路:使用包围框围绕物体(我们这里使用矩形作为包围框),一旦矩形相交即为发生了碰撞,Rectangle结构为我们提供了一个判断两个矩形是否相交的方法Intersects(),使用方法如下:

protected bool Collide()
        {
            Rectangle ringsRect = new Rectangle((int)ringsPosition.X, (int)ringsPosition.Y, ringsFrameSize.X, ringsFrameSize.Y);
            Rectangle skullRect = new Rectangle((int)skullPosition.X, (int)skullPosition.Y, skullFrameSize.X, skullFrameSize.Y);
            return ringsRect.Intersects(skullRect);      //检测两个矩形是否相交
        }

对于某些复杂的图形,我们可以使用其它包围框,另外也可以为图形创建若干个较小的矩形,为每个精灵定义一个偏移变量,这样可以将碰撞做到更加的精确,这里就不再深入探究了,留给读者去实践吧。

程序源代码下载:http://www.ctdisk.com/file/6691162

posted @ 2012-05-10 16:05  helloxyz  Views(228)  Comments(0Edit  收藏  举报