当前位置: 首页 > 面试题库 >

绘制基于图块的地图

傅峻
2023-03-14
问题内容

该脚本绘制控件,英雄,表面和地图:

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);
    }

有一个英雄,当玩家使用控件移动他时必须重新绘制,所有其他可绘制对象也必须重新绘制。问题在于绘制地图是一个漫长的过程,因此我创建的地图越大,英雄移动的速度就越慢,因为必须绘制地图的每个图块。有没有一种方法可以将所有图块以其他方法放置到一个位图,然后在canvas方法中绘制该位图?


问题答案:

最好的选择是只绘制地图在屏幕上可见的部分。这样,无论整个地图变成多大,该地图的绘制始终是恒定的。由于您使用的是网格系统,因此您可以轻松找出英雄所在的单元格:

heroGridX = hero.x % mapWidth;
heroGridY = hero.y % mapHeight;

在这里,您可以使用画布的宽度和高度以及网格单元的宽度和高度的恒定大小来计算要在播放器周围绘制多少个单元:

leftGrid = heroGridX - (canvas.getWidth() / tileWidth) / 2;
topGrid = heroGridY - (canvas.getHeight() / tileHeight) / 2;
rightGrid = heroGridX + (canvas.getWidth() / tileWidth) / 2;
bottomGrid = heroGridY + (canvas.getHeight() / tileHeight) / 2;

您可以使用数据结构来独立于英雄存储这些值,并且仅在玩家靠近边缘滚动地图时才移动它们。这样,英雄无需滚动地图即可上下移动,直到他们将X或Y像素移到图块的边缘为止。而不是在渲染例程中计算这些。

与将整个图绘制到一个大的位图中相比,这将使用更少的内存。绘制一个大的位图是为了减少CPU时间而消耗更多的内存。随着地图的变大,绘制该地图所需的内存也随之增加。该算法只是使地图绘制保持恒定,因为屏幕大小在运行时不会改变。并且,与其他选项相比,您的内存使用量不会随着地图的增大而增大(与在画布中绘制更多的图块相比,其占用的空间很小)。一个重要的事实是,如果您的屏幕更大(例如平板电脑还是手机)。该算法也将适当放大,以便玩家可以看到更多地图周围的地形。



 类似资料:
  • 项目基于vue3,如何使用OpenLayers地图,在地图中根据经纬度,步长绘制网格,并且网格可以矩形拖选,请问用什么实现?

  • 我有一个谷歌地图生成的以下脚本在下面的URL http://apryll.co.in/maps/index.php 我有一个下拉在页面选择不同的位置。 http://apryll.co.in/maps/index.php 当我选择下拉时,它会将不同位置的纬度和经度作为ajax调用的响应。 现在我想用新收到的lat和longs在响应文本中重新绘制google地图 万分感谢

  • 问题内容: 我试过了 但它产生错误: 任何的想法? 问题答案: 好吧,错误消息很清楚:不是实体。如果要映射基本元素的集合,请使用批注(来自Hibernate)或批注(来自JPA 2.0)。 因此,假设您使用的是Hibernate Annotations 3.4,请尝试以下操作: 或者,使用泛型时: 如果您使用的是Hibernate Annotations 3.5+,则更喜欢JPA 2.0注释: 或

  • 本文向大家介绍Python基于pyecharts实现关联图绘制,包括了Python基于pyecharts实现关联图绘制的使用技巧和注意事项,需要的朋友参考一下 生活中有很多需要用到关联图的地方,至少我认为的是这样的图:https://www.echartsjs.com/examples/zh/editor.html?c=graph-npm 我是在使用Word2Vec计算关联词的余弦距离之后,想要更

  • 最新代码-http://jsfidle.net/ysqdh/88/- 这个版本使用gDouglasPeuker从绘制的版本中创建一个rudamentary多边形形状-http://jsfiddle.net/ysqdh/94/ ^这将禁用用于绘制的映射,并在创建形状后再次启用该映射。 我正在开发一个谷歌地图应用程序。而不是多边形点击练习。我想要能够画一个形状-然后转换成一个多边形。 下面是我的最新应

  • 操作步骤: ①以编辑状态进入地图,点击左侧图例面板中要使用的图层,所选图层的边缘显示为蓝色,表示新添加的记录将绘制在此图层上。例如:选择标注图层。 ②点击地图右上方工具栏上"添加标注"按钮。 ③在地图上,将鼠标移到想要添加标注的位置,点击一下,放置标注即可。 ④在弹出的信息窗中,填写标题及其他说明信息。 ⑤点击信息窗口右下角的"完成"图标以完成添加。 提示 ●区域和线路需双击鼠标左键结束绘制。 操