ANDROID游戏碰撞原理.docx
- 文档编号:27448882
- 上传时间:2023-07-01
- 格式:DOCX
- 页数:10
- 大小:287.21KB
ANDROID游戏碰撞原理.docx
《ANDROID游戏碰撞原理.docx》由会员分享,可在线阅读,更多相关《ANDROID游戏碰撞原理.docx(10页珍藏版)》请在冰豆网上搜索。
ANDROID游戏碰撞原理
ANDROID游戏碰撞原理
游戏碰撞的大致可以分为这几种类
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可以修改播放那组动画
viewplain
/** 根据按键更新显示动画 **/
/** 在碰撞数组中寻找看自己是否与地图物理层发生碰撞 **/
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;
}
主角每次移动的时候我们还需要检测一下他的XY坐标是否超出屏幕
如果超出屏幕则保持他目前的位置不变
viewplain
/** 检测人物是否出屏 **/
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备份发生碰撞前人物的坐标一旦碰撞以后将使用备份的坐标避免人物碰撞后不能返回。
viewplain
if (mCollision[mHeroIndexY][mHeroIndexX] == -1) {
mHeroPosX = mBackHeroPosX;
mHeroPosY = mBackHeroPosY;
isAcotrCollision = true;
} else {
mBackHeroPosX = mHeroPosX;
mBackHeroPosY = mHeroPosY;
isAcotrCollision = false;
}
欢迎您的下载,
资料仅供参考!
致力为企业和个人提供合同协议,策划案计划书,学习资料等等
打造全网一站式需求
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ANDROID 游戏 碰撞 原理