我有一个15x15的等距Tilemap,由128 x 64像素的瓷砖组成。使用ExtendViewport和OrthogonalCamera我能够渲染地图。但是,当调整窗口的宽高比变得失真时,它在调整窗口大小时无法正确缩放,有时地图将移动到窗口的右侧。如果我强制全屏分辨率,地图确实看起来很好,但如果它是手动缩放或在窗口模式下,则不会。当我说纵横比变得扭曲时,我的意思是瓷砖会出现拉伸或锯齿状,导致美观性差。
是否有一种简单的方法来渲染完美平方(例如10x10,15x15)大小的等距Tilemap,将其显示在屏幕中央并使其正确缩放而不会随着屏幕尺寸的增加而扭曲纵横比?
然后是笛卡尔坐标和等距坐标之间的转换问题。
http://clintbellanger.net/articles/isometric_math/以下帖子解释了如何在笛卡尔坐标和等距坐标之间进行转换,但我无法使其正常工作。下面的代码是我到目前为止最接近工作解决方案的代码,但是当你向屏幕右侧移动时,它变得越来越多,而不是非常多,但它确实很明显。
public static Vector2 cartesianToIsometric(Camera camera, GameMap map, Vector3 point) {
camera.unproject(point);
float tileWidth = (float)map.getMapWidth() * unitScale(map);
float tileHeight = (float)map.getMapHeight() * unitScale(map);
point.x /= tileWidth;
point.y = (point.y - tileHeight / 2) / tileHeight + point.x;
point.x -= point.y - point.x;
return new Vector2((int)point.x, (int)point.y);
}
以下是我的GameRenderer Class中相关代码的片段。
public GameRenderer(GameState world) {
this.map = new Map01();
this.world = world;
this.camera = new OrthographicCamera();
this.viewport = new ExtendViewport(0, 3072, camera);
centerCamera(map);
batchRenderer = new SpriteBatch();
}
public void render() {
Gdx.gl.glClearColor(0.11f, 0.6f, 0.89f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT | (Gdx.graphics.getBufferFormat().coverageSampling?GL20.GL_COVERAGE_BUFFER_BIT_NV:0));
renderer.setView(camera);
renderer.render();
map.render();
batchRenderer.begin();
AssetLoader.font.getData().setScale(8);
AssetLoader.font.draw(batchRenderer, map.getSelectedTile().getName(), -400, 1500);
batchRenderer.end();
}
public void resize(int width, int height){
viewport.update(width, height);
renderer = new IsometricTiledMapRenderer(map.getTiledMap(), MapUtils.unitScale(map));
batchRenderer.setProjectionMatrix(camera.combined);
centerCamera(map);
}
private void centerCamera(GameMap map){
camera.position.set(MapUtils.getMapCenter(map));
}
我几乎可以肯定它能够与我拥有的东西一起工作,但似乎我错过了一些非常简单的东西。在开始实现真正的游戏玩法之前,拥有坚实的基础和功能坐标系统可能是一个好主意。