我正在为 Android 开发一款 2D 水下动作角色扮演游戏,使用 Box2D 作为物理引擎,主要用于碰撞检测、碰撞响应以及游戏角色在由墙壁、岩石和其他生物组成的环境中的移动。
我尝试了两种不同的方法来使用 Box2D 实现角色动画,但都发现了问题。由于我是 Box2D 和物理引擎的新手,因此我希望获得关于如何最好地完成这些事情的建议。
我尝试做的动画示例如下:
一条鱼想要攻击另一条鱼,也会这样做:
1)以一定速度向目标移动
2) 咬掉目标生物
3)转身逃跑,回到攻击开始的地方
4) 转身面对目标,准备再次攻击
我尝试过的两种方法是:
A)对攻击者施加力量(使用body.applyForce())将其移向目标,然后在碰撞后用另一个力将其再次移回
问题:
* 攻击者经常击中目标并弹开,然后以极快的速度猛冲回来,并在各处的墙壁上弹回。速度是相当随机的,取决于它撞击目标的位置、目标的质量等。它破坏了动画并且看起来很糟糕。
* 很难弄清楚应该向攻击者施加什么力以及何时模拟物理世界中的特定动画,使其看起来逼真
B)直接设置攻击者的位置(使用body.setTransform())将攻击者移动到正确的位置,每一步向前移动,然后再次向后移动。
问题:
* 直接设置位置可以让攻击者忽略与墙壁和其他生物的碰撞,因此卡在墙壁中是很常见的
* 如果玩家正在攻击,我会在玩家移动时更新世界原点,以使玩家保持在屏幕中间。这工作得很好,除了当我开始动画时,因为我不希望屏幕跟随动画,而只是现有速度的运动分量,我不知道,因为我正在覆盖 Box2D 力/当我设置位置时的速度。我确信这是可能的,但是很困难 - 也许我错过了一些明显的东西。
我应该监控碰撞吗?覆盖碰撞响应?还有别的事吗?
那么,您建议我如何解决这个问题?
我只习惯使用 Farseer,但 Farseer 是 Box2D 的直接移植,所以我希望这个答案仍然有帮助。
除了施加力和传送之外,您还可以设置身体的线性移动速度。这样你就可以在不施加力的情况下让鱼向玩家移动。您应该从鱼身上捕获碰撞事件,并在每个事件中比较鱼是否击中了玩家,然后在与玩家的碰撞事件中设置 false/NoCollision,以便它不会反弹。现在将鱼的身体设置为忽略与玩家身体的任何碰撞,并使用固定关节将鱼粘在玩家身上。您现在可以播放咬合动画。
在咬合动画之后,您想要脱离鱼。开始你的逃跑动画,移除关节并将鱼传送到玩家身体的边缘(这样它就不会与之碰撞)。之后,重新启用鱼和玩家身体之间的碰撞,并将鱼远离玩家(通过再次设置线性移动速度,或者通过力获得良好的弹跳效果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)