java - 绘制基于图 block 的 map

标签 java android bitmap drawable

此脚本绘制控件、英雄、表面和 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/

相关文章:

java - 是否有可用的 Bloomier 过滤器的实现?

java - 即使代码未更改,JTextField 也不会随机出现在程序中

安卓四方 :How can i know that whether check in has done or not?

android - 无法为 android 初始化 LoginButton Facebook-sdk

java - ListView 的图像速度极慢

java - 通过方法调用打印数组

java - "D"和 "F"的数字格式异常异常?

Android,在tabhost里面如何在下面添加一个按钮和一个 ListView ?

java - 显示随机图像

c - 在 C 中遍历结构