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); //检测两个矩形是否相交
}
对于某些复杂的图形,我们可以使用其它包围框,另外也可以为图形创建若干个较小的矩形,为每个精灵定义一个偏移变量,这样可以将碰撞做到更加的精确,这里就不再深入探究了,留给读者去实践吧。