我正在尝试做一场排球比赛并模拟基于 box2d 的每一个动作。我想做的是当球员击球和球击中墙壁时有不同的球恢复。所以在第一种情况下球应该飞得更快,在第二种情况下更慢。
但是,如果我试图以不同的方式为玩家和墙壁对象设置恢复原状,我也会注意到玩家本身正在从墙上弹跳......有没有办法可以选择性地做到这一点?例如,击球不应该导致球员反弹......但是如果球员击球,它应该反弹很多。
我正在尝试做一场排球比赛并模拟基于 box2d 的每一个动作。我想做的是当球员击球和球击中墙壁时有不同的球恢复。所以在第一种情况下球应该飞得更快,在第二种情况下更慢。
但是,如果我试图以不同的方式为玩家和墙壁对象设置恢复原状,我也会注意到玩家本身正在从墙上弹跳......有没有办法可以选择性地做到这一点?例如,击球不应该导致球员反弹......但是如果球员击球,它应该反弹很多。
不幸的是,你是对的,Box2D 没有这个设置。
相反,您可以做的是侦听与球员和球相匹配的接触侦听器事件。发生这种情况时,您会对球施加非常大的力。
编辑
我从头顶输入了这个,我不确定它是否完全正确。
public class MyContactListener extends b2ContactListener {
override public function Add(point:b2ContactPoint):void {
var ball:b2Body = ...
var player:b2Body = ... // fill these
var force:b2Vec2;
if(point.shape1.GetBody() == ball && point.shape2.GetBody() == player) {
force = point.normal.Copy();
force.Multiply(SOMETHING);
ball.ApplyForce(force);
} else if(point.shape1.GetBody() == player && point.shape2.GetBody() == ball) {
force = point.normal.Copy();
force.Multiply(-SOMETHING);
ball.ApplyForce(force);
}
}
}
这里发生了什么。
您需要创建此类的一个实例并将其注册到可能类似于world.SetContactListener(new MyContactListener)
或类似的世界中。
Add() 方法在两个物体接触时触发。施加的力沿接触法线方向(将您从一个身体带到另一个身体)。
由于接触侦听器系统的设置方式,球或球员都可能成为 b2ContactPoint 结构中的第一身体,因此您需要针对这种可能性进行编码。法线的方向取决于哪一个是身体#1(因此是减号)。我实际上不记得它的走向,所以你可能需要扭转力量(将减号放在另一个分支中)。
除此之外,它应该是相当清楚的。Box2D 在这里似乎并不为人所知,因此您可能会在 Box2D 论坛(http://www.box2d.org/forum/)上获得更多的运气