我正在使用计时器在Andengine中生成精灵。
现在我希望在同一场景中检测精灵和其他精灵之间的碰撞。
我尝试使用下面的代码,但它没有按预期工作。
还有另一种检测碰撞的方法吗?
//method to create sprite
public void add()
{
mFaceCount++;
Random rand = new Random();
int x = (int) CAMERA_WIDTH + mb1.getWidth();
int minY = mb1.getHeight();
int maxY = (int) (CAMERA_HEIGHT/2 - mb1
.getHeight());
int rangeY = maxY + minY;
// int y = rand.nextInt(280) + 320;
int y=rand.nextInt(350-280) + 280;
int minDuration = 2;
int maxDuration = 3;
int rangeDuration = maxDuration - minDuration;
int actualDuration = rand.nextInt(rangeDuration) + minDuration;
if(this.mFaceCount%2==0)
{
targetSprite =new Sprite(x,y,mb4.clone());
mScene.attachChild(b1);
B1= PhysicsFactory.createBoxBody(this.mPhysicsWorld, b1, BodyType.KinematicBody, FIXTURE_DEF);
}
else if(this.mFaceCount%3==0)
{
targetSprite =new Sprite(x,y,mb2.clone());
mScene.attachChild(b1);
B1= PhysicsFactory.createBoxBody(this.mPhysicsWorld, b1, BodyType.KinematicBody, FIXTURE_DEF);
}
B1.setLinearVelocity(-5, 0);
mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(b1, B1, true, false)
{
@Override
public void onUpdate(float pSecondsElapsed)
{
super.onUpdate(pSecondsElapsed);
}
});
}
// time handler
private void createSpriteSpawnTimeHandler(){
TimerHandler spriteTimerHandler;
float mEffectSpawnDelay = 2f;
spriteTimerHandler = new TimerHandler(mEffectSpawnDelay,true,new ITimerCallback(){
@Override
public void onTimePassed(TimerHandler pTimerHandler) {
add();
}
});
getEngine().registerUpdateHandler(spriteTimerHandler);
}
//update handler to detect collision
IUpdateHandler updateHandler = new IUpdateHandler()
{
@Override
public void reset() { }
@Override
public void onUpdate(final float pSecondsElapsed)
{
if (hanger.collidesWith(targetSprite))
{
System.out.println("Collision);
;
}
}
};
答案 0 :(得分:1)
首先根据实体类型分配不同的灯具。 然后按如下方式为您的世界实施联系人监听:
CustomContactListener customContact = new CustomContactListener(bxWorld);
bxWorld.setContactListener(customContact);
public class CustomContactListener implements ContactListener{
World bxWorld;
UserData userDataA, userDataB;
Body bodyA, bodyB;
GamePlayLayer gameScene;
Fixture fixtureA, fixtureB;
public boolean isFirstCollision;
public ArrayList<Body> menHitList;
public CustomContactListener(World bxWorld) {
bxWorld.setContactListener(this);
this.bxWorld = bxWorld;
this.gameScene = GamePlayLayer.gameScene;
this.menHitList = new ArrayList<Body>();
}
@Override
public void beginContact(Contact contact) {
fixtureA = contact.getFixtureA();
fixtureB = contact.getFixtureB();
bodyA = fixtureA.getBody();
bodyB = fixtureB.getBody();
userDataA = (UserData) bodyA.getUserData();
userDataB = (UserData) bodyB.getUserData();
}
@Override
public void endContact(Contact arg0) {
// TODO Auto-generated method stub
}
@Override
public void postSolve(Contact arg0, ContactImpulse arg1) {
// TODO Auto-generated method stub
}
@Override
public void preSolve(Contact contact, Manifold arg1) {
Vector2[] contactVector = contact.getWorldManifold().getPoints();
ObjectType objectTypeA = userDataA.getObjectType();
ObjectType objectTypeB = userDataB.getObjectType();
if((objectTypeA == ObjectType.ITEM_THROWN ) && objectTypeB == ObjectType.BOUNDARY_BOTTOM_DOWN ){
// to remove multiple collisions
// to prevent projectile mirvs from scheduler
}else if(objectTypeA == ObjectType.BOUNDARY_BOTTOM_DOWN && objectTypeB == ObjectType.ITEM_THROWN ){
}
}
}
您可以在此
中实现您想要的碰撞