基于JSFML的Java 2D游戏库异常:玩家移动时所有游戏对象同步移动
问题根源与解决方案
核心问题
你的所有游戏对象同步移动的根本原因,几乎可以肯定是GameObject抽象类中的position、velocity等属性被声明为static(静态)成员了。
静态属性属于类本身而非类的实例——这意味着所有继承自GameObject的对象(Player、Floor、其他自定义对象)都会共享同一组position、velocity值。当你的Player类通过this.velocity.x = speed修改速度时,实际上是修改了整个GameObject类的静态velocity属性,所有对象在TickUpdate中都会使用这个共享的velocity来更新自己的position,自然就会同步移动了。
解决方案
- 打开你的
GameObject抽象类定义,找到position、velocity、size、name这些属性,去掉它们的static关键字,把它们改成普通的实例成员变量:// 错误写法(静态属性,所有实例共享) public static Vector2 position; public static Vector2 velocity; // 正确写法(实例属性,每个对象独立拥有) public Vector2 position; public Vector2 velocity; - 确保
GameObject的构造方法正确初始化这些实例属性,而非操作静态属性:public GameObject(String name, Vector2 position, Vector2 size) { this.name = name; this.position = position; this.size = size; this.velocity = new Vector2(0, 0); // 初始化速度为0,避免空指针 // 其他初始化逻辑 }
验证逻辑
修改完成后,当你按下WASD时,只有Player实例的velocity会被修改,Floor实例的velocity会保持初始的(0,0)状态。在Game类的TickUpdate方法中,Floor的position不会因为velocity的变化而移动,只有Player会正常响应输入移动。
你还可以在TickUpdate循环中添加调试输出,直观确认每个对象的属性独立性:
// 在Game类的TickUpdate方法里循环内添加 System.out.println(o.name + " velocity: " + o.velocity.x + ", " + o.velocity.y);
内容的提问来源于stack exchange,提问作者FilipeeX
相关产品推荐
相关产品推荐

