【问题标题】:Why are instances overwriting each other in LibGDX?为什么实例在 LibGDX 中会相互覆盖?
【发布时间】:2015-09-26 20:22:12
【问题描述】:

所以我有了这个用 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);
    }
}

【问题讨论】:

  • thetimetraveller,现在我对这款游戏很好奇。 :)
  • 哈哈,那好吧。所以,长话短说,玩家找到了一台时间机器,使用它,不小心洒了一些饮料在上面。然后他/她必须经过许多时区才能回家。我计划这样做,以便用户可以选择在特定时间及时去哪里。很高兴看到你感兴趣:D
  • 酷!祝你好运,我迫不及待想玩!

标签: java android libgdx instances


【解决方案1】:
private static double x;
private static double y;

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

【讨论】:

  • 哦,哈哈。是的,它有效。伙计,我觉得自己很愚蠢。谢谢!
【解决方案2】:

我会说这与 Java 的关系比与 libGDX 本身更相关。

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

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

【讨论】:

  • 真的,感谢您的回答!不过,这个问题现在已经解决了。
猜你喜欢
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 2017-08-02
  • 2021-03-11
  • 2012-09-27
  • 1970-01-01
相关资源
最近更新 更多