我刚开始玩 LibGDX,已经遇到相机问题。
我在 Internet 上看到一些教程告诉我,如果我理解得很好的话,在使用 LibGDX 的 2D 游戏中,您必须重新计算所有实体(我的意思是屏幕上的每个实体)的位置,并考虑速度等参数。 ..
对我来说,这意味着相机不会移动,但它所展示的世界。 我想做相反的事情,移动相机而不是世界,因为这对我来说更有意义,而且看起来更容易,因为我只需要移动相机,而不是所有实体。所以我不希望世界移动而我的相机显示变化,而是我的相机移动并显示变化。因此,即使某些实体不动(它们的坐标 x 和 y 不变),它看起来也会像相机移动一样。
所以我有一个继承自 OrthographicalCamera
的 Camera
类和一个 Entity
类。
我还有 2 个接口(interface) 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.x
和 position.y
按照我预期的方式更改以跟随我的实体,但在视觉上相机没有移动 ??一切看起来都一样,就好像我的相机没有翻译一样!
我的相机根本没有动,只有我的实体!
我错过了什么?我阅读了一些有关“viewPort”的内容,但由于我是 LibGDX 的初学者,所以我真的没有理解。
最佳答案
好的,这里是我如何让它工作的。
这是 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);
在主循环中,ApplicationListener
的render()
方法:
sprite.begin();
world.draw(sprite);
sprite.end();
camera.update();
sprite.setProjectionMatrix(camera.combined);
draw 方法 () 也使我的实体移动,并通知它的观察者是相机。
然后我更新相机(不是像以前那样使用它自己的方法)并只更新投影矩阵。
有点迟钝,但工作起来就像我想要的那样!
关于java - LibGDX - Camera.update() 调用不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11672771/