我正在制作跳投游戏。目标是保持活跃的跳跃平台。 我用我的角色和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);
}
});
}
}
答案 0 :(得分:0)
您应该在手动创建这3个工作平台的位置发布更多代码。问题可能出现在.setUserData中我无法看到,因为您还没有发布您的Platform类。
另一个可能的问题是您没有将它附加到正确的实体,或者您可能没有初始化的physiscsConnector存在问题。尝试创建
public Entity foregroundLayer = new Entity();
并将其附加到场景中。然后在addPlat中使用
foregroundLayer.attachChild(platform)
如果这不会有帮助,请粘贴您的平台类以及如何创建它们的前三次。
PS顺便说一下,当你想控制图层时,这是一个很好的解决方案。例如,你想要一些精灵在顶部,一些精灵在重叠时在背景上。重要的是附加订单,因此您首先附加backgroundLayer然后附加foregroundLayer。最后,您可以随时为这两个图层附加其他图片,它将按照您的预期显示。