Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 957|回复: 0

Android游戏开发之检测游戏碰撞的原理实现(九) -  

[复制链接]

该用户从未签到

发表于 2011-10-25 08:58:04 | 显示全部楼层 |阅读模式
带你走进游戏开发的世界之游戏碰撞的原理


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


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和大家展示一下游戏碰撞的效果



与实体层发生碰撞


与实体层发生碰撞


与地图边界发生碰撞








最后由于代码较多我就不贴在博客中了 , 下面给出Demo源码的下载地址欢迎大家下载阅读互相学习,互相研究,
第四讲主角与物理层的碰撞.rar (294.23 KB, 下载次数: 52)
回复

使用道具 举报

该用户从未签到

发表于 2011-10-25 08:58:06 | 显示全部楼层

Re:Android游戏开发之检测游戏碰撞的原理实现(九

好东西,顶起。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-25 08:58:09 | 显示全部楼层

Re:Android游戏开发之检测游戏碰撞的原理实现(九

顶起,顶起
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-25 08:58:12 | 显示全部楼层

Re:Android游戏开发之检测游戏碰撞的原理实现(九

好东西啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 14:03 , Processed in 0.366745 second(s), 33 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表