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