それで、私はただの楽しみのためにHTML5 RPGを作っています。マップは<canvas>
(幅512ピクセル、高さ352ピクセル|横16タイル、縦11タイル)です。をペイントするより効率的な方法があるかどうかを知りたいです<canvas>
。
ここに私が今それを持っている方法があります。
マップ上でのタイルのロード方法とペイント方法
マップは、Image()
ピースを使用してタイル(32x32)でペイントされています。画像ファイルは単純な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
構造を使用してさまざまなマップを取得します。上記の2次元配列がいったんであるとreturn
、各配列の対応する数はImage()
格納された内部に従って描かれますtile[]
。次いでdrawImage()
に従って発生し、ペイントであろうx
とy
し、回それによって32
正しい上にペイントするx-y
座標。
複数のマップの切り替えが発生する方法
私のゲームでは、マップはを追跡する5つのことを持っている: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キャンバスを更新し、一度に1つのマップを処理することです。欠点は、多くのマップを処理するとき、MAP idが時々混乱する可能性があることです。
私の質問
- これは、マップを保存するための効率的な方法ですか(タイルを使用する場合)、またはマップを処理するためのより良い方法がありますか?
私は巨大な地図の線に沿って考えていました。マップサイズは大きく、すべて1つの2D配列です。ただし、ビューポートは512x352ピクセルのままです。
視覚化を支援するために(この質問のために)作成した別の.gifを次に示します。
あなたが私の英語を理解できない場合は申し訳ありません。わからないことは何でも聞いてください。うまくいけば、私はそれを明確にした。ありがとう。