DirectX游戏编程入门——第二部分(游戏编程工具箱) ——精灵编程之碰撞检测
本系列文章由 net_assassin 整理编写,转载请注明出处。
http://blog.csdn.net/net_assassin/article/category/1100363
到目前为止,我们能够在屏幕上绘制精灵,不过要制作游戏,这是远远不够的,仅仅只是开始而已。真正的游戏有许多精灵相互交互,例如子弹和火箭击中敌人的飞船造成爆炸。作者:net_assassin 邮箱: net_assassin@hotmail.com 期待着与志同道合的朋友们相互交流
碰撞检测是可继承到游戏中的最简单(也是最重要)的物理类型。
检测精灵碰撞主要有两种算法(或方法):边界框 及 基于距离的碰撞检测。
真正让一个游戏鹤立鸡群的是程序对碰撞的响应能有多好。
使用Windows API 函数 IntersectRect 来检测两个矩形是否有交集。
碰撞函数更改sprite结构
基于距离的碰撞检测:边界框碰撞检测产生相当精确的碰撞结果,而且非常快速。但有些情况下这种方法不能很好地适应,例如使用带有圆角的美工作品或非常复杂的形状。
在使用距离确定两个精灵是否碰撞时,我们必须计算每个精灵的中心点,计算精灵的半径(从中心点到边缘),然后检查两个中心点之间的距离。如果这个距离少于两个半径的和,那么就可以肯定两个精灵有重叠。bool CollisionD(SPRITE sprite1, SPRITE sprite2){ double radius1, radius2; //calculate radius 1 if (sprite1.width > sprite1.height)radius1 = (sprite1.width * sprite1.scaling) / 2.0; elseradius1 = (sprite1.height * sprite1.scaling) / 2.0; //center point 1 double x1 = sprite1.x + radius1; double y1 = sprite1.y + radius1;D3DXVECTOR2 vector1(x1, y1); //calculate radius 2 if (sprite2.width > sprite2.height)radius2 = (sprite2.width * sprite2.scaling) / 2.0; elseradius2 = (sprite2.height * sprite2.scaling) / 2.0; //center point 2 double x2 = sprite2.x + radius2; double y2 = sprite2.y + radius2; D3DXVECTOR2 vector2(x2, y2); //calculate distancedouble deltax = vector1.x - vector2.x;double deltay = vector2.y - vector1.y; double dist = sqrt((deltax * deltax) + (deltay * deltay)); //return distance comparisonreturn (dist < radius1 + radius2);}