3

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

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

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

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

我尝试过的两种方法是:

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

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

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

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

4

1 回答 1

0

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

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

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

于 2011-04-08T06:23:21.057 回答