//Pylons
int xCoord[];
int yCoord[];
int numSquare;
boolean firstPaint;
public void init() {
//Images Call
pylon = getImage(getDocumentBase(), "image/pylon.png");
numClicks = 0;
//pylons
xCoord = new int[100];
yCoord = new int[100];
numSquare = 0;
}
public void paint(Graphics g) {
if (numClicks == 0) {
drawUI(g);
//probeDraw(g,2);
}
if (numSquare == 1) {
for (int k = 0; k < numSquare; k++) {
g.drawImage(pylon, xCoord[k], yCoord[k], this);
}
Minerals -= 100;
popMax += 9;
}
}
public boolean mouseDown(Event e, int x, int y) {
if (numClicks == 10) {//Title screen
numClicks++;
repaint();
}
if (numSquare == 0) {
xCoord[numSquare] = x;
yCoord[numSquare] = y;
numSquare++;
repaint();
}
return true;
}
当我这样做而不是仅仅使用100时它会将它设置为-300并且它会将popMax添加到类似36而不是10.有时它会正确地执行它,有时它不会真正令人讨厌< / p>
答案 0 :(得分:8)
你正在更新paint(...)中的类级变量,这是每次ui组件需要重新绘制时调用的方法。我并不感到惊讶,这很烦人。
您需要将处理单击操作的逻辑拆分为paint方法 - 并使用paint方法仅渲染组件的CURRENT STATE。
编辑:继续你的评论,并且不知道你的应用程序的结构,我想你会需要这样的东西:
private void handlePylonPlacement()
{
if(decrementMinerals(-100))
addPopMax(9);
}
private boolean decrementMinerals(int amount)
{
if(MaxMinerals - amount >= 0) // prevent situation where you go into negative minerals
{
MaxMinerals -= amount;
return true;
}
else
return false;
}
private void addPopMax(int amount)
{
if(popMax + amount <= MAX_POPULATION) // restrict addition to pop-max to a sane upper bound
popMax += amount;
}
public boolean mouseDown(Event e, int x, int y) {
if (numClicks == 10) {//Title screen
numClicks++;
repaint();
}
if (numSquare == 0) {
xCoord[numSquare] = x;
yCoord[numSquare] = y;
numSquare++;
handlePylonPlacement(); // call your new handler
repaint();
}
return true;
}