LibGDX尝试创建一个方法来处理精灵的点击输入



所以这是我的代码,问题在于计时器,我得到一个错误,说timesClicked是从内部类访问,因此需要声明final

然而,如果我声明它是final,我将无法改变它。我该怎么做?

public static void displayItem(Player Dawid, Item item, int timesClicked, Sprite itemSprite){
if (Gdx.input.justTouched()) {
camera.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));
if (Assets.healthPotionSPR.getBoundingRectangle().contains(touchPoint.x, touchPoint.y)) {
if (timesClicked == 1){
Shop.checkRequirement(item.getBuyPrice(), Dawid, item);
Dawid.setGold(Dawid.getGold() - HealthPotion.buyPrice);
item.setStock(item.getStock()+1);
topText = "Kupiłeś eliksir zdrowia!";
}
Assets.sellText = item.getSellPrice() + "g";
Assets.buyText = item.getBuyPrice() + "g";
timesClicked++;
timer.schedule(new TimerTask() {
@Override
public void run() {
timesClicked = 0;
}
}, 500);
}
}
}

我想创建这个方法,并且我需要能够提供一个静态int,它将根据每次单击的数量和每次单击之间的时间进行编辑。

编辑

我明白了,这里有一个公共静态int timesClicked,然后这个方法是:

public static void displayItem(Player Dawid, Item item, int timesClicked, Sprite itemSprite){
if (Gdx.input.justTouched()) {
camera.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));
if (itemSprite.getBoundingRectangle().contains(touchPoint.x, touchPoint.y)) {
if (timesClicked == 1){
Shop.checkRequirement(item.getBuyPrice(), Dawid, item);

}
Assets.sellText = item.getSellPrice() + "g";
Assets.buyText = item.getBuyPrice() + "g";
spriteClicked++;
timesClicked = spriteClicked;
timer.schedule(new TimerTask() {
@Override
public void run() {
spriteClicked = 0;
}
}, 500);

}
}
}

您可以使用MutableObject或类似的东西。如果您不使用Apache Commons,您可以简单地创建一个这样的目录:

public class MutableInt {
public int value;
public int get() {
return value;
}
public void set(int value) {
this.value = value;
}
}

这样你就可以创建一个MutableInt并声明它为final,但是你仍然可以改变它的int值:

// declare this somewhere in the top of your method
final MutableInt clicked = new MutableInt();
clicked.set(timesClicked); // initialize
// ... other code
// replaces "timesClicked++;"
clicked.set(clicked.get() + 1); // or maybe write an "increase" method for this ...
timer.schedule(new TimerTask() {
@Override
public void run() {
// replaces "timesClicked = 0;"
clicked.set(0); // no problem anymore, because "clicked" is final
}
}, 500);

BK_HR:也许我错了,但似乎你正试图改变timesClicked在调用方法中的值。但是timesClicked只存在于displayItem方法中,因此每当再次调用该方法时,timesClicked的值将被重置,因此它永远不会大于1。
也许可以尝试使用全局字段而不是方法参数。

编辑:

如果你想改变值"timesClicked"对于另一个对象,可以使用该对象的引用来代替int形参,如下所示:

public static void displayItem(Player Dawid, Item item, HealthPotionClicked variableHoldingObject, Sprite itemSprite){
// ...
variableHoldingObject.setTimesClicked(variableHoldingObject.getTimesClicked() + 1);
timer.schedule(new TimerTask() {
@Override
public void run() {
variableHoldingObject.setTimesClicked(0);
}
}, 500);
}

这样你甚至不需要MutableObject.

最新更新