侵权投诉
当前位置:

OFweek电子工程网

嵌入式设计

正文

[WP7进阶]——XNA游戏平面矩形碰撞检测

导读: 碰撞检测在几乎任何游戏都是很关键的一个部分,而碰撞检测又决定了游戏的流畅性,它对流畅性的影响如何之大的原因,在于碰撞检测算法越是精确到位,游戏将会运行得越缓慢。在碰撞检测方面,很明显需要在准确性和性能之间进行权衡。

  碰撞检测在几乎任何游戏都是很关键的一个部分,而碰撞检测又决定了游戏的流畅性,它对流畅性的影响如何之大的原因,在于碰撞检测算法越是精确到位,游戏将会运行得越缓慢。在碰撞检测方面,很明显需要在准确性和性能之间进行权衡。

  实现碰撞检测最简单和快速的方式是通过包围盒算法。当用一个包围盒算法时,就需要在屏幕上的每个物体(纹理图像)周围“画“一个盒子(矩形块),然后检查这些盒子是否相交,如果产生相交(怎么听起来这么耳熟?),就即可判断出是产生碰撞了。经典的碰撞游戏可以看看如今某I设备上风靡全球的小鸟

  

  通过物理算法和碰撞检测等实现这只小鸟欺负小猪的传说,这点是很值得借鉴滴。

  本篇学习文章将会有两个纹理图,一个图片做为碰撞块例如上图的小鸟,另一个图片做为需要在某一地方去检测是否与之产生碰撞的纹理,例如上图的小猪或者城墙。这两张图片分别是这样的:

   我是用来检测是否有人撞到我的。。。。。

   我没事喜欢撞人。。。。。。

  好了。素材己经有了,下面就到了如何为这两个纹理图像添加各种出场的告白动作了。首先,还是国际惯例一把,先给出效果图:

  

  看上图效果,天上掉下了好多尖尖的小块呀,快逃命呀,不过小人跑不够快,被一个尖尖的小块砸到了,顿时满脸是血,屏幕都被染红了。悲催咯。。。。

  要实现这个功能首先我们需要得到小人的碰撞点,和每一个三角形的碰撞点。以获得小人碰撞点为例,需要得到小人所在的x 坐标和y坐标,并且得到小人的宽度和高度。当我们获取到这个数据的时候,就可以为小人添加一个包围圈也叫矩形检测块:

  // 获得小人的磁撞大小和碰撞的地点

  //公式为:得到小人所在的x、y 地点,然后在那个x、y点的区域高宽

  Rectangle personRectangle =

  new Rectangle((int)personPosition.X, (int)personPosition.Y,

  personTexture.Width, personTexture.Height);

  当得到这个矩形块时。再依次获取得到每个三角形的矩形和其位置使用矩形自带的函数Intersects 来检测两个矩形之者是否产生交接:

  // 与上面获得小人的碰撞点类似

  Rectangle blockRectangle =

  new Rectangle((int)blockPositions[i].X, (int)blockPositions[i].Y,

  blockTexture.Width, blockTexture.Height);

  // 如果小人与其中某一个碰撞纹理的碰撞点产生碰撞

  if (personRectangle.Intersects(blockRectangle))

  personHit = true; //这时的碰撞检测将生效

  如上,如果产生交接即在调用Draw 的时候改变屏幕的颜色,即可产生碰撞时的效果,DEMO源码为:

  /// 《summary》

  /// This is the main type for your game

  /// 《/summary》

  public class Game1 : Microsoft.Xna.Framework.Game

  {

  GraphicsDeviceManager graphics;

  SpriteBatch spriteBatch;

  Texture2D personTexture; //小人纹理图像

  Texture2D blockTexture; //撞击点纹理图像

  // Person

  Vector2 personPosition; //小人2D坐标

  const int PersonMoveSpeed = 5; //小人移动速度

  // Blocks

  List《Vector2》 blockPositions = new List《Vector2》(); //撞击点集合

  float BlockSpawnProbability = 0.1f; //控制撞击点的下降个数

  const int BlockFallSpeed = 10; //撞击点下降速度

  Random random = new Random();

  bool personHit = false; //是否产生碰撞

  Rectangle safeBounds;

  const float SafeAreaPortion = 0.05f;

  Viewport viewport; //获得当前窗口的宽高对象

1  2  下一页>  
声明: 本文由入驻OFweek公众平台的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

我来说两句

(共0条评论,0人参与)

请输入评论

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码: