我目前在一个小游戏上编程,你必须避免使用太空船的小行星。使用FitViewport在每个设备上保持游戏外观相同。不幸的是,通过使用视口,调整大小时我的坐标会有点偏差。首先看一下Class Diagramm,以获得更好的整体外观。
(Class Diagramm是使用ObjectAid创建的)
要解决此问题,我需要在Spaceship类的update()方法中实现viewport.unproject()方法。 宇宙飞船课程:
public void update()
{
if (Gdx.input.isTouched())
{
y = MyGdxGame.HEIGHT - Gdx.input.getY();
x = Gdx.input.getX();
sprite.setPosition(x, y);
}
}
Viewport只能在GameScreenClass中使用,所以我不能写入更新方法。 GameScreen看起来像这样:
@Override
public void render(SpriteBatch batch)
{
// TODO Auto-generated method stub
cam.update();
batch.setProjectionMatrix(cam.combined);
batch.begin();
em.render(batch);
[...]
}
我不想在GameScreenClass中使用孔代码。我尝试使用Viewport参数创建更新方法,但我只是一个白色的屏幕。还有另一种方法可以解决这个问题吗?在这里,您可以全面了解我的项目。 (https://github.com/Zui0per/SpaceAvoiding/tree/master/tmp)
提前致谢!
答案 0 :(得分:1)
解决方案可能是取消主类中的触摸坐标,并将未投影的x和y作为参数传递给各种update()
方法。例如在宇宙飞船:
public void update(float unprojectedX, float unprojectedY) {
if (Gdx.input.isTouched()) {
sprite.setPosition(unprojectedX, unprojectedY);
}
}
很难跟踪你的代码,因为你在每个类中都有多个render和unproject方法,但你需要取消对触摸坐标的投影并将它们传递给EntityManager.update()方法,它可以将它们传递给它的孩子。