基本上,我希望坐标系具有(0,0)作为屏幕的左上角(用于Swing和Android Canvas绘图中)。
我看到了执行Changing the Coordinate System in LibGDX (Java)的强大线程。我使用了创建者提供的代码,但我正在绘制的矩形仍在屏幕底部。
这是我绘制矩形的代码(我使用一个类GameWorld来管理所有“游戏对象”,并使用另一个类GameRenderer来渲染所有游戏对象)这两个类都有一个将从GameScreen的render方法调用的方法。
GameScreen.java中的相关代码
public class GameScreen implements Screen {
//manage game objects
private GameWorld world;
//render game objects
private GameRenderer renderer;
public GameScreen() {
world = new GameWorld();
renderer = new GameRenderer(world);
}
public void render(float delta) {
world.update(delta);
renderer.render();
}
.....
}
在GameWorld.java中
public class GameWorld {
private Rectangle rectangle;
public GameWorld() {
rectangle = new Rectangle(0, 0, 17, 12);
}
public void update(float delta) {
rectangle.setX(rectangle.getX() + 1);
if(rectangle.getX() > Gdx.graphics.getWidth()) {
rectangle.setX(0);
}
}
public Rectangle getRect() {
return rectangle;
}
}
在GameRenderer.java中
public class GameRenderer {
private ShapeRenderer shapeRenderer;
private OrthographicCamera cam;
private GameWorld myWorld;
public GameRenderer(GameWorld theWorld) {
myWorld = theWorld;
cam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
cam.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
}
public void render() {
shapeRenderer = new ShapeRenderer();
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
shapeRenderer.setColor(87/255.0f, 109/255.0f, 120/255.0f, 1);
Rectangle toDraw = myWorld.getRect();
shapeRenderer.rect(toDraw.getX(), toDraw.getY(),
toDraw.getWidth(), toDraw.getHeight());
shapeRenderer.end();
}
}
最后在我正在测试游戏的Desktop.java中,
public class DesktopLauncher {
public static void main (String[] arg) {
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
config.title = "My test";
config.width = 272;
config.height = 408;
new LwjglApplication(new MyGdxGame(), config);
}
}
有人看到我做错了吗?为什么仍在屏幕底部绘制矩形。我使用了创建者提供的代码,并将矩形的顶部y坐标指定为零。
最佳答案
您没有将相机的投影应用于ShapeRenderer。
在shapeRenderer.begin()
之前添加以下行:
shapeRenderer.setProjectionMatrix(cam.combined);
另外,应该将ShapeRenderer的实例化从
render()
移到类构造函数,这样就不会在每一帧上都创建一个新的实例。