对于loop / if语句java

时间:2012-05-15 13:33:43

标签: java

//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>

1 个答案:

答案 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;
}