如何实现安卓游戏中碰撞的消失
比如碰撞池1,角色A的攻击箱,碰撞池2,碰撞池3,碰撞池4,放置角色B的攻击箱。
然后,在计算角色碰撞时,计算“碰撞池1”和“碰撞池4”之间的碰撞以及“碰撞池2”和“碰撞池3”之间的碰撞就足够了。
其实在代码中,还有很多更精致的碰撞方式,比如圆形碰撞、定向矩形碰撞、物理引擎等等。
根据实际情况选择合适的碰撞代码即可。
游戏碰撞大致可以分为这几类。
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坐标。
动画状态表示要播放的动画的ID。因为角色在四组动画中行走,所以动画状态可以修改和播放那组动画。
主角应该有两个坐标点?
如图:为什么主角有两个坐标点?左上角的00点程序无法进行逻辑判断。比如它直到坐标点在左上角才能判断出角色在屏幕外,所以程序不能用左上角的点作为主角的坐标原点。有必要使用以下点来计算字符的逻辑坐标。我的建议是,我们只计算下面这个点然后根据这个点计算图片左上角的原点,然后通知图像绘制。
判断碰撞检测
MCollision[][]这个二维数字是地图编辑器生成的,用来分组保存碰撞层的所有信息?-1表示无法通过。
MHeroIndexX和mHeroIndexY表示当前字符在二维数组中的索引位置,根据索引找到二维数组中的值来判断是否冲突。
MBackHeroPosX和mBackHeroPosY在碰撞前备份人的坐标。一旦发生碰撞,将使用备份坐标来防止人员在碰撞后返回。