为什么 LibGDX 中的实例会相互覆盖?

Why are instances overwriting each other in LibGDX?

所以我用 LibGDX 制作了这款游戏。我有一个 GroundTop 和 Ground class 可以在屏幕上绘制地面和地面顶部(在资产 class 中加载图像),并最终应用与玩家的碰撞(这是一个平台游戏)。我试图让它做的是绘制 4 个不同的 Ground 实例和 2 个不同的 GroundTop 实例,用于测试。但是,每个只有一个。看起来每个实例都会覆盖另一个实例,因为唯一出现的实例具有代码中最后创建的实例的坐标。这是为什么,我怎样才能显示每个实例?在 classes 中有没有什么东西可以让每个实例覆盖另一个实例?我对此完全迷失了。提前致谢,请提出任何问题以帮助澄清我的问题并帮助我找到解决方案:)

这是我的代码:

Game.java

package com.mygdx.thetimetraveller;

import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.utils.Array;

public class Game implements Screen {
    public static int frameCount;

    Array<Ground> groundList = new Array<Ground>();
    Ground[] grounds = new Ground[1000];

    GroundTop groundTop;
    GroundTop groundTop2;

    Game() {
        load();
    }

    @Override
    public void load() {
        groundList.add(new Ground(50, 50));
        groundList.add(new Ground(250, 250));
        grounds[0] = new Ground(500, 500);
        grounds[1] = new Ground(650, 650);
        groundTop = new GroundTop(500, 20);
        groundTop2 = new GroundTop(500, 200);
        frameCount = 0;
    }

    @Override
    public void display(SpriteBatch batch) {
        frameCount ++;

        groundList.get(0).Draw(batch);
        groundList.get(1).Draw(batch);

        grounds[0].Draw(batch);
        grounds[1].Draw(batch);

        groundTop.Draw(batch);
        groundTop2.Draw(batch);
    }
}

Ground.java

package com.mygdx.thetimetraveller;

import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class Ground {
    private static double x;
    private static double y;

    Ground(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public void Draw(SpriteBatch batch) {
        batch.draw(Assets.simpleBlockTexture01_sprite, (float) x, (float) y);
    }
}

GroundTop.java

package com.mygdx.thetimetraveller;

import com.badlogic.gdx.graphics.g2d.SpriteBatch;

public class GroundTop {
    private static double x;
    private static double y;

    GroundTop(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public void Draw(SpriteBatch batch) {
        batch.draw(Assets.simpleBlockTextureTop01_sprite, (float) x, (float) y);
    }
}
private static double x;
private static double y;

这是你的问题。 static 字段对于给定 class 的所有实例都是通用的。所以你的所有 Ground 对象 share xy 变量。解决方案:只需从 GroundGroundTop classes

中的字段中删除 static 修饰符

我会说这与 Java 相关,而不是 libGDX 本身。

有时在 Java 中,您希望拥有所有对象共有的变量。这是通过 static 修饰符完成的。在其声明中具有静态修饰符的字段称为静态字段或 class 变量。它们与 class 相关联,而不是与任何对象相关联。 class 的每个实例共享一个 class 变量,该变量位于内存中的一个固定位置。任何对象都可以更改 class 变量的值,但是 class 变量也可以在不创建 class.

实例的情况下进行操作

要了解更多信息,请查看此 link