libGDX中TiledMap怪物创建与位置设置问题(Java)
解决TiledMap中怪物固定位置的问题
嘿,我来帮你搞定这个怪物卡屏幕左下角的问题!核心原因很明确:你之前用相机坐标创建角色,现在怪物需要绑定地图世界坐标,而不是屏幕/相机的相对坐标,咱们一步步来改:
1. 把怪物的初始位置换成地图世界坐标
你之前给Knight用的是相机相关的坐标,但怪物得用地图上的绝对位置——比如你在TiledMap对象层标记的怪物位置是(300, 400)(地图像素坐标),那怪物的初始位置就直接设这个值,别再跟相机位置挂钩。
比如你的Monster子类(继承Person)可以这么写:
public class Monster extends Person { // 传入地图上的世界坐标,而不是相机坐标 public Monster(String pathToFile, Vector2 mapWorldPosition) { super(pathToFile, mapWorldPosition); } }
2. 渲染时用相机矩阵转换坐标
怪物的位置是世界坐标,但渲染时要通过相机的投影矩阵转换成屏幕可见的坐标,这样相机移动时,怪物才会固定在地图上的对应位置。假设你用的是LibGDX(看你提的Vector2和TiledMap大概率是),渲染代码要改成这样:
// 在你的渲染方法里 batch.setProjectionMatrix(camera.combined); // 把批次的投影矩阵设为相机的组合矩阵 batch.begin(); // 直接用怪物的世界坐标设置Sprite位置 monster.getSprite().setPosition(monster.getPosition().x, monster.getPosition().y); monster.getSprite().draw(batch); batch.end();
之前你可能直接用了屏幕坐标来渲染,导致怪物跟着相机原点(左下角)走,现在用相机矩阵转换后,世界坐标会自动适配屏幕显示。
3. 调整Person类的位置逻辑
你的Person抽象类要确保存储的是世界坐标,别在实体类里掺和相机的事儿,把坐标转换交给渲染层处理。比如补全你的Person类:
public abstract class Person implements Stats { protected Vector2 worldPosition; // 明确是世界坐标 protected Sprite sprite; public Person(String pathToFile, Vector2 initialWorldPosition) { this.worldPosition = initialWorldPosition; this.sprite = new Sprite(new Texture(pathToFile)); sprite.setPosition(worldPosition.x, worldPosition.y); } // 对外提供获取世界坐标的方法 public Vector2 getPosition() { return worldPosition; } public Sprite getSprite() { return sprite; } }
别在Person类里写任何和相机相关的计算,保持实体类的纯粹性,只负责存储自身的世界位置。
4. 排查TiledMap坐标读取是否正确
如果你是从TiledMap的对象层读取怪物位置,注意Tiled的坐标原点是左下角,和LibGDX默认一致,直接用读取到的x、y值就行,别做多余的翻转,不然也会导致怪物位置偏移到角落。
这样改完之后,怪物就会固定在你在TiledMap里标记的位置,玩家移动相机时,怪物会在屏幕上正确的位置显示,不会再钉在左下角啦!
内容的提问来源于stack exchange,提问作者RobJan
相关产品推荐
相关产品推荐

