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 循环中。看起来像复制和粘贴错误。在 createTilemap
和 onDraw
中,更改:
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
或负数,则不会绘制。
您正在从..
0 to TILE_SIZE
、
TILE_SIZE to TILE_SIZE
(宽度/高度== 0)
2 * TILE_SIZE to TILE_SIZE
(宽/高实际变成负数)
- ...等等
你应该使用
canvas.drawRect(pos_i, pos_j, pos_i + TILE_SIZE, pos_j + TILE_SIZE, p);
获取正确的坐标。
我想用 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 循环中。看起来像复制和粘贴错误。在 createTilemap
和 onDraw
中,更改:
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
或负数,则不会绘制。
您正在从..
0 to TILE_SIZE
、TILE_SIZE to TILE_SIZE
(宽度/高度== 0)2 * TILE_SIZE to TILE_SIZE
(宽/高实际变成负数)- ...等等
你应该使用
canvas.drawRect(pos_i, pos_j, pos_i + TILE_SIZE, pos_j + TILE_SIZE, p);
获取正确的坐标。