Android研究之游戏开发碰撞检测



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

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

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

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

4.主角与脚本框发生的碰撞,例如走进房间出线一段剧情对话等等。

由此可见游戏中的碰撞主要是可以分为

1.点与矩形之间的碰撞

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

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

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

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

绘制地图

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

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

背景底层

物理层

 碰撞层

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

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

代码的实现方式

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

mIskeyDown  = true 表示 按下方向键下

mIskeyLeft = true 表示 按下方向键左

mIskeyRight  = true 表示 按下方向键右

mIskeyUp  = true 表示 按下方向键上

mHeroPosX 表示人物的X坐标

mHeroPosY 表示人物的Y坐标

mAnimationState 表示播放动画的ID 因为人物行走有4组方向的动画 所以 mAnimationState 可以修改播放那组动画

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

/** 根据按键更新显示动画 **/

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

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坐标是否超出屏幕

如果超出屏幕则保持他目前的位置不变

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

/** 检测人物是否出屏 **/

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 备份发生碰撞前人物的坐标 一旦碰撞以后将使用备份的坐标 避免人物碰撞后不能返回。

1

2

3

4

5

6

7

8

9

if
(mCollision[mHeroIndexY][mHeroIndexX]
== -1)
{

mHeroPosX
= mBackHeroPosX;

mHeroPosY
= mBackHeroPosY;

isAcotrCollision
= true;

}
else {

mBackHeroPosX
= mHeroPosX;

mBackHeroPosY
= mHeroPosY;

isAcotrCollision
= false;

}

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

与实体层发生碰撞

边界碰撞

最后由于代码较多我就不贴在博客中了 , 下面给出Demo源码的下载欢迎大家下载阅读互相学习,互相研究,互相讨论一起进步。

源码下载:Android碰撞

Android研究之游戏开发碰撞检测

时间: 2024-10-14 06:50:51

Android研究之游戏开发碰撞检测的相关文章

Android研究之游戏开发摄像头更新

 游戏中摄像头的原理介绍        在游戏开发中更新摄像头的位置可以决定屏幕显示的内容,尤其是RPG类游戏摄像头有着非常重要的作用,我举一个例子 有时候我们在玩RPG游戏的时候进入一个新的场景 触发一段脚本后 发现镜头开始向上移动 根据镜头移动玩家可以大概浏览一下这个场景有什么东西 ,触发什么样的剧情.这个实现的方式就是游戏摄像头原理.上章学习了Android游戏开发地图编辑器有需要的可以看下. 如图所示:首先摄像头显示的区域也是手机屏幕显示的区域 如果需要更改摄像头的位置  其实是更改

Android研究之游戏开发处理按键的响应

1.onKeyDown 方法 onKeyDown 方法是KeyEvent.Callback 接口中的一个抽象方法,重写onKeyDown 方法可以监听到按键被按下的事件,我们先看看onKeyDown方法的函数原型. 第一个参数为键值,手机中每一个按钮都拥有一个完全独立的键值 通过按键键值就可以确定当前按下的是那一个按键. 第二个参数为按键事件,  该对象中保存着当前按键的所有信息 比如 按键发生的时间 按键发生的次数  按键发生的类型等等. 通过以上两个参数就可以拿到当前按键事件的所附带的一切信

Android研究之游戏开发帧动画实现

 1.帧动画的原理        帧动画帧动画顾名思义,一帧一帧播放的动画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在相同区域快速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,其实不过是N张图片在一帧一帧的切换罢了.对摄像头不清楚的请看Android研究之游戏开发摄像头更新        如图所示:人物行走动画的实现方式, 4帧行走动画在播放区域 一帧一帧向左切换播放 给人们一种播放动画的假象 ,图片就动了起来, 很简单吧,其它三方向播放动画的方法类似我就不再一一举例.

Android研究之游戏开发主角与地图的滚动

 人物移动地图的平滑滚动处理         玩过rpg游戏的朋友应该都知道RPG的游戏地图一般都比较大 今天我和大家分享一下在RPG游戏中如何来处理超出手机屏幕大小的游戏地图. 如图所示为程序效果动画图 . 地图滚动的原理        在本人之前博客的文章中介绍过人物在屏幕中的移动方式,因为之前拼的游戏地图是完全填充整个手机屏幕的,所以无需处理地图的平滑滚动.这篇文章我着重的向大家介绍一下控制人物移动后地图滚动的处理方式.举个例子 如上图所示 比如人物向右移动,如果地图贴在屏幕左边边界 

Android研究之游戏开发多线程详解

 游戏开发与软件开发多线程的重要性       如果程序主线程被阻塞超过5秒,系统会提示"应用程序无响应" 这就是ANR . ANR的全称是Application Not Responding,使用多线程可以避免ANR.但是这里要注意一下不要为了避免ANR而过多的使用多线程,除非万不得已的情况. 比如访问网络服务端返回的过慢.数据过多导致滑动屏幕不流畅.或者I/O读取过大的资源等等.这里可以开启一个新线程来处理这些耗时的操作. 如果过多使用多线程会出现数据同步的问题须要程序员去处理

Android安卓手机游戏开发

在android中,事件主要包括点击.长按.拖曳.滑动等操作,这些构成了Android的事件响应,总体来说,所有的事件都由如下三个部分作为基础构成: 按下(action_down),移动(action_move),抬起(action_up).各种响应归根结底都是基于View以及ViewGroup的,这两者中响应的方法分别有: View.java中: publi boolean dispatchTouchEvent(MotionEvent event) public boolean onTouch

Coco2d-x android win7 Python 游戏开发环境的搭建

1:我用的电脑配置 win7 3 核 内存8G 桌面.一直想学习Coco2d 游戏开发,所以,一个星期后,需要找到,最终建立了一个良好的环境 2:我使用的版本号版本号,至于建筑android开发环境略. 3: 2.2>安装ndk,为了使用c++/c进行android开发 下载android-ndk-r8e,然后在eclipse或adt bundle中配置ndk路径. 4: 5:採用VS 编译环境 我之前用的VS2010 感觉用着不爽,所以改成如今的VS 2012 , 6:一般用python建立项

极客学院Android之2048游戏开发全过程

2048完整开发 课1.游戏2048玩法介绍 同一条线上的相同数字折叠 课2.创建2048游戏项目 修改布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:lay

Android游戏开发研究帧动画实现

 1.动画的原则框架        帧的动画帧的动画顾名思义,画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在同样区域高速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,事实上只是是N张图片在一帧一帧的切换罢了.对摄像头不清楚的请看p=992" rel="bookmark">Android研究之游戏开发摄像头更新        如图所看到的:人物行走动画的实现方式, 4帧行走动画在播放区域 一帧一帧向左切换播放 给人们一种播放动画的假象 .图片就动