此脚本绘制控件、英雄、表面和 map :
public void render(Canvas canvas) {
canvas.drawColor(Color.TRANSPARENT);
Drawable myImage;
int tileWidth = 50;
int tileHeight = 50;
int rowBaseX = 0;
int rowBaseY = 0;
int[][] board = new int[][] {
{0,0,0,0,0,0,2,0,0,0,},
{0,0,0,0,0,2,2,0,0,0,},
{0,0,0,0,0,2,0,0,0,0,},
{0,0,0,0,0,2,0,0,0,0,},
{0,0,0,2,2,2,0,0,0,0,},
{0,0,0,2,0,0,0,0,0,0,},
{0,0,0,2,0,0,0,0,0,0,},
{0,0,2,2,0,0,0,0,0,0,},
{0,0,2,0,0,0,0,0,0,0,},
{0,0,2,0,0,0,0,0,0,0,}
};
int mapWidth = 10;
int mapHeight = 10;
for (int row = 0; row < mapHeight; row++)
{
for (int col = 0; col < mapWidth; col++)
{
Resources res = this.getContext().getResources();
switch(board[row][col])
{
case 0:
myImage = res.getDrawable(R.drawable.tile1);
break;
case 1:
myImage = res.getDrawable(R.drawable.tile2);
break;
default:
myImage = res.getDrawable(R.drawable.tile3);
break;
}
int curL = rowBaseX + (col * tileWidth);
int curU = rowBaseY + (row * tileHeight);
int curR = curL + tileWidth;
int curD = curU + tileHeight;
myImage.setBounds(curL,curU,curR,curD);
myImage.draw(canvas);
}
}
droid.draw(canvas);
butt.draw(canvas);
butt1.draw(canvas);
butt2.draw(canvas);
butt3.draw(canvas);
buttz.draw(canvas);
buttz1.draw(canvas);
buttz2.draw(canvas);
buttz3.draw(canvas);
buttx.draw(canvas);
}
有一个英雄,当玩家用控件移动他时必须重新绘制,并且所有其他可绘制对象也必须重新绘制。问题是绘制 map 是一个漫长的过程,所以我创建的 map 越大,英雄的移动速度就越慢,因为 map 的每个图 block 都必须绘制。有没有办法在其他方法中将所有图 block 放入一个位图并在 Canvas 方法中绘制该位图?
最佳答案
如果无法在应用程序外部创建静态 map ,则可以将静态内容的绘制与动态内容分开。
创建一个位图
,用它创建一个Canvas
并在该Canvas
上绘制 map 。您只需执行一次此操作。在另一个 Canvas
上每帧渲染一次动态内容。
然后在 SurfaceView
的“真实”Canvas
上绘制两个 Bitmap
。它可能看起来像这样:
每张 map 一次部分:
Bitmap mapBitmap = Bitmap.createBitmap(width, height, myConfig);
Canvas c = new Canvas(mapBitmap);
//draw map on c
...以及每帧一次部分:
//draw dynamic stuff
Canvas canvas = getHolder().lockCanvas();
canvas.drawBitmap(mapBitmap, null, targetRect, null);
canvas.drawBitmap(heroBitmap, null, targetRect, null);
getHolder().unlockCanvasAndPost();
编辑:
您可以像以前使用myImage.draw(canvas)
一样绘制图 block ,但传递mapBitmap-Canvas
作为参数而不是“真实” Canvas 。 myConfig
必须是 Bitmap.Config 。采用RGB_565
,因为它是内部格式。
关于java - 绘制基于图 block 的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8715159/