Android培训三十二课程第九讲

本文介绍Android平台游戏开发中碰撞检测的实现方法,包括主角与地图物理层的碰撞检测原理及代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      Anroid是一种以 嵌入式为基础的开放源码操作系统, Android 培训第九课:系统讲解游戏碰撞。

     游戏中的碰撞主要是可以分为以下几类:

     1.点与矩形之间的碰撞

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

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

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

     这节课主要讲解:主角与物理层之间的碰撞。 如图所示:每个小方块中储存着地图块的信息,在二位数组中如果为-1表示属于物理层不可通过,其它均可通过。也就是说-1 这个地图块的位置绘制这物理层的东西。主角在行走的时候通过自己的坐标原点计算出自己在二位数组中的索引,然后根据索引找到数组中的数值 判断自己是否可以通过

      绘制地图

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

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

背景底层

物理层

    碰撞层

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

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

代码实现

       首先我们需要利用onKeyDown()onKeyUp()方法确定当前手机那个按键被按下,根据按键信息更新人物动画,检测是否碰撞。
       mIskeyDown  = true 表示 按下方向键下
       mIskeyLeft = true 表示 按下方向键左
       mIskeyRight  = true 表示 按下方向键右
       mIskeyUp  = true 表示 按下方向键上
       mHeroPosX 表示人物的X坐标
      mHeroPosY 表示人物的Y坐标
     mAnimationState 表示播放动画的ID 因为人物行走有4组方向的动画 所以 mAnimationState 可以修改播放那组动画 

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

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

3                 if (mIskeyDown) {

4                     mAnimationState = ANIM_DOWN;

5                     mHeroPosY += HERO_STEP;

6                 } else if (mIskeyLeft) {

7                     mAnimationState = ANIM_LEFT;

8                     mHeroPosX -= HERO_STEP;

9                 } else if (mIskeyRight) {

10                     mAnimationState = ANIM_RIGHT;

11                     mHeroPosX += HERO_STEP;

12                 } else if (mIskeyUp) {

13                     mAnimationState = ANIM_UP;

14                     mHeroPosY -= HERO_STEP;

15                 }

       主角每次移动的时候我们还需要检测一下他的X Y坐标是否超出屏幕
       如果超出屏幕则保持他目前的位置不变 

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

17                 isBorderCollision = false;

18                 if (mHeroPosX <= 0) {

19                     mHeroPosX = 0;

20                     isBorderCollision =true;

21                 } else if (mHeroPosX >= mScreenWidth) {

22                     mHeroPosX = mScreenWidth;

23                     isBorderCollision =true;

24                 }

25                 if (mHeroPosY <= 0) {

26                     mHeroPosY = 0;

27                     isBorderCollision =true;

28                 } else if (mHeroPosY >= mScreenHeight) {

29                     mHeroPosY = mScreenHeight;

30                     isBorderCollision =true;

31                 }

        主角应该有两个坐标点
    如图所示: 为什么主角要有2个坐标点的原因是  左上角的00点程序是不能进行逻辑判断的 比如检测主角向右移动走超出屏幕,因为坐标点在左上角 所以整个图片都走出屏幕以后程序才能判断出人物出屏, 所以不能用左上角的点来作为主角的坐标原点,须要用下面的点来计算人物的逻辑坐标 我的建议是我们只计算下面这个点然后根据这个点在算出来图片左上角的原点,然后在通知图像绘制。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值