Java 为什么实例在LibGDX中相互覆盖?

Java 为什么实例在LibGDX中相互覆盖?,java,android,libgdx,instances,Java,Android,Libgdx,Instances,所以我用LibGDX做了一个游戏。我有一个GroundTop和Ground类,它在屏幕上绘制Ground和Ground top(在资产类中加载图像),并最终将应用与播放器的碰撞(这是一个platformer)。我试图让它做的是绘制4个不同的地面实例和2个不同的地面实例,用于测试。但是,每个都只有一个。看起来每个实例都覆盖了另一个实例,因为只有显示的实例具有代码中创建的最后一个实例的坐标。为什么会出现这种情况?我如何使其显示每个实例?类中是否存在使每个实例覆盖另一个实例的情况?我完全不明白这一点。

所以我用LibGDX做了一个游戏。我有一个GroundTop和Ground类,它在屏幕上绘制Ground和Ground top(在资产类中加载图像),并最终将应用与播放器的碰撞(这是一个platformer)。我试图让它做的是绘制4个不同的地面实例和2个不同的地面实例,用于测试。但是,每个都只有一个。看起来每个实例都覆盖了另一个实例,因为只有显示的实例具有代码中创建的最后一个实例的坐标。为什么会出现这种情况?我如何使其显示每个实例?类中是否存在使每个实例覆盖另一个实例的情况?我完全不明白这一点。提前感谢,请提出任何问题,以帮助澄清我的问题并帮助我找到解决方案:)

这是我的密码:

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);
    }
}
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);
    }
}
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);
    }
}
GroundTop.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);
    }
}
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);
    }
}
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);
    }
}
这是你的问题<代码>静态字段对于给定类的所有实例都是通用的。因此,您的所有
Ground
对象共享
x
y
变量。解决方案:只需从
Ground
GroundTop
类的字段中删除
static
modifier即可


这是你的问题<代码>静态字段对于给定类的所有实例都是通用的。因此,您的所有
Ground
对象共享
x
y
变量。解决方案:只需从
Ground
GroundTop
类的字段中删除
static
modifier

我认为这与Java的关系比与libGDX本身的关系更大

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


要了解更多信息,请检查此项。

我想说,这与Java的关系比与libGDX本身的关系更密切

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


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

哦,哈哈。是的,很管用。伙计,我觉得自己很笨。谢谢哦,哈哈。是的,很管用。伙计,我觉得自己很笨。谢谢我的旅行者,现在我对这个游戏很好奇哈哈,那好吧。所以,长话短说,玩家找到一台时间机器,使用它,不小心洒了一些饮料在上面。然后他/她必须穿越许多时区才能回家。我计划这样做,用户可以选择在特定时间去哪里。很高兴看到您感兴趣:DCool!祝你好运,我等不及要玩了!我的旅行者,现在我对这个游戏很好奇哈哈,那好吧。所以,长话短说,玩家找到一台时间机器,使用它,不小心洒了一些饮料在上面。然后他/她必须穿越许多时区才能回家。我计划这样做,用户可以选择在特定时间去哪里。很高兴看到您感兴趣:DCool!祝你好运,我等不及要玩了!是的,谢谢你的回答!不过,这个问题现在已经解决了。是的,谢谢您的回答!然而,这个问题现在已经解决了。