Java LibGDX 如何实现点击指定坐标时切换.tmx格式瓦片地图
带
setMap方法的地图渲染器说明 之前你看到的旧回答没说全类名,这个带内置setMap(TiledMap map)方法的渲染器就是libGDX官方提供的OrthogonalTiledMapRenderer,正交视角的2D项目直接用这个就行,斜视角项目替换成IsometricTiledMapRenderer即可,完全不需要自己写自定义类封装这个方法。
完整实现步骤
1. 资源与渲染器实例化
- 在项目的全局游戏类里声明对应的成员变量
- 在
create()生命周期方法里完成资源加载、渲染器初始化
示例代码:// 全局变量 private OrthogonalTiledMapRenderer mapRenderer; private TiledMap firstMap; private TiledMap secondMap; private OrthographicCamera gameCam; @Override public void create() { // 初始化游戏相机,视口尺寸按自己项目的实际分辨率调整 gameCam = new OrthographicCamera(800, 480); // 加载两张tmx地图资源 firstMap = new TmxMapLoader().load("maps/first.tmx"); secondMap = new TmxMapLoader().load("maps/second.tmx"); // 实例化渲染器,初始绑定firstMap,第二个参数是渲染缩放比,按你的图素尺寸调整(比如32像素的图块就设1/32f) mapRenderer = new OrthogonalTiledMapRenderer(firstMap, 1/32f); }
2. 点击触发切图逻辑
- 不能直接把屏幕点击坐标和世界地图坐标硬比对,必须先把屏幕点击坐标转换为和地图一致的世界坐标系坐标,否则相机移动、缩放后会出现点击位置偏移的问题
- 命中预设的特定触发坐标范围时,调用渲染器的
setMap()方法完成切换
示例代码:@Override public void render() { // 每帧先清屏 Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // 更新相机状态 gameCam.update(); // 处理单次点击事件 if (Gdx.input.justTouched()) { // 屏幕坐标转世界坐标(libGDX默认屏幕Y轴从上到下,需要做翻转处理) float touchWorldX = Gdx.input.getX() + gameCam.position.x - gameCam.viewportWidth/2f; float touchWorldY = (gameCam.viewportHeight/2f - gameCam.position.y) - Gdx.input.getY(); // 判定是否命中你预设的特定触发点/区域(这里的坐标值替换成你项目里的实际触发位置) boolean isTriggerHit = touchWorldX > 100 && touchWorldX < 150 && touchWorldY > 200 && touchWorldY < 250; // 命中触发点时执行切图,注意加判断避免重复绑定相同地图 if (isTriggerHit && mapRenderer.getMap() != secondMap) { mapRenderer.setMap(secondMap); // 切图后如果需要重置相机到新地图的出生位置,在这里修改gameCam的坐标即可 // gameCam.position.set(0, 0, 0); } } // 每帧把相机设置给渲染器,渲染当前绑定的地图 mapRenderer.setView(gameCam); mapRenderer.render(); }
常见踩坑提醒
- 不要为了实现
setMap方法自己重写渲染器类,官方提供的渲染器已经内置了这个方法,直接实例化即可调用 - 切地图时注意同步切换对应地图的碰撞规则、物体层引用,不要只换了渲染画面,后台逻辑还停留在旧地图
- 游戏退出时记得在
dispose()方法里依次释放渲染器、两张地图的资源,避免内存泄漏
内容的提问来源于stack exchange,提问作者user21597761
相关产品推荐
相关产品推荐

