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

时间:2015-09-26 20:22:13

标签: java android libgdx instances

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

这是我的代码:

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);
    }
}

2 个答案:

答案 0 :(得分:2)

private static double x;
private static double y;

这是你的问题。 static个字段对于给定类的所有实例都是通用的。因此,您的所有Ground对象共享 xy变量。解决方案:只需从staticGround类中的字段中删除GroundTop修饰符

答案 1 :(得分:1)

我想说这与Java和libGDX本身有关。

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

要详细了解请查看此link