Android 带有 drawRect 的图块

Android Tiles with drawRect

我想用 drawRect() 方法在 canvas 上绘制一个瓦片地图。问题是它只在坐标 0,0 上绘制第一个矩形。它应该是一个 30x20 的红色和绿色瓦片地图。我打算做一个贪吃蛇游戏。

Tile.java

public class Tile extends View{

    private final int TILE_SIZE = 16;
    private static int[][] tileMap;
    private static int rows, columns;

    public Tile(Context context) {
        super(context);
        createTilemap();
    }

    public void createTilemap(){
        tileMap = new int[30][20];
        rows = tileMap.length;
        columns = tileMap[1].length;
        Random r = new Random();

        for (int i = 0; i < rows; i++){
            for (int j = 0; j < columns; j++){
                tileMap[i][j] = r.nextInt(2);
            }
        }
    }

    public Tile(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Paint p = new Paint();

        for (int i = 0; i < rows; i++){
            for (int j = 0; j < columns; j++){

                int pos_i = TILE_SIZE * i;
                int pos_j = TILE_SIZE * j;

                switch (tileMap[i][j]){

                    case 0:
                        p.setColor(Color.GREEN);
                        canvas.drawRect(pos_i, pos_j, TILE_SIZE, TILE_SIZE, p);
                        break;
                    case 1:
                        p.setColor(Color.RED);
                        canvas.drawRect(pos_i, pos_j, TILE_SIZE, TILE_SIZE, p);
                        break;

                }
            }
        }
    }
}

activity_main.xml

<com.example.mohamed.snake.Tile
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

您的问题出在第二个 for 循环中。看起来像复制和粘贴错误。在 createTilemaponDraw 中,更改:

for (int j = 0; i < columns; i++)

至:

for (int j = 0; j < columns; j++)

此外,您对 drawRect 的论点是错误的。它们应该是 left,top,right,bottom 而不是 left,top,width,height。尝试将您的代码更改为:

canvas.drawRect(pos_i, pos_j, pos_i + TILE_SIZE, pos_j + TILE_SIZE, p);

drawRect(left, top, right, bottom) 将绘制 左侧 右侧, 顶部 底部。如果差异为 0 或负数,则不会绘制。

您正在从..

  1. 0 to TILE_SIZE
  2. TILE_SIZE to TILE_SIZE(宽度/高度== 0)
  3. 2 * TILE_SIZE to TILE_SIZE(宽/高实际变成负数)
  4. ...等等

你应该使用

canvas.drawRect(pos_i, pos_j, pos_i + TILE_SIZE, pos_j + TILE_SIZE, p);

获取正确的坐标。