一些背景信息:
我正在创建一个Android游戏,它在背景图像上绘制迷宫到画布上,这使用了一个正方形块,因此迷宫总是自动缩放为5 x 5的正方形,而实际迷宫可能是20 x 20。迷宫是通过简单地运行一组for循环然后在相关位置绘制线条来绘制的。这一切都工作得很完美,但是我在让我的onDraw平滑工作方面遇到了问题。这是由于每次无效化时,我必须重新运行for循环并运行各种if语句来检查位置(不幸的是,这个过程无法改进)。
问题:
我想重新编写迷宫绘制到画布上的方式,以下是我需要实现的3个主要功能:
1-将整个迷宫绘制到画布上(这很容易) 2-放大迷宫,只显示5 x 5 3-移动角色(始终位于屏幕中心)并绘制迷宫的下一个部分
如上所述,绘制整个迷宫非常容易,并且会使onDraw显着加快,因为无需在invaldate时运行for循环,可以在加载级别时只运行一次。
就第2和3点而言,我认为这样可以工作:将角色绘制在画布中央,然后将一个2D鸟瞰视图相机连接/链接到角色的移动上。此相机还需要缩放到仅显示整个迷宫网格的5 x 5。然后随着角色的移动,相机会随之移动并显示已经绘制的迷宫的下一个部分。我尝试了一些事情并进行了一些研究,但我以前从未使用过画布,真的不知道从哪里开始,也不知道这是否可行。
因此,总结主要问题是是否有一种方法将鸟瞰视图相机与缩放并随角色图像移动的角色相连接。
以下是当前绘制迷宫的代码片段,使用两组for循环检查两组布尔数组[][],这些数组仅存储要绘制的垂直和水平线条。
@Override
protected void onDraw(Canvas canvas)
{
canvas.drawRect(0, 0, width, 100, background);
RectBackground.set(0,0, FullScreenWidth, FullScreenWidth);
canvas.drawBitmap(gameBackground, null, RectBackground, null);
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
float x = j * totalCellWidth;
float y = i * totalCellHeight;
indexY = i + currentY;
indexX = j + currentX;
// Draw Verticle line (y axis)
if (indexY < vLength && indexX < vLines[indexY].length && vLines[indexY][indexX])
{
RectOuterBackground.set((int)x + (int)cellWidth, (int)y, (int)x + (int)cellWidth + 15, (int)y + (int)cellHeight + 15);
canvas.drawBitmap(walls, null, RectOuterBackground, null);
}
// Draws Horizontal lines (x axis)
if (indexY < hLength && indexX < hLines[indexY].length && hLines[indexY][indexX])
{
RectOuterBackground.set((int)x, (int)y + (int)cellHeight,(int)x + (int)cellWidth + 15,(int)y + (int)cellHeight + 15);
canvas.drawBitmap(walls, null, RectOuterBackground, null);
}
}
}
}