2017-04-22 66 views
0

表格存在问题并更新标签!这里是困境,我在游戏中有一个销售按钮,每当他们出售物品时都更新玩家的硬币,那部分工作正常。我遇到的问题是尝试在屏幕上更新硬币值,并在此单独菜单中进行更新(请参阅附图中的左图硬币)。问题在于,硬币价值在另一个阶级的另一个阶段。这是因为当我点击底部的不同按钮时,我会在中间弹出不同的表格。我曾尝试使用辅助方法来进入和清除表格并更新它,然后将我发回到此项目页面,但它不起作用,我可以发布任何需要的代码,但这更多的是关于如何更新标签的一般问题在一个舞台的桌子里。Libgdx更新表格中的标签

Game Picture

更新:所以要有点总结一下我的问题,我有一个屏幕,我必须有它的三个表底部的表的左上角和右上角。然后,当他们按下库存或商店按钮等时,我将表格添加到中间的舞台上。我期望做的是保持项目页面打开,只需更新Coin标签的值,我知道我可以更改文本使用.setText();我只是不知道我怎么能更新屏幕等的部分..

更新2:如果我只是将屏幕回到这个屏幕的新屏幕将更新硬币的价值,但我就不是上该项目页面不再理想。

更新3:感谢您的帮助迄今家伙,@约翰你的答案是超级有帮助以及。我仍然没有得到这个工作,虽然这是一些标签正在处理的代码。

playerCoinLabel = new Label(playerSave.getCoinsString(),skin,"defaultMiddle"); 

这是它被添加到表格中的位置。

tableLeft = new Table(skin); 
stage.addActor(tableLeft); 
tableLeft.setBounds(0,0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
tableLeft.setFillParent(true); 
tableLeft.top().left(); 
tableLeft.add(healthNonButton).size(84,80).left().padLeft(10).padTop(5); 
tableLeft.add(playerHealthLabel).left().padLeft(15); 
tableLeft.row(); 
tableLeft.add(levelNonButton).size(74,70).center().padLeft(10); 
tableLeft.add(playerLevelLabel).left().padLeft(19); 
tableLeft.row(); 
tableLeft.add(coinNonButton).size(74,70).center().padLeft(10); 
tableLeft.add(this.playerCoinLabel).left().padLeft(15);   //This line 
tableLeft.row(); 

然后,我必须使用的setText像你这样的家伙们告诉我更新我的标签此方法。

public void updatePlayerCoins() { 
    playerCoinLabel.setText(playerSave.getCoinsString()); 
} 

,如果我在任何地方调用这个方法,使()或者IM设置新的硬币值,则没有更新/更换的标签,我的屏幕左上方。如果我需要发布涉及标签的东西,我可以将所有代码发布到github上。这只是一个项目,我正在努力提高我的技能,所以对不起,如果我听起来业余,这是因为我!

谢谢大家!

+0

尝试发布您的代码,让我们来看看导致NullPointerException异常 – Sparcsky

+0

我可以张贴代码,但我这样做之前有一个简单的方法,只是更新表什么的单个细胞?我试过了一个更改监听器,但它没有工作? @Ian – johnnyboy5566

+0

简单的方法是在该标签上调用'setText'。如果它没有自动更新屏幕上的布局,则代码有问题。 – Tenfour04

回答

0

看起来好像你在问两件事如何更新标签?如何构建我的代码?由于我们看不到您的代码,因此很难说出前者出了什么问题,但@ Tenfour04是正确的 - 您希望在某处保留对该标签的引用,并在要更改金额时调用setText()

至于构建你的代码,我会建议一个简单的面向对象设计,然后改进它,像这样:

首先,我们需要一个对象来表示玩家:大概

class Player { 
    private int coins; // Pretend there are getters/setters. 
    private int health; 
    private int level; 
} 

现在你有,你要代表该玩家信息的方法不止一种,所以我们就会将渲染代码放到一个单独的类或一组类:

class StatWidget { 
    private Stage stage; 
    private Player player; 
    private Label lblCoins; 

    public StatWidget(Player player) { // Pseudo-code 
    this.player = player; 
    this.stage = new Stage(); 
    Table tbl = new Table(); 
    this.lblCoins = new Label(); // Notice we keep a reference to the label 
    tbl.add(this.coins); 
    } 

    public void update() { 
    lblCoins.setText(player.getCoins()); 
    } 
} 

现在你可以只需拨打Player#update()即可将UI与播放器对象的状态同步。但是你什么时候打电话?

你可以在你的渲染方法调用update()。这有点低效,因为你更新对象是否需要更新,但它很简单,如果你只用这种方式更新几个UI元素,可能无所谓。就我个人而言,我会在这里停下来。

如果你想更精确,你只会叫update()当你真正做出改变玩家的硬币。你可以找到在你的代码,您可以设置玩家的硬币的地方做到这一点,并添加更新调用就像这样:

player.setCoins(A_LOT_OF_MONEY); 
statWidget.update(); 

问题是这样得到当您添加更多widgets-所有的游戏逻辑现在有更多的繁琐了解StatWidget并打电话给它。我们可以通过使用事件驱动架构来减少这种依赖。基本上,每当玩家的状态发生变化时,它就会向感兴趣的各方发送一个事件,通知他们变化。你可以使用下面的伪代码:

interface Publisher { 
    void subscribe(Subscriber subby); 
    void unsubscribe(Subscriber subby); 
} 

class Player implements Publisher { 
    private List<Subscriber> subscribers; 
    private int coins; 
    // ... 

    public void setCoins(int amount) { 
    this.coins = amount; 
    for(Subscriber subscriber : subscribers) subscriber.notify("COINS", amount); 
    } 

    public void subscribe(Subscriber subby) { 
    this.subscribers.add(subby); 
    } 
    public void unsubscribe(Subscriber subby) { 
    this.subscribers.remove(subby); 
    } 
} 

interface Subscriber { 
    void notify(String event, int qty); 
    void dispose(); 
} 

class StatWidget implements Subscriber { 
    private Publisher player; 
    private Label label; 
    // ... 

    public StatWidget(Player player) { 
    this.player = player; 
    this.player.addSubscriber(this); 

    void notify(String event, int qty) { 
    if(event.equals("COINS")) label.setText(qty); 
    } 

    void dispose() { 
    this.player.unsubscribe(this); 
    } 
} 

上述事件系统当然可以进行抛光,你可以做很可能聪明的事情泛型(或使用有想到这一切了你的一个库),但希望它能说明这些概念。

+0

嘿** @ John **非常感谢您的回答,您可以在我的文章中查看Update 3! – johnnyboy5566