4

我刚开始玩 LibGDX,并且已经面临相机问题。

我在互联网上看到了一些 tutos,如果我理解得很好,在使用 LibGDX 的 2D 游戏中,您必须重新计算所有实体的位置(我的意思是屏幕上的每个实体)的位置,并考虑速度等参数......

对我来说,这意味着相机不会移动,而是它所展示的世界。我想做相反的事情,移动相机而不是世界,因为这对我来说更有意义,而且看起来更容易,因为我只需要移动相机,而不是所有实体。所以我不希望世界移动,我的相机显示变化,但我的相机移动并显示变化。因此,即使某些实体没有移动(它们的坐标 x 和 y 没有改变),它看起来就像相机移动一样。

所以我有一个Camera继承自的类OrthographicalCamera和一个Entity类。我还有 2 个接口PositionListener& PositionListenable=> Pattern Observer。

所以我试图做的是:
- 我的相机只“听”我的一个实体(例如玩家)
- 当我的实体移动时,它用它的坐标(x,y)更新相机,我的相机改变它的位置x 和 y 跟随我的实体。

这是 Camera.java 中的代码:

public class Camera extends OrthographicCamera implements PositionListener {

    public Camera(float width, float height) {
        super(width, height);
    }

    @Override
    public void entityMoved(float newX, float newY) {
        translate(newX - position.x, newY - position.y);
        update();
        Gdx.app.log("entityMoved()", "newX=" + newX + " - newY=" + newY);
        Gdx.app.log("entityMoved()", "position.x=" + position.x + " - position.y=" + position.y);
}

}

当我阅读日志时,我看到了这一点position.xposition.y按照我的预期进行了更改以跟随我的实体,但视觉上相机没有移动??一切看起来都像我的相机没有翻译一样!

我的相机根本不动,只有我的实体!
我错过了什么?我读了一些关于“viewPort”的东西,但真的没有明白,因为我是 LibGDX 的初学者。

4

1 回答 1

3

好的,我是如何让它工作的。
这是entityMoved()方法:

@Override
public void entityMoved(float newX, float newY) {
    translate(newX - position.x, newY - position.y);
    Gdx.app.log("entityMoved()", "newX=" + newX + " - newY=" + newY);
    Gdx.app.log("entityMoved()", "position.x=" + position.x + " - position.y=" + position.y);

在主循环中,render()方法ApplicationListener

sprite.begin();
world.draw(sprite);
sprite.end();

camera.update();
sprite.setProjectionMatrix(camera.combined);

draw 方法()也使我的实体移动,并通知它的观察者是相机。然后我更新相机(而不是像以前那样从它自己的方法)并更新投影矩阵。

有点滞后,但就像我想要的那样工作!

于 2012-07-26T21:16:22.153 回答