在画布上绘图和刷新

时间:2013-06-09 16:55:17

标签: java android android-canvas

我是Android编程的新手,现在我正试图为一个人制作一个简单的海战游戏。船只是场所,球员击中场地,看看击球是否命中。 基本上,该字段看起来像这样:

the field

代码是:

public void onDraw(Canvas canvas) {

    if (getWidth() > getHeight()) { 
         rebro = getHeight(); 
    } else {
        rebro = getWidth();  // the smaller size of screen is "rebro"
    }
    rebro_piece = rebro / 10; // divide the screen by 10 (to get 10x10 field)

    Paint background = new Paint();
    background.setColor(getResources().getColor(R.color.game_background));
    canvas.drawRect(0, 0, rebro, rebro, background);  // draw background

    Paint divider = new Paint();
    divider.setColor(getResources().getColor(R.color.divider_black));

    // drawing divider lines
    for (int i=0; i<11; i++) {
        canvas.drawLine(0, i*rebro_piece, rebro, i*rebro_piece, divider);  // horizontal
        canvas.drawLine(i*rebro_piece, 0, i*rebro_piece, rebro, divider);  // vertical
    }

canvas.drawLine(rebro-1, 0, rebro-1, rebro, divider);
}

这就是我制作“田野”的方式。

在另一个课程中,我有一个方法可以收集代表船只放置位置的10×10阵列的数字xy。对于调试,我需要在我的字段上绘制它们。在一个循环中检索船舶坐标。

所以我写了一个drawShip(int x, int y)方法。

关于Stack Overflow我已经创建了一个question关于“为什么我不能在onDraw()之外画画?”我把方法改为:

public void drawShip(int x, int y) {
myX = x; //global
myY = y; //global
needToPaintShip = true; //boolean
invalidate(); // refreshing?
needToPaintShip = false;
}

此处needToPaintShip决定是否需要重绘画布。

我也编辑了onDraw(Canvas canvas)方法:

if(needToPaintShip == true) {
        Paint ship = new Paint();
        ship.setColor(getResources().getColor(R.color.ship_color));
        Log.d(TAG, "onDraw(): rebro_piece = " + rebro_piece + " , myX = "+ myX + " , myY = " + myY); // I only get the last coordinates! 
        Rect r = new Rect(myX*(rebro_piece),myY*rebro_piece, myX*(rebro_piece+1), myY*(rebro_piece+1));
        canvas.drawRect(r, ship);
    }

但结果很糟糕:

the awful result

伙计们,我很绝望。我怎样才能解决这个问题并在场上画“船”?

1 个答案:

答案 0 :(得分:1)

为什么在调用invalidate()后设置needToPaintShip = false;?您是否需要在后续帧中再次绘制船舶?

此外,它似乎是这个项目:

Rect r = new Rect(myX*(rebro_piece),myY*rebro_piece, myX*(rebro_piece+1), myY*(rebro_piece+1));

应该是:

Rect r = new Rect(myX*(rebro_piece),myY*rebro_piece, (myX+1)*rebro_piece, (myY+1)*rebro_piece));

至于为什么船总是出现在右下角,这取决于你传递给drawShip(x,y)的东西,这是未显示的。您是否可能传递像素坐标而不是[0-10)范围内的某些内容?