我正在使用 libgdx 创建一个超级马里奥克隆,并且我已经在平铺中创建了一个平铺地图。我之前没有使用过 libgdx,所以我不太确定它是如何工作的,但是当我将图块地图添加到屏幕上时,图块地图非常小,所以我缩放了相机。我编写了一个脚本来获取屏幕坐标,并根据图块坐标检查它们,看看我的鼠标是否悬停在图块上,但轮廓图块向右偏移了一堆并且向上偏移太多。我真的不知道如何从这里开始,其他在线资源也没有帮助。任何想法将不胜感激!
public void create() {
map = new TmxMapLoader().load("1-1.tmx");
camera = new OrthographicCamera();
camera.setToOrtho(false, Gdx.graphics.getWidth() * 2, Gdx.graphics.getHeight() * 2);
camera.position.set(220, 138, 0);
camera.zoom = 0.129f;
renderer = new OrthogonalTiledMapRenderer(map);
private void debugTileUnderMouse(float worldX, float worldY, int tileX, int tileY, int tileWidth, int tileHeight) {
ShapeRenderer shapeRenderer = new ShapeRenderer();
shapeRenderer.setProjectionMatrix(camera.combined);
shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
shapeRenderer.setColor(0, 1, 0, 1);
shapeRenderer.rect(tileX * tileWidth, tileY * tileHeight, tileWidth, tileHeight);
shapeRenderer.setColor(1, 0, 0, 1);
shapeRenderer.circle(worldX, worldY, 5);
shapeRenderer.end();
shapeRenderer.dispose();
}
private void checkTileUnderMouse() {
Vector3 mousePos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
Vector3 worldPos = camera.unproject(mousePos);
int tileWidth = map.getProperties().get("tilewidth", Integer.class);
int tileHeight = map.getProperties().get("tileheight", Integer.class);
int tileX = (int) (worldPos.x / tileWidth);
int tileY = (int) (worldPos.y / tileHeight);
TiledMapTileLayer layer = (TiledMapTileLayer) map.getLayers().get(0);
TiledMapTileLayer.Cell cell = layer.getCell(tileX, tileY);
if (cell != null) {
TiledMapTile tile = cell.getTile();
if (tile != null) {
System.out.println("Mouse is over tile at (" + tileX + ", " + tileY + "), Tile ID: " + tile.getId());
}
}
debugTileUnderMouse(worldPos.x, worldPos.y, tileX, tileY, tileWidth, tileHeight);
}
悬停的图块发生偏移且向右 3
如果还有什么我可以提供帮助,请告诉我
int tileX = (int) (worldPos.x / tileWidth);
一个问题是这种转换会丢失小数信息。如果您的图块宽度为 4,并且未投影的坐标为 6f,则 6f/4 将变为 1 而不是 2(因为 float 1.5 在 int 转换中变为 1)。
所以你需要将tileWidth/2添加到worldPos.x来解决这个问题,即
int tileX = (int) ((worldPos.x+(tileWidth/2)) / tileWidth);
那么与此相关,我想一定存在一些方向问题。就像你的 x=4 一样,但说 x=1 可能是关于 y 轴的。实际上 y=1,但通过上面的修复,y=2,这将是正确的第二个平铺。