gpt4 book ai didi

java - 为什么AndEngine的CollisionHandler会在一次碰撞中产生多个事件?

转载 作者:行者123 更新时间:2023-11-30 09:33:35 25 4
gpt4 key购买 nike

我正在编写一个 Swing 的钟摆(在 AndEngine 中)的 GameActivity。

在应用 CollisionHandler 时,这将产生一个系列碰撞事件,而不是一个??实际上,我希望它在 Sprite 碰撞时执行一次

我的案例:当 movingBallmLeftWall 碰撞时,它调用 5 次onCollision();很不正常,我预计只有一次。

我应该改用 ContactListener 并在 PhysicsWorld 上注册吗?这是我的代码:

MyGameActivity.java:

/** List of objects to check collision of any animating objects. E.g: walls  */
private ArrayList<IShape> mCollidingTargetList = new ArrayList<IShape>();

/** user-defined collision handler */
PendulumCollisionCallback collideActionCallback = new PendulumCollisionCallback();

@Override
public Scene onCreateScene()
{
final Scene scene = super.onCreateScene();

final VertexBufferObjectManager vertexBufferObjectManager = this.getVertexBufferObjectManager();

//Create walls
mWallLeft = new Rectangle(0, 0, 2, mCameraHeight, vertexBufferObjectManager);
mWallRight = new Rectangle(mCameraWidth - 2, 0, 2, mCameraHeight, vertexBufferObjectManager);
PhysicsFactory.createBoxBody(mPhyscisWorld, mWallLeft, BodyType.StaticBody, mWallFixtureDef);
PhysicsFactory.createBoxBody(mPhyscisWorld, mWallRight, BodyType.StaticBody, mWallFixtureDef);
scene.attachChild(mWallLeft);
scene.attachChild(mWallRight);

//Create movingBall - the pendulum ball
final AnimatedSprite movingBall = new AnimatedSprite(mCenterX, mCenterY, this.mCircleFaceTextureRegion, this.getVertexBufferObjectManager());
final Body ballBody = PhysicsFactory.createCircleBody(this.mPhysicsWorld, movingBall, BodyType.DynamicBody, mObjectFixtureDef);
movingBall.setUserData(ballBody); // for getting the body attached with UI

//..... Stuff to create anchorBody and RevoluteJoint with the movingBall

//list of bodies where sprites collide
this.mCollidingTargetList.add(mWallLeft);
this.mCollidingTargetList.add(mWallRight);

//Manage user-defined collision handler: movingBall collides with walls
CollisionHandler pendulumCollideHandler = new CollisionHandler(collideActionCallback, movingBall, mCollidingTargetList);
scene.registerUpdateHandler(pendulumCollideHandler);

return scene;
}

PendulumCollisionCallback.java:

public class PendulumCollisionCallback implements ICollisionCallback
{
public PendulumCollisionCallback()
{ }

/**
* @param animatedShape
* Entity to check collision with other targets
* @param pTargetShape
* Target to check the collision
* @return <code>true</code> to proceed, <code>false</code> to stop further collosion-checks.
*/
@Override
public boolean onCollision(IShape animatedShape, IShape pTargetShape)
{
String pendulPos = String.format("Pendul:x=%f, y=%f", animatedShape.getX(), animatedShape.getY());
Log.d("COLLIDE", pendulPos);
return false;
}
}

最佳答案

我发现了问题。这是因为分离了 Physics Handler 和 Scene 的 UpdateHandler 工作顺序。

虽然 PhysicsWorld 仍在控制 body 碰撞,但 body 仍在向前移动几帧 => 因此 UI Sprite (附在这个 body 上)的位置与碰撞对象相交。在这些帧中,updateHandler 通过 CallbackHandler 产生碰撞事件。

解决方法是添加 boolean 标志,它在第一次碰撞时设置,在碰撞结束时取消设置(虽然这不是不错)。

P/S:我从 FPSLogger 观察到的帧速率是 ~88,9 FPS

关于java - 为什么AndEngine的CollisionHandler会在一次碰撞中产生多个事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12087523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com