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

2024-03-28

如何为平铺地图中的图块添加点击侦听器,以便当您用鼠标选择图块时它会突出显示?


libGDX 不直接支持这一点,因为 TiledMap 内容仅用于渲染。

您可以轻松创建一个Stage不过,它将充当 TiledMap 的某种覆盖输入层。只需创建一个Actor对于与该图块具有相同大小的位置的每个图块。然后你就可以添加EventListener这些演员能够识别诸如点击这些演员之类的事情。

这些演员应该提及他们的“起源”,即TiledMapTileLayer.Cell。因此,在处理这些事件时,您可以随时从参与者返回到单元格。

下面显示了您可以如何执行此操作:

该 Actor 负责捕获事件并保留有关其所基于的图块的信息:

public class TiledMapActor extends Actor {

    private TiledMap tiledMap;

    private TiledMapTileLayer tiledLayer;

    private TiledMapTileLayer.Cell cell;

    public TiledMapActor(TiledMap tiledMap, TiledMapTileLayer tiledLayer, TiledMapTileLayer.Cell cell) {
        this.tiledMap = tiledMap;
        this.tiledLayer = 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) {
        System.out.println(actor.cell + " has been clicked.");
    }
}

下面的类实际上从给定的地图创建参与者并将它们连接到侦听器:

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);
            }
        }
    }
}

Now the TiledMapStage将为您做所有工作。您需要做的就是以下操作:

Stage stage = new TiledMapStage(tiledMap);
Gdx.input.setInputProcessor(stage);

在 render(...) 中你需要调用stage.act()。记得用同样的Viewport用于渲染 TiledMap 的舞台。否则输入和渲染的地图将不会对齐。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LibGDX:如何使平铺地图图块可点击? 的相关文章

随机推荐

  • 为什么 IE11 在 ajax 请求的请求标头中发送“pragma: no-cache”?

    我正在 IE11 上测试我的网页 我正在进行一些 ajax 调用并将响应标头设置为 Cache Control private max age 21600 虽然每次发出请求时 IE11都会设置Pragma no cache请求标头 导致请求
  • 为什么 Jersey/JAX-RS 客户端无法处理泛型?

    我有一个 Jersey JAX RS 客户端 它使用 RESTful API JSON 该 API 应该返回我的 POJO 列表 Hits GET localhost 8080 myapp fizz widget widget id Ove
  • 我可以在没有自己的后端服务器的情况下在 React 中实现 Stripe checkout 吗?

    我在 Netlify 上部署了一个 React 前端 我想实现一个简单的支付系统 用户可以输入他们想要的金额并使用 Stripe 结帐甚至 PayPal 进行支付 我想知道这是否可以在不支付单独后端费用的情况下实现 或者您可以建议其他任何自
  • 如何使用 jquery 追加整个 html 文件

    我有一个像这样的html文件 some content some content 我的问题是如何使用 jquery 加载这个文件作为一个整体 我尝试过 我搜索了很长一段时间的解决方案 但只找到了很多方法来附加html文件的某些部分 例如元
  • Android 通用 AsyncTask 类

    我看过这个答案 由于 AsyncTask 是一个单独的类 如何将 OnPostExecute 的结果获取到主活动 https stackoverflow com questions 12575068 how to get the resul
  • AngularJS ng-repeat 通过复杂和动态的 JSON 数组

    我正在尝试使用 JSON 数组向用户显示内容ng repeat选项 这JSON Array是动态创建的 所以我有点困惑如何向用户显示相同的内容 的语法JSON ARRAY内容如下COMPLEX key可以动态增加或减少 jsonList n
  • ASP.Net core-从中间件获取routetemplate值

    我有一个中间件 每次对我的 API 发出请求时都会调用该中间件 我想记录路由模板以及来自该中间件的请求的持续时间 如何在我的中间件代码中获取路由模板 路由模板类似于 products productId 这是我如何让它发挥作用的 我在过滤器
  • 如何使用 Python 和 Django 创建 SaaS 应用程序

    您能给我一些建议 让您可以使用 Python 和 Django 创建 SaaS 软件即服务 应用程序吗 目前我不明白的一般主题是 您是否为所有客户提供一个可用的应用程序 或者为每个客户提供一个应用程序 如何管理每个客户端的数据库访问 权限或
  • 原生原型与 $.extension()

    在工作中 我们使用 jQuery 在我们开始使用它后不久 我看到几个开发人员正在向文件 jquery extensions js 添加函数 在里面 我发现添加了一大堆方法 这本质上相当于 jQuery 上的静态方法 这里有一些 format
  • Apache 目录 LDAP - 分页搜索

    我一直在寻找使用 Apache Directory API 执行分页搜索的信息 但我没有找到任何示例或任何有关如何使用正确的 PagedResults 控件构建 SearchRequest 然后执行搜索的信息 你们有什么建议吗 或者知道哪里
  • TextToSpeech 改变声音

    我希望能够更改文本转语音 API 中的语音 例如更改 声音由女声转为男声 让声音更清晰 改变语速 请有人让我知道这是否可能 谢谢 您可以通过以下方式为特定字符串提供自己的转换addSpeech 不过 AFAICT 没有文档说明如何替换自己的
  • 如何构建这个项目? (jpeg 库)

    Edit 我现在正在使用http code google com p jpeg compressor http code google com p jpeg compressor 所以我不再关心让这个工作了 我下载了http ijg org
  • 从日语 IME 获取更多数据

    在我的 C 表单中 我有一个数据网格视图 我想在其中输入单词或句子的汉字和假名版本 并将它们放在不同的列中 例如 転寝 寝坊 我想要实现的是当我提交第一列时自动填充第二列 我知道有一些词典包含汉字读法 但对于句子来说它会变得复杂 而且还有很
  • 使用 VisualVM 和 JMX 进行远程监控

    我想使用 jvisualvm 或 jconsole 监视远程运行的 java spring boot 应用程序 在本地运行时 我可以在 jvisualvm 和 jconsole 中看到托管 bean 远程运行时我无法连接 我用几个不同的ja
  • 得到一个名为保留字的Oracle表,可能会出现哪些问题?

    我们刚刚外包了一个系统 乍一看我可以看到一些名称为 CASE 或 FROM 的表和字段 它是一个 Oracle 10g DB 我们将使用来自 Java Hibernate C C 的这些数据 有什么特别我们应该注意的吗 对于我在其他帖子中看
  • jQuery:一年中的一周脚本正在运行

    不久前我需要一个脚本来每周更新一些内容 我的问题在这个论坛 https stackoverflow com questions 3701276 jquery update content every week or long period
  • CMS 软件中的空白 index.html 而不是 .htaccess

    我注意到 Joomla Wordpress 和其他 CMS 在其所有子文件夹中都有空白的 index html 文件 以防止人们窥视文件夹结构 我的问题是为什么他们不能禁止使用 htaccess 文件查看文件夹 而不是将空白的 index
  • 多个 goroutine 的 Go 内存消耗

    我试图检查 Go 在 100 000 个 goroutine 上的表现如何 我编写了一个简单的程序来生成许多例程 除了打印一些公告之外什么也不做 我将 MaxStack 大小限制为仅 512 字节 但我注意到程序大小并没有随之减小 它消耗了
  • 从运行脚本阶段获取当前方案名称

    有没有办法从运行脚本阶段获取当前方案 我试过了 SCHEME NAME 但它不存在 我找不到要使用的环境变量 因此我必须开发一种解决方法 将方案名称写入磁盘建立预行动然后将其读回运行脚本 phase 对于您感兴趣的每个方案 请访问编辑方案并
  • LibGDX:如何使平铺地图图块可点击?

    如何为平铺地图中的图块添加点击侦听器 以便当您用鼠标选择图块时它会突出显示 libGDX 不直接支持这一点 因为 TiledMap 内容仅用于渲染 您可以轻松创建一个Stage不过 它将充当 TiledMap 的某种覆盖输入层 只需创建一个