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. Наконец, вы можете присоединить другие объекты для этих двух слоев в любое время, и они будут показаны так, как вы ожидаете.