基本上,我希望坐标系具有(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()移到类构造函数,这样就不会在每一帧上都创建一个新的实例。

09-11 18:43
查看更多