检测精灵创建的TimeHandler的碰撞

时间:2014-01-13 08:58:39

标签: android box2d andengine physics game-physics

我正在使用计时器在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);
                    ;
             }


        }
};

1 个答案:

答案 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 ){


        }       


    }


}

您可以在此

中实现您想要的碰撞