1

私は Android プログラミングの初心者で、今は 1 人用の簡単な海戦ゲームを作ろうとしています。船は場所であり、プレーヤーはフィールドにぶつかり、ショットがヒットするかどうかを確認します。基本的に、フィールドは次のようになります。

フィールド

コードは次のとおりです。

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);
}

それが「畑」の作り方です。

別のクラスには、数値を収集するメソッドとxy船が配置されている場所を表す 10 × 10 の配列があります。デバッグのために、フィールドにそれらを描画する必要があります。船の座標はサイクルで取得されます。

だから私はdrawShip(int x, int y)方法を書きました。

スタック オーバーフローで、「外でペイントできないのはなぜですか?」という質問を作成しました。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);
    }

しかし、結果はひどいものです:

ひどい結果

みんな、私は必死です。これを修正して、フィールドに「船」を描画するにはどうすればよいですか?

4

1 に答える 1