求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
Android游戏开发之检测游戏碰撞的原理实现(四)
 

发布于 2011-10-19

 

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

1.主角与边界的碰撞,限制主角不能走出手机屏幕外。

2.主角与物理层的碰撞,与地图中的房子 桌子 椅子等等。

3.主角与游戏人物之间的碰撞,这里指NPC等。

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;  

}  

我用我写的一个碰撞的demo和大家展示一下游戏碰撞的效果

与实体层发生碰撞

与实体层发生碰撞

与地图边界发生碰撞


相关文章

深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
相关文档

重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
相关课程

基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程

 
分享到
 
 
     


android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   


Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合


领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...