【问题标题】:Whats the best way to do character animations with Box2D?用 Box2D 制作角色动画的最佳方法是什么?
【发布时间】:2011-04-08 05:49:21
【问题描述】:

我正在为 Android 开发 2D 水下动作角色扮演游戏,使用 Box2D 作为物理引擎,主要用于在由墙壁、岩石和其他生物组成的环境中的碰撞检测、碰撞响应和游戏中角色的移动.

我尝试了两种不同的方法来使用 Box2D 实现角色动画,并发现两者都有问题。由于我是 Box2D 和物理引擎的新手,我希望能就如何最好地完成这些事情提出建议。

我正在尝试做的动画示例如下:

一条鱼想要攻击另一条鱼,以下情况也是如此:
1) 以速度向目标移动
2) 咬一口目标生物
3) 转身逃跑,回到攻击开始的地方
4) 转身面对目标,准备再次攻击

我尝试过的两种方法是:

A) 向攻击者施加一个力(使用 body.applyForce() )将其移向目标,然后再用另一个力将其再次移回,之后碰撞
问题:
* 攻击者经常击中目标并弹开并以极快的速度飞回,并从墙上弹回,无处不在。速度非常随机,具体取决于它影响目标的位置、目标的质量等。它会破坏动画并且看起来很糟糕。
* 很难弄清楚应该对攻击者施加什么力以及何时模拟物理世界中的特定动画,使其看起来很逼真

B) 直接设置攻击者的位置(使用 body.setTransform() )将攻击者移动到正确的位置,因为它向前移动每一步,然后再次返回。
问题:
* 直接设置位置可以让攻击者忽略与墙壁和其他生物的碰撞,因此卡在墙上很常见
* 如果玩家正在攻击,我会在玩家移动时更新世界原点,以使玩家保持在屏幕中间。这很好用,除非我开始动画,因为我不希望屏幕跟随动画,但只有现有速度的运动分量,我不知道,因为我正在覆盖 Box2D 力/我设定位置时的速度。我敢肯定,这是可能的,但很困难——也许我遗漏了一些明显的东西。

我应该监控碰撞吗?覆盖碰撞响应??还有什么?

那么,你会建议我如何解决这个问题?

【问题讨论】:

    标签: android physics box2d game-physics


    【解决方案1】:

    我只习惯使用 Farseer,但 Farseer 是 Box2D 的一个非常直接的端口,所以我希望这个答案仍然有帮助。

    除了施加力和传送之外,您还可以设置身体的线性移动速度。这样你就可以让鱼在不施加力量的情况下向玩家移动。您应该从鱼体捕获碰撞事件,并在每个事件中比较鱼是否击中玩家,然后在与玩家的碰撞事件中设置 false/NoCollision 以使其不会反弹。现在将鱼体设置为忽略与玩家身体的任何碰撞,并使用固定关节将鱼粘在玩家身上。您现在可以播放咬合动画了。

    在咬动动画之后,您要让鱼脱离。开始你的逃跑动画,移除关节并将鱼传送到玩家身体的边缘(这样它就不会与它发生碰撞)。之后,重新启用鱼和玩家身体之间的碰撞并将鱼从玩家身边带走(通过再次设置线性移动速度,或通过力获得良好的弹跳效果。

    【讨论】:

    • 嗨,Roy,您的建议使用了一种我没有想到的方法,听起来它可能是赢家。我会进行一些快速测试,让你知道我发现了什么。谢谢!!
    • 谢谢罗伊!确实需要做一些工作才能使每个阶段正常工作(一路上有许多有趣的副作用),但现在它运行良好。谢谢大家!!
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    相关资源
    最近更新 更多