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

基于JSFML的Java 2D游戏库异常:玩家移动时所有游戏对象同步移动

问题根源与解决方案

核心问题

你的所有游戏对象同步移动的根本原因,几乎可以肯定是GameObject抽象类中的position、velocity等属性被声明为static(静态)成员了。

静态属性属于类本身而非类的实例——这意味着所有继承自GameObject的对象(Player、Floor、其他自定义对象)都会共享同一组position、velocity值。当你的Player类通过this.velocity.x = speed修改速度时,实际上是修改了整个GameObject类的静态velocity属性,所有对象在TickUpdate中都会使用这个共享的velocity来更新自己的position,自然就会同步移动了。

解决方案

  1. 打开你的GameObject抽象类定义,找到position、velocity、size、name这些属性,去掉它们的static关键字,把它们改成普通的实例成员变量:
    // 错误写法(静态属性,所有实例共享)
    public static Vector2 position;
    public static Vector2 velocity;
    
    // 正确写法(实例属性,每个对象独立拥有)
    public Vector2 position;
    public Vector2 velocity;
    
  2. 确保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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:02:37