AndEngine - TimerHandler不提供机构之间的联系

时间:2014-04-23 23:31:13

标签: android andengine

我正在制作跳投游戏。目标是保持活跃的跳跃平台。 我用我的角色和3个平台开始游戏。我使用timerhandler随机生成的下一个平台。 它几乎准备好但我面临着一些timerhandler的问题。 我用它来每秒产生一次平台(静态身体)。

private void addPlat(int x, int y) 
{
    platform = new Platform(x, y, vbom, physicsWorld);
    attachChild(platform);      
}

private void createPlatSpawn() 
{
    float mEffectSpawnDelay = 1f;

    platSpawnTimerHandler = new TimerHandler(mEffectSpawnDelay, true, new ITimerCallback() 
    {

        @Override
        public void onTimePassed(TimerHandler pTimerHandler) {                  

                platformList.add(platform);

                if (platformList.getLast().getY() >= 240 && platformList.getLast().getY() < 400) 
                {
                    yCoord = (int) (platform.getY() - addNumber.nextInt(160));
                }
                else if (platformList.getLast().getY() < 240 && platformList.getLast().getY() >= 50)
                {
                    yCoord = (int) (platform.getY() + addNumber.nextInt(160));
                }
                xCoord = (int) (platform.getX() + 200);

                addPlat(xCoord, yCoord);
        }
    });

    resourcesManager.engine.registerUpdateHandler(platSpawnTimerHandler);

}

要跳转我使用变量footContacts,当它为正时它可以跳跃,否则它不能

这里是联系人监听器

private ContactListener contactListener()
{
    ContactListener contactListener = new ContactListener()
    {
        public void beginContact(Contact contact)
        {
            final Fixture x1 = contact.getFixtureA();
            final Fixture x2 = contact.getFixtureB();

            if (x1.getBody().getUserData() != null && x2.getBody().getUserData() != null)
            {
                if (x2.getBody().getUserData().equals("player"))
                {
                    player.increaseFootContacts();
                }
            }
        }

        public void endContact(Contact contact)
        {
            final Fixture x1 = contact.getFixtureA();
            final Fixture x2 = contact.getFixtureB();

            if (x1.getBody().getUserData() != null && x2.getBody().getUserData() != null)
            {
                if (x2.getBody().getUserData().equals("player"))
                {
                    player.decreaseFootContacts();
                }
            }
        }

        public void preSolve(Contact contact, Manifold oldManifold)
        {

        }

        public void postSolve(Contact contact, ContactImpulse impulse)
        {

        }
    };
    return contactListener;
}

这是Player类中的方法,让他跳转

public void jump()
{
    if (footContacts < 1) 
    {
        return; 
    }
    body.setLinearVelocity(new Vector2(body.getLinearVelocity().x, 15)); 
}

前3个平台跳转动作完美地工作但是当他与timerhandler创建的平台交互时,它不起作用。有人可以帮帮我吗?

添加方法以创建前3个平台:

private void createFirstPlat() 
{
    addPlat(200, 200);
    addPlat(400, 300);
    addPlat(600, 150);
}

班级平台

public class Platform extends Sprite{

private Body body;

public Platform(float pX, float pY, VertexBufferObjectManager vbo, PhysicsWorld physicsWorld) 
{   
    super(pX, pY, ResourcesManager.getInstance().platform_region, vbo);
    createPhysics(physicsWorld);
    // TODO Auto-generated constructor stub
}

private void createPhysics (PhysicsWorld physicsWorld)
{

    body = PhysicsFactory.createBoxBody(physicsWorld, this, BodyType.StaticBody, PhysicsFactory.createFixtureDef(0, 0, 0.5f));

    body.setUserData("platform");

    physicsWorld.registerPhysicsConnector(new PhysicsConnector(this, body, true, false)
    {
        @Override
        public void onUpdate(float pSecondsElapsed)
        {
            super.onUpdate(pSecondsElapsed);
        }
    });

}

}

1 个答案:

答案 0 :(得分:0)

您应该在手动创建这3个工作平台的位置发布更多代码。问题可能出现在.setUserData中我无法看到,因为您还没有发布您的Platform类。

另一个可能的问题是您没有将它附加到正确的实体,或者您可能没有初始化的physiscsConnector存在问题。尝试创建

public Entity foregroundLayer = new Entity();

并将其附加到场景中。然后在addPlat中使用

foregroundLayer.attachChild(platform)

如果这不会有帮助,请粘贴您的平台类以及如何创建它们的前三次。

PS顺便说一下,当你想控制图层时,这是一个很好的解决方案。例如,你想要一些精灵在顶部,一些精灵在重叠时在背景上。重要的是附加订单,因此您首先附加backgroundLayer然后附加foregroundLayer。最后,您可以随时为这两个图层附加其他图片,它将按照您的预期显示。