我正在为未来的浏览器游戏做一个包含canvas的地图。但是,我在瓷砖和网格生成方面遇到了一些问题。实际上,我的算法有三个步骤:首先用drawImage循环生成背景图块(草,海,...),然后生成带有循环的顶层图块(村庄,绿洲......) drawImage再次完成我生成一个moveTo/lineTo循环的网格。用Canvas生成地图的网格和图像的问题HTML
为了说明你这一切,我会告诉你我的算法:
redrawMapContent: function() {
this.ctx = document.getElementById(this.id).getContext("2d");
this.drawTilesMap(0, this.ctx);
this.drawTilesMap(1, this.ctx);
this.drawGridMap(this.ctx);
camera.recenterOnMyCity();
},
drawTilesMap: function(layer, ctx) {
var tileSize = map.getTileSize();
var startCol = Math.floor(camera.x/tileSize);
var startRow = Math.floor(camera.y/tileSize);
\t
var endCol; var endRow;
if (camera.width > tileSize * map.cols) endCol = startCol + map.cols - 1;
else endCol = startCol + (camera.width/tileSize);
if (camera.height > tileSize * map.rows) endRow = startCol + map.rows - 1;
else endRow = startRow + (camera.height/tileSize);
\t
\t
var offsetX = -camera.x + startCol * tileSize;
var offsetY = -camera.y + startRow * tileSize;
var imageTilesAtlas = new Image();
imageTilesAtlas.onload = function() {
\t for (var c = startCol; c <= endCol; c++) {
\t \t for (var r = startRow; r <= endRow; r++) {
\t \t var tile = map.getTile(layer, c, r);
\t \t var x = (c - startCol) * tileSize + offsetX;
\t \t var y = (r - startRow) * tileSize + offsetY;
\t \t if (tile !== 0) { // 0 => empty tile
\t \t ctx.drawImage(
\t \t imageTilesAtlas,
\t \t (tile - 1) * map.defaultTileSize,
\t \t 0,
\t \t map.defaultTileSize,
\t \t map.defaultTileSize,
\t \t Math.round(x),
\t \t Math.round(y),
\t \t tileSize,
\t \t tileSize
\t \t );
\t \t }
\t \t }
\t }
};
imageTilesAtlas.src = this.tileAtlas;
},
drawGridMap: function (ctx) {
var tileSize = map.getTileSize();
var width = map.cols * tileSize;
var height = map.rows * tileSize;
var x, y;
ctx.strokeStyle = "rgba(100,100,100,0.3)";
for (var r = 0; r < map.rows; r++) {
\t x = - camera.x;
\t y = r * tileSize - camera.y;
\t ctx.beginPath();
\t ctx.moveTo(x, y);
\t ctx.lineTo(width, y);
\t ctx.stroke();
}
for (var c = 0; c < map.cols; c++) {
\t x = c * tileSize - camera.x;
\t y = - camera.y;
\t ctx.beginPath();
\t ctx.moveTo(x, y);
\t ctx.lineTo(x, height);
\t ctx.stroke();
}
},
的问题是,有时只有其产生的背景瓷砖。而且,网格永远不会生成。 我不知道如何解决这个问题,我在控制台中没有错误,我没有任何问题。
谢谢你的答案(和抱歉,我的英语水平,我是法国人,它是我第一次张贴在英语论坛)。
好的,谢谢你和网格你有什么想法吗? – Fortz