Andengine Box2d将精灵替换为另一个
问题描述:
我一直在使用AndEngine一年,现在感觉是时候转向某些物理。 我跟着AndEngine物理示例开始了一个滚球游戏,使用加速度计将球引导到一个洞中,在屏幕上滚动球。 我把我的球滚动OK,但不能让它掉进洞里。我已经谷歌搜索,并尝试了一切,但我可以得到的最好的是球与孔相撞,或者反弹或翻转它。Andengine Box2d将精灵替换为另一个
这是一些代码。
这是我的球。
ball = new AnimatedSprite(pX, pY,this.mBallFaceTextureRegion,this.getVertexBufferObjectManager());
bodyBall = PhysicsFactory.createCircleBody(this.mPhysicsWorld,ball,BodyType.DynamicBody, FIXTURE_DEF);
bodyBall.setUserData("Ball");
ball.animate(200);
this.mScene.attachChild(ball);
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(ball, bodyBall, true, true));
蒂亚是我的洞。
hole = new Sprite(pX, pY, this.hHoleFaceTextureRegion, this.getVertexBufferObjectManager());
bodyHole = PhysicsFactory.createCircleBody(this.mPhysicsWorld, hole, BodyType.StaticBody, FIXTURE_DEF);
bodyHole.setUserData("Hole"); // ID for hole
this.mScene.attachChild(hole);
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(hole, bodyHole, false, false));
这是我的场景onCreateScene()的一些代码,我已经试过里面ContactListener。
this.mPhysicsWorld.setContactListener(new ContactListener() {
@Override
public void beginContact(final Contact pContact) {
final Body BodyA = pContact.getFixtureA().getBody();
final Body BodyB = pContact.getFixtureB().getBody();
if(BodyA.getUserData() == "Ball" && BodyB.getUserData() == "Hole"){
ball.setPosition(hole);
// BodyA.setType(BodyType.StaticBody); // bodyBall
//mPhysicsWorld.destroyBody(BodyB); // bodyHole
}else if(BodyA.getUserData() == "Hole" && BodyB.getUserData() == "Ball"){
ball.setPosition(hole);
// BodyB.setType(BodyType.StaticBody); // bodyBall
// hole.dispose(); // bodyHole
}
}
有人可以请解释如何交换球的孔或其他方式来模拟球落入洞中。 谢谢
答
已解决。
在[Removing Body completely 1]找到解决方案。您必须删除该孔并在单独的线程中重置球。
我创建了一个新方法SwapHoleAndBall(),并从beginContact中调用它。
这是修改后的代码。
public void beginContact(final Contact pContact) {
final Body BodyA = pContact.getFixtureA().getBody();
final Body BodyB = pContact.getFixtureB().getBody();
if(BodyA.getUserData() == "Ball" && BodyB.getUserData() == "Hole"){
SwapHoleAndBall();
......
和交换方法。
public void SwapHoleAndBall() {
final PhysicsConnector physicsConnector =
mPhysicsWorld.getPhysicsConnectorManager().findPhysicsConnectorByShape(hole);
mEngine.runOnUpdateThread(new Runnable()
{
@Override
public void run()
{
if (physicsConnector != null)
{
bodyBall.setTransform(bodyHole.getPosition(), 0);
mPhysicsWorld.unregisterPhysicsConnector(physicsConnector);
bodyHole.setActive(false);
mPhysicsWorld.destroyBody(bodyHole);
mScene.detachChild(hole);
bodyBall.setType(BodyType.StaticBody);
}
}
});
}
希望这会帮助别人。