You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:07:16