私は将来のブラウザゲームのためにキャンバスで地図を作成しています。しかし、私はタイルとグリッドの生成にいくつかの問題があります。実際には、アルゴリズムに3つのステップがあります。まず、drawImageのループを使って背景タイル(草、海など)を生成し、ループを使って最上位のタイル(村、オアシスなど)を生成します。 drawImageをもう一度実行して、moveTo/lineToというループでグリッドを生成します。キャンバス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