Libgdx更新表格中的标签
表格存在问题并更新标签!这里是困境,我在游戏中有一个销售按钮,每当他们出售物品时都更新玩家的硬币,那部分工作正常。我遇到的问题是尝试在屏幕上更新硬币值,并在此单独菜单中进行更新(请参阅附图中的左图硬币)。问题在于,硬币价值在另一个阶级的另一个阶段。这是因为当我点击底部的不同按钮时,我会在中间弹出不同的表格。我曾尝试使用辅助方法来进入和清除表格并更新它,然后将我发回到此项目页面,但它不起作用,我可以发布任何需要的代码,但这更多的是关于如何更新标签的一般问题在一个舞台的桌子里。Libgdx更新表格中的标签
更新:所以要有点总结一下我的问题,我有一个屏幕,我必须有它的三个表底部的表的左上角和右上角。然后,当他们按下库存或商店按钮等时,我将表格添加到中间的舞台上。我期望做的是保持项目页面打开,只需更新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上。这只是一个项目,我正在努力提高我的技能,所以对不起,如果我听起来业余,这是因为我!
谢谢大家!
看起来好像你在问两件事如何更新标签?和如何构建我的代码?由于我们看不到您的代码,因此很难说出前者出了什么问题,但@ 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);
}
}
上述事件系统当然可以进行抛光,你可以做很可能聪明的事情泛型(或使用有想到这一切了你的一个库),但希望它能说明这些概念。
嘿** @ John **非常感谢您的回答,您可以在我的文章中查看Update 3! – johnnyboy5566
尝试发布您的代码,让我们来看看导致NullPointerException异常 – Sparcsky
我可以张贴代码,但我这样做之前有一个简单的方法,只是更新表什么的单个细胞?我试过了一个更改监听器,但它没有工作? @Ian – johnnyboy5566
简单的方法是在该标签上调用'setText'。如果它没有自动更新屏幕上的布局,则代码有问题。 – Tenfour04