- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
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点程序是不能进行逻辑判断的 比如检测主角向右移动走超出屏幕,因为坐标点在左上角 所以整个图片都走出屏幕以后程序才能判断出人物出屏, 所以不能用左上角的点来作为主角的坐标原点,须要用下面的点来计算人物的逻辑坐标 我的建议是我们
文档评论(0)