Android - Canvas onDraw在角色移动后使用缩放的camara

Raj*_*ana 6 java camera android android-canvas

一些背景:

我正在创建一个Android游戏,在背景图像的画布上绘制迷宫,这使用方块,因此迷宫总是自动放大到5 x 5平方,迷宫可能是20 x 20.通过简单地运行一组for循环然后在相关位置绘制线来绘制迷宫.这一切都很完美,但是我的问题是让我的onDraw顺利运行.这是因为每次我无效的事实我必须重新运行for look并运行各种if语句来检查位置(不幸的是这个过程无法改进).

问题:

我想重新编写我的迷宫画在画布上的方式,下面是我需要实现的3个主要功能:

1 - 将整个迷宫绘制到画布上(这很容易)2 - 放大迷宫,只显示5 x 5 3 - 移动角色(总是在屏幕中心)并绘制下一个区域迷宫

现在如上所述绘制整个迷宫很容易,并且会使onDraw显着更快,因为它们不需要在invaldate上运行for循环,它可以在首次加载时执行一次.

就第2点和第3点而言,我看到这个工作的方式是在画布中间绘制的字符,然后是附加/链接到字符移动的2d鸟眼视图相机.此相机还需要放大到只显示整个迷宫网格的5 x 5的程度.然后当charcater移动时,相机随角色移动并显示已经绘制的迷宫的下一部分.我已经尝试了一些事情并做了一些研究但是我之前从未使用过画布,也不知道从哪里开始,如果这是可能的话.

因此,总结问题的主要部分是它们是否是将鸟眼视图相机链接到放大并随角色图像移动的角色的方式.

下面是关于如何绘制迷宫的片段,使用2组for循环检查2组布尔数组[] [],它只存储要绘制的垂直和horixaonl线.

@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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

mtt*_*brd 1

为了使绘图速度更快,您可以通过直接绘制位图并将位图闪烁到画布中来双缓冲画布,如下所示。速度非常快。

private void init()
{
        //variables below are class-wide variables
        b = Bitmap.createBitmap(cwidth, cheight, Bitmap.Config.ARGB_8888);
        bitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        bitmapPaint.setStyle(Paint.Style.STROKE);

        bitmapPaint.setStrokeWidth(3);
        myPaint.setColor(0xff000000);
        myCanvas = new Canvas(b);
}

protected void onDraw(Canvas c)
{
    super.onDraw(c);
    c.drawBitmap(b, 0, 0, myPaint);

    for(int i = 0; i < number lines; i++)
    {
        //draw here using myPath
    }

    if(b != null)
        c.drawBitmap(b, 0, 0, myPaint);

    myCanvas.drawPath(myPath, bitmapPaint);

}
Run Code Online (Sandbox Code Playgroud)

然后,为了“四处走动”,我建议使用裁剪框。这意味着在 1:1 比例下,图像大于屏幕上显示的视口。当有人“移动”时,实际上发生的事情是位图被移动到裁剪框下方。

您可以使用 BitmapRegionDecoder 并仅显示角色所在的区域(这可能会很慢)或使用

public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint)
Run Code Online (Sandbox Code Playgroud)

这里的 src 参数允许您指定要显示的位图的一小部分区域。它实际上是一个作物箱。