疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

android培训:android游戏碰撞原理


 

  游戏碰撞大致可以分为几种类型

  1 主角跟边角的碰撞,限制主角不能跳出手机屏幕之外。

  2 主角跟物理层的碰撞,跟地图中的其他物体等。

  3 主角跟游戏人物的碰撞

  4 主角跟脚本框的碰撞。

  这样我们就可以将碰撞分为:

  1.点与矩形之间的碰撞

  2.矩形与矩形之间的碰撞

  3.圆形与圆形之间的碰撞

  4.圆形与矩形之间的碰撞

  今天我主要介绍一下以上中最特殊的一个碰撞方式 主角与物理层之间的碰撞。 如图所示:每个小方块中储存着地图块的信息,在二位数组中如果为-1表示属于物理层不可通过,其它均可通过。也就是说-1 这个地图块的位置绘制这物理层的东西。主角在行走的时候通过自己的坐标原点计算出自己在二位数组中的索引,然后根据索引找到数组中的数值 判断自己是否可以通过。

  绘制地图

  根据地图编辑器生成出来的数组,一定是先绘制背景层地图,然后在绘制第物理地图等等。

  物理碰撞层生成的数组 是不用绘制的,只需要每次主角移动坐标的时候检测是否与物理层发生碰撞.

  背景底层

  物理层

  碰撞层

  说到这里可能有些朋友会问为什么第一层要和第二层分开? 这两层不能合二为一吗?

  如图所示:用两个图层主要是为了解决物理层图片不能全部显示,好比下面这个荷花, 它的绘制区域在矩形中 周围白色的则是透明的区域,所以我们需要先绘制地图背景层在绘制物理层这样就可以遮盖透明区域。

  代码的实现方式

  首先我们需要利用onKeyDown()和onKeyUp()方法确定当前手机那个按键被按下,根据按键信息更新人物动画,检测是否碰撞。

  mIskeyDown = true 表示 按下方向键下

  mIskeyLeft = true 表示 按下方向键左

  mIskeyRight = true 表示 按下方向键右

  mIskeyUp = true 表示 按下方向键上

  mHeroPosX 表示人物的X坐标

  mHeroPosY 表示人物的Y坐标

  mAnimationState 表示播放动画的ID 因为人物行走有4组方向的动画 所以 mAnimationState 可以修改播放那组动画 /** 根据按键更新显示动画 **/

  /** 在碰撞数组中寻找看自己是否与地图物理层发生碰撞 **/

  if (mIskeyDown) {

  mAnimationState = ANIM_DOWN;

  mHeroPosY += HERO_STEP;

  } else if (mIskeyLeft) {

  mAnimationState = ANIM_LEFT;

  mHeroPosX -= HERO_STEP;

  } else if (mIskeyRight) {

  mAnimationState = ANIM_RIGHT;

  mHeroPosX += HERO_STEP;

  } else if (mIskeyUp) {

  mAnimationState = ANIM_UP;

  mHeroPosY -= HERO_STEP;

  }

  复制代码主角每次移动的时候我们还需要检测一下他的X Y坐标是否超出屏幕

  如果超出屏幕则保持他目前的位置不变 /** 检测人物是否出屏 **/

  isBorderCollision = false;

  if (mHeroPosX <= 0) {

  mHeroPosX = 0;

  isBorderCollision =true;

  } else if (mHeroPosX >= mScreenWidth) {

  mHeroPosX = mScreenWidth;

  isBorderCollision =true;

  }

  if (mHeroPosY <= 0) {

  mHeroPosY = 0;

  isBorderCollision =true;

  } else if (mHeroPosY >= mScreenHeight) {

  mHeroPosY = mScreenHeight;

  isBorderCollision =true;

  }

  主角应该有两个坐标点

  如图所示: 为什么主角要有2个坐标点的原因是 左上角的00点程序是不能进行逻辑判断的 比如检测主角向右移动走超出屏幕,因为坐标点在左上角 所以整个图片都走出屏幕以后程序才能判断出人物出屏, 所以不能用左上角的点来作为主角的坐标原点,须要用下面的点来计算人物的逻辑坐标 我的建议是我们只计算下面这个点然后根据这个点在算出来图片左上角的原点,然后在通知图像绘制。

  判断碰撞检测

  mCollision[][]这个二维数是地图编辑器生成出来的,用来组保存碰撞层的所有信息 -1表示不能通过

  mHeroIndexX 、mHeroIndexY 代表当前人物在二位数组中的索引位置,根据索引找到二维数组中的值判断是否碰撞

  mBackHeroPosX、mBackHeroPosY 备份发生碰撞前人物的坐标 一旦碰撞以后将使用备份的坐标 避免人物碰撞后不能返回。 if (mCollision[mHeroIndexY][mHeroIndexX] == -1) {

  mHeroPosX = mBackHeroPosX;

  mHeroPosY = mBackHeroPosY;

  isAcotrCollision = true;

  } else {

  mBackHeroPosX = mHeroPosX;

  mBackHeroPosY = mHeroPosY;

  isAcotrCollision = false;

  }

  以上介绍的就是关于android开发游戏中我们会遇到的一个问题,android培训将此分享给大家,希望能对大家有帮助!