我正在为android开发一个2d,水下,动作rpg,使用box2d作为物理引擎,主要用于碰撞检测,碰撞响应和在由墙壁,岩石和其他生物组成的环境中移动游戏中的角色。
我尝试了两种使用box2d实现角色动画的不同方法,并且发现了这两种方法的问题。由于我对box2d和物理引擎还不熟悉,我希望能推荐一个关于如何最好地完成这些工作的建议。
我正在尝试制作的动画示例如下:
一条鱼想攻击另一条鱼,以下情况也是如此:
1)快速向目标移动
2)从目标生物身上咬一口
3)转身逃跑,回到攻击开始的地方
4)转身面对目标,准备再次攻击
我尝试过的两种方法是:
a)对攻击者施加一个力(使用body.applyForce())使其向目标移动,然后在碰撞后再次施加另一个力使其向后移动
问题:
*攻击者经常击中目标并反弹,然后以很快的速度冲回来,然后从墙上反弹,到处都是。速度是相当随机的,取决于它影响目标的位置、目标的质量等。它会破坏动画,看起来很糟糕。
*很难弄清楚应该对攻击者施加什么样的力,以及何时在物理世界中模拟一个特定的动画,所以看起来很逼真
b)直接设置攻击者的位置(使用body.setTransform())以将攻击者移动到正确的位置,因为攻击者每向前移动一步,然后再向后移动。
问题:
*直接设置位置可以让攻击者忽略与墙壁和其他生物的碰撞,因此卡在墙上很常见
*如果玩家正在攻击,我会在玩家移动时更新世界原点,以保持玩家在屏幕中间。这很好,除了当我开始一个动画,因为我不想让屏幕跟随动画,但只有现有速度的运动成分,我不知道,因为我在设置位置时覆盖了box2d力/速度。我确定这是可能的,但很难——也许我遗漏了一些显而易见的东西。
我应该监视碰撞吗?覆盖碰撞响应??还有别的吗?
那么,你建议我如何解决这个问题?

最佳答案

我只习惯和Farseer一起工作,但是Farseer是Box2D的一个非常直接的端口,所以我希望这个答案仍然有用。
除了施力和心灵传送,你还可以设置身体的线性运动速度。这样你就可以让鱼在不用力的情况下向玩家移动。你应该从鱼身上捕捉碰撞事件,并在每个事件中比较鱼是否击中了玩家,然后在碰撞事件中设置false/nocollision以使其不反弹。现在将鱼体设置为忽略与玩家身体的任何碰撞,并使用固定关节将鱼粘到玩家身上。现在可以播放咬合动画。
在咬伤动画后,你想脱离鱼。启动逃离动画,移除关节并将鱼传送到玩家身体的边缘(这样它就不会与之碰撞)。之后,重新启用鱼群和玩家身体之间的碰撞,并将鱼群送出玩家(通过再次设置线性移动速度,或通过力获得良好的反弹效果)。

关于android - 使用Box2D进行角色动画的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5590959/

10-10 18:30
查看更多