簡體   English   中英

LibGDX:如何在帶有和不帶有縮放的圖塊的圖塊地圖中獲取相同的坐標

[英]LibGDX: How to get the same coordinates in tiled map for tile with and without zoom

我是LibGDX的初學者。 我正在嘗試基於固定大小的平鋪地圖(33x21平鋪)創建一個Android游戲。 我正在使用的圖塊是32x32px。 到目前為止,我設法加載了Tiled創建的地圖,並添加了諸如放大/縮小和平移之類的觸摸手勢。 游戲角色的移動將逐個回合進行,因此我需要選擇特定的回合以執行一些動作。 我從這里嘗試了解決方案: LibGDX:如何使平鋪的地圖圖塊可點擊? 並且效果很好,直到沒有放大屏幕為止。

如果沒有縮放,則左下角坐標顯示為(0,0),這是正確的。 當我放大時,地圖可見部分的左下角而不是保持正確的坐標(即(480,320)),而是再次變為(0,0)。 我嘗試使用camera.unproject(Vector3),但未成功。 可能用錯了。 我也沒有真正確信,我嘗試獲取瓷磚的方法是最合適的方法。 您能幫我正確地獲得瓷磚坐標嗎? 下面是我正在使用的代碼:

public class TiledTest extends ApplicationAdapter  {

public TiledMap tiledMap;
OrthographicCamera camera;
TiledMapRenderer tiledMapRenderer;

GestureDetector gesture;
InputMultiplexer myInputMultiplexer;

float w = Gdx.graphics.getWidth();
float h = Gdx.graphics.getHeight();

public static final float PAN_RATE = (float) 0.01;
private static final float ZOOM_SPEED = (float) 0.009;
int columns, rows;
TiledMapTileLayer grid_layer;

@Override
public void create () {

    gesture =new GestureDetector(new MyGestureListener());
    myInputMultiplexer = new InputMultiplexer();
    float unitScale = 1 / 32f;


    camera = new OrthographicCamera();
    camera.setToOrtho(true, 33,21);

    tiledMap = new TmxMapLoader().load("tiled_map.tmx");
    tiledMapRenderer = new OrthogonalTiledMapRenderer(tiledMap, unitScale);
    grid_layer = (TiledMapTileLayer)tiledMap.getLayers().get(0);
    Stage stage = new TiledMapStage(tiledMap);
    myInputMultiplexer.addProcessor(gesture);
    myInputMultiplexer.addProcessor(stage);
    Gdx.input.setInputProcessor(myInputMultiplexer);
}

@Override
public void render () {

    tiledMapRenderer.setView(camera);
    tiledMapRenderer.render();
    camera.update();
}

public class TiledMapActor extends Actor {

    private TiledMapTileLayer.Cell cell;

    public TiledMapActor(TiledMap tileMap, TiledMapTileLayer tiledLayer, TiledMapTileLayer.Cell cell) {
        tiledMap = tileMap;
        grid_layer = tiledLayer;
        this.cell = cell;
    }

}

public class TiledMapClickListener extends ClickListener {

    private TiledMapActor actor;

    public TiledMapClickListener(TiledMapActor actor) {
        this.actor = actor;
    }

    @Override
    public void clicked(InputEvent event, float x, float y) {

    int a = (int) actor.getX();
        int b = (int) actor.getY();

        System.out.println(actor.cell + " has been clicked.");
        System.out.println("x =  " + a +  "y = " + b );
        }
}

public class TiledMapStage extends Stage {

    private TiledMap tiledMap;

    public TiledMapStage(TiledMap tiledMap) {
        this.tiledMap = tiledMap;

        for (MapLayer layer : tiledMap.getLayers()) {

            TiledMapTileLayer tiledLayer = (TiledMapTileLayer)layer;
            createActorsForLayer(tiledLayer);
        }
    }

    private void createActorsForLayer(TiledMapTileLayer tiledLayer) {
        for (int x = 0; x <= tiledLayer.getWidth(); x++) {
            for (int y = 0; y < tiledLayer.getHeight(); y++) {
                TiledMapTileLayer.Cell cell = tiledLayer.getCell(x, y);
                TiledMapActor actor = new TiledMapActor(tiledMap, tiledLayer, cell);
                actor.setBounds(x * tiledLayer.getTileWidth(), y * tiledLayer.getTileHeight(), tiledLayer.getTileWidth(),
                        tiledLayer.getTileHeight());
                addActor(actor);
                EventListener eventListener = new TiledMapClickListener(actor);
                actor.addListener(eventListener);
            }
        }
    }
}

public void resize(float width, float height) {

}

public class MyGestureListener implements GestureListener{

    @Override
    public boolean touchDown(float x, float y, int pointer, int button) {
        return false;
    }

    @Override
    public boolean tap(float x, float y, int count, int button) {
        return false;
    }

    @Override
    public boolean longPress(float x, float y) {
        return false;
    }

    @Override
    public boolean fling(float velocityX, float velocityY, int button) {
        return false;
    }

    @Override
    public boolean pan(float x, float y, float deltaX, float deltaY) {

        float effectiveViewportWidth = camera.viewportWidth * camera.zoom;
        float effectiveViewportHeight = camera.viewportHeight * camera.zoom;

        camera.position.x = MathUtils.clamp(camera.position.x, effectiveViewportWidth / 2f, 33 - effectiveViewportWidth / 2f);
        camera.position.y = MathUtils.clamp(camera.position.y, effectiveViewportHeight / 2f, 21 - effectiveViewportHeight / 2f);
        if (camera.zoom < 1) {

             camera.translate(-deltaX * PAN_RATE, -deltaY * PAN_RATE,   0);
             camera.update();
        } 
        return false;
    }

    @Override
    public boolean panStop(float x, float y, int pointer, int button) {
        //Gdx.app.log("Text", "panstop");
        return false;
    }


    @Override
    public boolean zoom (float originalDistance, float currentDistance){

         float ratio = originalDistance/currentDistance;

         camera.zoom += ZOOM_SPEED * ratio;

        if (camera.zoom < 0.3)
         {
            camera.zoom = (float) 0.3;
         }
         else if (camera.zoom > 1)
         {
            camera.zoom = 1;
         }
         System.out.println(camera.zoom);
    return false;
}

    @Override
    public boolean pinch (Vector2 initialFirstPointer, Vector2 initialSecondPointer, Vector2 firstPointer, Vector2 secondPointer){
         camera.zoom -= .01;
         camera.update();
       return false;
    }

}

}

因此,您想將屏幕坐標轉換為世界坐標。
例如:

@Override
public void clicked(InputEvent event, float x, float y) {

    Vector3 touch = new Vector3(x, y, 0);
    camera.unproject(touch);

    System.out.println("Screen coordinates translated to world coordinates: "
        + "X: " + touch.x + " Y: " + touch.y);

    }
}

上面單擊的功能不適用於我,但是您使我找到了答案。 我將整個分配角色丟棄為圖塊,並在touchDown的MyGestureListener中使用了camera.unproject。

如果有人感興趣,我就把它留在這里:)

@Override
    public boolean touchDown(float x, float y, int pointer, int button) {

         Vector3 temp_coord = new Vector3(x,y,0);
         Vector3  coords = camera.unproject(temp_coord);

            x =(int) coords.x;
            y =(int) coords.y;

            writerX = x;
            writerY = y;

            System.out.println("Screen coordinates translated to world coordinates: "
                    + "X: " + x + " Y: " + y);

        return false;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM