因此,我只是为了好玩而制作HTML5 RPG。地图是<canvas>(宽度512像素,高度352像素|宽16格,上下11格)。我想知道是否有一种更有效的方法来绘制<canvas>。
这就是我现在的方式。
如何在地图上加载和绘制图块
正在使用该图块以图块(32x32)绘制地图Image()。图像文件通过一个简单的for循环加载,并放入一个名为的数组tiles[],使用时要进行绘制drawImage()。
首先,我们加载瓷砖...

这是完成的过程:
// SET UP THE & DRAW THE MAP TILES
tiles = [];
var loadedImagesCount = 0;
for (x = 0; x <= NUM_OF_TILES; x++) {
var imageObj = new Image(); // new instance for each image
imageObj.src = "js/tiles/t" + x + ".png";
imageObj.onload = function () {
console.log("Added tile ... " + loadedImagesCount);
loadedImagesCount++;
if (loadedImagesCount == NUM_OF_TILES) {
// Onces all tiles are loaded ...
// We paint the map
for (y = 0; y <= 15; y++) {
for (x = 0; x <= 10; x++) {
theX = x * 32;
theY = y * 32;
context.drawImage(tiles[5], theY, theX, 32, 32);
}
}
}
};
tiles.push(imageObj);
}
自然地,当玩家开始游戏时,它会加载他们最后一次退出的地图。但是在这里,它是一张全草图。
现在,地图使用2D数组。这是一个示例地图。
[[4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 1, 1, 1, 1],
[1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 13, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 13, 11, 11, 11, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 1, 1, 1, 1, 1, 1, 1, 13, 13, 13, 13, 13, 1],
[1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1]];
我使用简单的if结构得到了不同的地图。一旦上面的2d数组是return,每个数组中的对应数字将根据Image()存储在内部的情况进行绘制tile[]。然后drawImage()会发生,并根据油漆x和y和时间它通过32画上正确的x-y坐标。
多个地图切换如何发生
随着我的游戏,地图有五件事情来跟踪:currentID,leftID,rightID,upID,和bottomID。
- currentID:您正在使用的地图的当前ID。
- leftID:
currentID在当前地图左侧退出时要加载的ID 。 - rightID:
currentID在当前地图右侧退出时要加载的ID 。 - downID:
currentID在当前地图底部退出时要加载的ID 。 - upID:
currentID退出当前地图顶部时要加载的ID 。
一些需要注意的:如果有一个leftID,rightID,upID,或bottomID不特定的,这意味着他们是一个0。这意味着他们不能离开地图的那一侧。这仅仅是一个看不见的封锁。
因此,一旦一个人离开地图的一侧,具体取决于他们离开的位置...例如,如果他们在底部离开,bottomID将map要加载的编号并将其绘制在地图上。
这是一个代表性的.GIF,可帮助您更好地可视化:

如您所见,迟早会有很多地图处理许多 ID。这可能会引起一些混乱和忙碌。
明显的优点是,它一次可加载176个图块,刷新一小块512x352画布,并一次处理一张地图。缺点是,当处理许多地图时,MAP ID有时可能会造成混乱。
我的问题
- 这是存储地图的一种有效方法(考虑到瓷砖的使用),还是有一种更好的处理地图的方法?
我当时正在考虑一张巨型地图。地图大小很大,并且全都是一个2D数组。但是,视口仍为512x352像素。
这是我为解决此问题而制作的另一个.gif,以帮助可视化:

对不起,如果您听不懂我的英语。请问任何您难以理解的问题。希望我能说清楚。谢谢。