AndEngine - TimerHandler не обеспечивает связь между телами

Я делаю игру с перемычками. Цель - остаться в живых, прыгая с платформ. Я начинаю игру с моим персонажем и 3 платформами. Следующие платформы я генерирую случайно с помощью обработчика таймера. Он почти готов, но я столкнулся с некоторыми проблемами с таймером. Я использую его для порождения платформ (статических тел) раз в секунду.

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 платформ:

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 ответ

Решение

Вы должны разместить больше кода, где вы вручную создадите эти 3 рабочие платформы. Возможно, проблема в.setUserData, которого я не вижу, потому что вы еще не опубликовали свой класс Platform.

Другая возможная проблема заключается в том, что вы не присоединяете его к нужному объекту или есть проблема с physiscsConnector, которую вы, возможно, не инициализируете. Попробуй создать

public Entity foregroundLayer = new Entity();

и прикрепить его к сцене. Тогда в addPlat используйте

foregroundLayer.attachChild(platform)

Если это не поможет, пожалуйста, вставьте свой класс Platform и то, как вы его создаете в первые три раза.

PS Кстати, это отличное решение, когда вы хотите управлять слоями. Например, вы хотите, чтобы некоторые спрайты были на вершине, а некоторые спрайты - на фоне при наложении. Важно прикрепить порядок, поэтому вы сначала присоединяете backgroundLayer, а затем foregroundLayer. Наконец, вы можете присоединить другие объекты для этих двух слоев в любое время, и они будут показаны так, как вы ожидаете.

Другие вопросы по тегам