我正在爲未來的瀏覽器遊戲做一個包含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