libGDX中for循环无法正确更新Sprite位置问题排查
问题根源与解决方案
核心问题1:绘制代码直接覆盖位置设置
你在绘制循环里的这段代码是所有Sprite位置相同的直接原因:
for (int i = 0; i < usableList.size(); i++) { usableList.get(i).draw(batch); usableList.get(i).setPosition(playerSprite.getX() - 1200, playerSprite.getY() + 300); usableList.get(i).setSize(60,60); }
不管循环索引i是多少,所有Sprite都会被强制设置成同一个固定位置,完全抵消了UpdateShopPosition方法里的计算结果。
核心问题2:位置计算逻辑冗余易出错
UpdateShopPosition里用大量else if判断行的方式过于繁琐,不仅容易出现计算偏差,也不利于后期维护。而你提到的“持续向右下方移动”,如果玩家本身在朝右下方向移动,那基于玩家位置计算Sprite位置是正常逻辑;如果是无意义的异常移动,大概率是当前计算逻辑的累加错误导致的。
修复步骤
1. 清理绘制循环中的冗余设置
绘制循环只保留绘制操作,把位置和大小设置移到UpdateShopPosition方法中:
for (int i = 0; i < usableList.size(); i++) { usableList.get(i).draw(batch); }
2. 重构位置计算逻辑
改用行列索引计算,逻辑更清晰,避免冗余判断:
public static void UpdateShopPosition(List<Sprite> spriteList){ float spacingX = 103; // 列间距,对应你原来的100+3偏移规则 float spacingY = 101; // 行间距,对应你原来每行减101的规则 float startX = playerSprite.getX() + 400; // 相对于玩家的起始X偏移 float startY = playerSprite.getY() + 410; // 相对于玩家的起始Y偏移 for (int i = 0; i < spriteList.size(); i++) { int col = i % rowsX; // 计算当前Sprite的列索引(0~3) int row = i / rowsX; // 计算当前Sprite的行索引(0,1,2...) float myX = startX + col * spacingX; float myY = startY - row * spacingY; // 向上排列,所以用减法 Sprite sprite = spriteList.get(i); sprite.setPosition(myX, myY); sprite.setSize(60,60); // 统一在这里设置大小 } }
3. 修正CreateUsable方法的错误
你当前的代码会让所有物品都使用第一个Sprite的图片,改成绑定当前添加的Sprite:
public static void CreateUsable(Usables name, Sprite sprite){ GameApp.shopList.add(sprite); name.setImage(sprite); // 使用当前添加的Sprite,而非固定取第一个 }
关于render()中调用方法的问题
把UpdateShopPosition放在render()里是合理的——要实现“物品相对玩家固定位置”的需求,必须每次渲染时基于玩家的最新位置重新计算Sprite坐标,这样才能保证玩家移动时物品始终保持相对位置不变。之前的异常问题并非因为放在render()里,而是绘制代码的覆盖和计算逻辑的缺陷导致的。
内容的提问来源于stack exchange,提问作者Dawid Kaim
相关产品推荐
相关产品推荐

