因此,我只是为了好玩而制作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,以帮助可视化:
对不起,如果您听不懂我的英语。请问任何您难以理解的问题。希望我能说清楚。谢谢。