LibGDX:如何在带有和不带有缩放的图块的图块地图中获取相同的坐标

迪克·特雷西

我是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);

    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在单张地图上添加具有悬浮效果的正方形图块?

来自分类Dev

带有和不带有-builtin的交互SWIG模块

来自分类Dev

LibGDX:如何使平铺的地图图块可点击?

来自分类Dev

LibGDX:如何使平铺的地图图块可点击?

来自分类Dev

选择带有和不带有分组依据的列

来自分类Dev

如何获取当前可见的图块坐标?

来自分类Dev

带有openlayers的javaFX webview,我将“作为图像”的地图图块从程序屏幕中拖出,而不是拖动地图

来自分类Dev

传递带有和不带有&的函数的指针

来自分类Dev

带有和不带有照明的OpenGL顶点颜色

来自分类Dev

每个带有libgdx和Tiled的动画图块的单独计时器

来自分类Dev

如何从Javascript中的图块地图中的一个点计算图块

来自分类Dev

如何以米为单位获取地图中图块的大小

来自分类Dev

如何在Flutter中的列内使用带有ListView的扩展图块

来自分类Dev

如何在带有HStack的SwiftUI视图中使所有视图具有相同的高度?

来自分类Dev

LibGDX-在图块/图块贴图中的纹理上的文本

来自分类Dev

Spring MVC和图块中的部署失败,未找到带有URI的HTTP请求的映射

来自分类Dev

获取2D地图图块的直角坐标

来自分类Dev

C ++有效地存储图块地图图块

来自分类Dev

如何在中心创建带有简单白色图像的自定义透明图块

来自分类Dev

如何在libgdx中创建带有碰撞和球的随机和无限墙?

来自分类Dev

如何在地图视图中显示带有自定义注释的多个位置

来自分类Dev

不带图块的Mapbox JS地图

来自分类Dev

如何获取我的.TMX地图中某些点的坐标?-LibGDX

来自分类Dev

如何正确使用带有传单的Google Maps静态图块

来自分类Dev

MVC如何在视图中创建图块(?)

来自分类Dev

带有 ggplot2 的图块图 - 同一图块中的两种美学导致图形故障

来自分类Dev

如何使用正确的时间码生成带有视频缩略图的图块

来自分类Dev

获取带有或不带有 URL 斜杠的目录?

来自分类Dev

我如何在颤振中使用 Json 添加带有复选框列表图块的多个展开图块

Related 相关文章

  1. 1

    如何在单张地图上添加具有悬浮效果的正方形图块?

  2. 2

    带有和不带有-builtin的交互SWIG模块

  3. 3

    LibGDX:如何使平铺的地图图块可点击?

  4. 4

    LibGDX:如何使平铺的地图图块可点击?

  5. 5

    选择带有和不带有分组依据的列

  6. 6

    如何获取当前可见的图块坐标?

  7. 7

    带有openlayers的javaFX webview,我将“作为图像”的地图图块从程序屏幕中拖出,而不是拖动地图

  8. 8

    传递带有和不带有&的函数的指针

  9. 9

    带有和不带有照明的OpenGL顶点颜色

  10. 10

    每个带有libgdx和Tiled的动画图块的单独计时器

  11. 11

    如何从Javascript中的图块地图中的一个点计算图块

  12. 12

    如何以米为单位获取地图中图块的大小

  13. 13

    如何在Flutter中的列内使用带有ListView的扩展图块

  14. 14

    如何在带有HStack的SwiftUI视图中使所有视图具有相同的高度?

  15. 15

    LibGDX-在图块/图块贴图中的纹理上的文本

  16. 16

    Spring MVC和图块中的部署失败,未找到带有URI的HTTP请求的映射

  17. 17

    获取2D地图图块的直角坐标

  18. 18

    C ++有效地存储图块地图图块

  19. 19

    如何在中心创建带有简单白色图像的自定义透明图块

  20. 20

    如何在libgdx中创建带有碰撞和球的随机和无限墙?

  21. 21

    如何在地图视图中显示带有自定义注释的多个位置

  22. 22

    不带图块的Mapbox JS地图

  23. 23

    如何获取我的.TMX地图中某些点的坐标?-LibGDX

  24. 24

    如何正确使用带有传单的Google Maps静态图块

  25. 25

    MVC如何在视图中创建图块(?)

  26. 26

    带有 ggplot2 的图块图 - 同一图块中的两种美学导致图形故障

  27. 27

    如何使用正确的时间码生成带有视频缩略图的图块

  28. 28

    获取带有或不带有 URL 斜杠的目录?

  29. 29

    我如何在颤振中使用 Json 添加带有复选框列表图块的多个展开图块

热门标签

归档