Android 使用Box2D制作角色动画的最佳方法是什么?

Android 使用Box2D制作角色动画的最佳方法是什么?,android,physics,box2d,game-physics,Android,Physics,Box2d,Game Physics,我正在为Android开发一个2D水下动作RPG,使用Box2D作为物理引擎,主要用于碰撞检测、碰撞响应和游戏中角色在由墙壁、岩石和其他生物组成的环境中的移动 我尝试了两种使用Box2D实现角色动画的不同方法,并发现两者都存在问题。由于我是Box2D和physics引擎的新手,我希望能就如何最好地完成这些工作提出建议 我正在尝试制作的动画示例如下: 一条鱼想要攻击另一条鱼,下面的情况也是: 1) 以最快的速度向目标移动 2) 从目标生物身上咬一口 3) 转身逃跑,回到攻击开始的地方 4) 转身面

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

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

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

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

我尝试过的两种方法是:

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

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

我应该监控碰撞吗?覆盖碰撞响应??还有别的吗


那么,您建议我如何解决这个问题呢?

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

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


在咬合动画之后,您希望分离鱼。开始你的逃跑动画,移除关节并将鱼传送到玩家身体的边缘(这样它就不会与之碰撞)。之后,重新启用鱼和玩家身体之间的碰撞,并将鱼从玩家身上移开(可以通过再次设置直线运动速度,也可以通过用力获得良好的反弹效果。

嗨,罗伊,你的建议使用了一种我没有想到的方法,听起来可能是个赢家。我将运行一些快速测试,让你知道我的发现。谢谢!!谢谢罗伊!为了让每个阶段正常工作,确实做了一些工作(一路上有很多有趣的副作用)但现在它工作得很好。谢谢你!!