2015-09-26 66 views
0

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

这里是我的代码:

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

thetimetraveller,现在我对游戏很好奇。 :) – Daniele

+1

哈哈,那么好吧。所以,长话短说,玩家找到一个时间机器,使用它,并不小心将一些饮料洒在它上面。然后他/她必须经过很多时区才能回家。我打算这样做,以便用户可以在特定时间选择及时去哪里。很高兴看到你有兴趣:D –

+0

酷!祝你好运,我迫不及待地想玩! – Daniele

回答

2
private static double x; 
private static double y; 

这是你的问题。对于给定类的所有实例,static字段是常见的。所以你的所有Ground对象分享xy变量。解决方案:只需删除和GroundTop类别中的static修改器类别

+0

哦,哈哈。是的,它的工作原理。男人,我觉得非常愚蠢。谢谢! –

1

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

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

要了解有关检查此link的更多信息。

+0

不错,谢谢你的回答!但是现在这个问题已经解决了。 –