LibGDX box2d检测对象的特定实例
LibGDX box2d detection of specific instance of an Object
我对 box2d 中的 beginContact 方法有点困惑。
我有一个 Runner class,它在游戏中生成一个跑步者。在游戏中,我有多个跑步者,我想检测跑步者的特定实例与障碍物之间的碰撞。
在 beginContact() 中,我想为被击中的跑步者启动 hit() 方法。
public void beginContact(Contact contact) {
final Body a = contact.getFixtureA().getBody();
final Body b = contact.getFixtureB().getBody();
if ((BodyUtils.bodyIsRunner(a) && BodyUtils.bodyIsEnemy(b)) ||
(BodyUtils.bodyIsEnemy(a) && BodyUtils.bodyIsRunner(b))) {
Runner c;
if(BodyUtils.bodyIsRunner(a)) c = (Runner) a.getUserData();
else c = (Runner) b.getUserData();
c.hit();
但是在这条线上:
if(BodyUtils.bodyIsRunner(a)) c = (Runner) a.getUserData();
游戏异常崩溃:
com.pl.runner.box2d.RunnerUserData cannot be cast to com.pl.runner.entities.Runner
我现在不知道该如何处理,所以如果有人能提供建议或解决方案,我将非常感激。我可能遗漏了一些基本的东西,我坚持这段代码太久了。
这是 RunnerUserDataclass:
public class RunnerUserData extends UserData {
private final Vector2 runningPosition = new Vector2(Constants.RUNNER_X, Constants.RUNNER_Y);
private final Vector2 dodgePosition = new Vector2(Constants.RUNNER_DODGE_X, Constants.RUNNER_DODGE_Y);
private Vector2 jumpingLinearImpulse;
public RunnerUserData(float width, float height) {
super(width,height);
jumpingLinearImpulse = Constants.RUNNER_JUMPING_LINEAR_IMPULSE;
userDataType = UserDataType.RUNNER;
}
public Vector2 getJumpingLinearImpulse() {
return jumpingLinearImpulse;
}
public void setJumpingLinearImpulse(Vector2 jumpingLinearImpulse) {
this.jumpingLinearImpulse = jumpingLinearImpulse;
}
public float getHitAngularImpulse() {
return Constants.RUNNER_HIT_ANGULAR_IMPULSE;
}
public float getDodgeAngle() {
// In radians
return (float) (-90f * (Math.PI / 180f));
}
public Vector2 getRunningPosition() {
return runningPosition;
}
public Vector2 getDodgePosition() {
return dodgePosition;
}
}
你的问题很简单地描述为异常,你试图将 RunnerUserData
转换为 Runner
但你不能这样做,因为 Runner
不是RunnerUserData
。
解决此问题的一种方法是将实际的 Runner
object 作为 user-data 传递,例如body.setUserdata(this)
(同时在 Runner
class)。
您可以使用以下方法确定灯具的 user-data 是否为 Runner
object:
if (body.getUserData() instanceof Runner) {}
我建议将 user-data 设为 object,因为您拥有的每个 body,这样查找起来就容易多了。
因为我的 RunnerUserData 在我的游戏中有一点不同的作用,所以我根本无法通过 body.setUserdata(runner) 中的 Runner。
所以我有一些解决方法并且工作正常,也许有一天它会对某人有所帮助:
在 beginContact() 方法中:
Body c;
if(a.getUserData() instanceof RunnerUserData) c = a;
else c = b; //checks which body is a runner
for (Runner r : runners){
if(r.getUserData() == c.getUserData()){
runners.remove(r);
break; //do something if you detect proper runner and quit the loop
}
}
我对 box2d 中的 beginContact 方法有点困惑。
我有一个 Runner class,它在游戏中生成一个跑步者。在游戏中,我有多个跑步者,我想检测跑步者的特定实例与障碍物之间的碰撞。 在 beginContact() 中,我想为被击中的跑步者启动 hit() 方法。
public void beginContact(Contact contact) {
final Body a = contact.getFixtureA().getBody();
final Body b = contact.getFixtureB().getBody();
if ((BodyUtils.bodyIsRunner(a) && BodyUtils.bodyIsEnemy(b)) ||
(BodyUtils.bodyIsEnemy(a) && BodyUtils.bodyIsRunner(b))) {
Runner c;
if(BodyUtils.bodyIsRunner(a)) c = (Runner) a.getUserData();
else c = (Runner) b.getUserData();
c.hit();
但是在这条线上:
if(BodyUtils.bodyIsRunner(a)) c = (Runner) a.getUserData();
游戏异常崩溃:
com.pl.runner.box2d.RunnerUserData cannot be cast to com.pl.runner.entities.Runner
我现在不知道该如何处理,所以如果有人能提供建议或解决方案,我将非常感激。我可能遗漏了一些基本的东西,我坚持这段代码太久了。
这是 RunnerUserDataclass:
public class RunnerUserData extends UserData {
private final Vector2 runningPosition = new Vector2(Constants.RUNNER_X, Constants.RUNNER_Y);
private final Vector2 dodgePosition = new Vector2(Constants.RUNNER_DODGE_X, Constants.RUNNER_DODGE_Y);
private Vector2 jumpingLinearImpulse;
public RunnerUserData(float width, float height) {
super(width,height);
jumpingLinearImpulse = Constants.RUNNER_JUMPING_LINEAR_IMPULSE;
userDataType = UserDataType.RUNNER;
}
public Vector2 getJumpingLinearImpulse() {
return jumpingLinearImpulse;
}
public void setJumpingLinearImpulse(Vector2 jumpingLinearImpulse) {
this.jumpingLinearImpulse = jumpingLinearImpulse;
}
public float getHitAngularImpulse() {
return Constants.RUNNER_HIT_ANGULAR_IMPULSE;
}
public float getDodgeAngle() {
// In radians
return (float) (-90f * (Math.PI / 180f));
}
public Vector2 getRunningPosition() {
return runningPosition;
}
public Vector2 getDodgePosition() {
return dodgePosition;
}
}
你的问题很简单地描述为异常,你试图将 RunnerUserData
转换为 Runner
但你不能这样做,因为 Runner
不是RunnerUserData
。
解决此问题的一种方法是将实际的 Runner
object 作为 user-data 传递,例如body.setUserdata(this)
(同时在 Runner
class)。
您可以使用以下方法确定灯具的 user-data 是否为 Runner
object:
if (body.getUserData() instanceof Runner) {}
我建议将 user-data 设为 object,因为您拥有的每个 body,这样查找起来就容易多了。
因为我的 RunnerUserData 在我的游戏中有一点不同的作用,所以我根本无法通过 body.setUserdata(runner) 中的 Runner。
所以我有一些解决方法并且工作正常,也许有一天它会对某人有所帮助: 在 beginContact() 方法中:
Body c;
if(a.getUserData() instanceof RunnerUserData) c = a;
else c = b; //checks which body is a runner
for (Runner r : runners){
if(r.getUserData() == c.getUserData()){
runners.remove(r);
break; //do something if you detect proper runner and quit the loop
}
}