LibGdx:非玩家实体精灵随摄像机移动的问题求助
LibGDX敌人随摄像机移动的问题解决方案
嘿,我一眼就看出问题出在哪了——你把cam.unproject()的用法搞反啦!这才导致敌人跟着摄像机乱跑,而不是固定在游戏世界里。
先给你看看问题的直观表现:
- 初始游戏状态:

- 玩家右移后摄像机移动,敌人跟着偏移:

核心问题解析
cam.unproject()的作用是把屏幕坐标(比如触摸点位置)转换成游戏世界坐标,但你一开始生成的x和y已经是基于游戏世界的坐标(参考了地图尺寸),反而调用这个方法会把世界坐标转成屏幕相对坐标——这就相当于把敌人“钉”在了屏幕上,摄像机一动,敌人自然就跟着屏幕走了。
修正后的初始化代码
直接删掉多余的unproject()调用,用你原本生成的世界坐标初始化敌人就行:
Texture zombie = new Texture("zombie.png"); float x, y; for (int i = 0; i < enemy_amout; i++) { // 这里生成的x,y已经是游戏世界中的有效坐标 x = rm.nextFloat() * (mapWidth * 8f - zombie.getWidth()); y = rm.nextFloat() * (mapHeight * 8f - zombie.getHeight()); // 直接用世界坐标创建实体,不需要做坐标转换 enemies[i] = new Entity(zombie, x, y, 1); }
额外要确认的渲染步骤
确保你渲染所有实体(玩家+敌人)时,SpriteBatch正确使用了摄像机的投影矩阵,不然还是可能出现坐标错乱:
// 渲染前先设置投影矩阵为摄像机的combined矩阵 batch.setProjectionMatrix(cam.combined); batch.begin(); // 在这里渲染玩家、所有敌人等游戏元素 batch.end();
什么时候该用cam.unproject()?
只有当你需要把屏幕上的点(比如玩家触摸的位置)转换成游戏世界里的位置时才用,比如:
// 获取触摸点的屏幕坐标 Vector3 touchPos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0); // 转换成游戏世界坐标 cam.unproject(touchPos); // 现在touchPos.x和touchPos.y就是触摸点对应的世界位置了
内容的提问来源于stack exchange,提问作者Grual
相关产品推荐
相关产品推荐

