GameCorder.net

9.マップチップで背景描画

マップチップの概念とマップチップを使用して、背景を描画していきます。
今回の画面サイズは、640×480なので、32ピクセルの画像が横20×15個描画すれば背景が埋まります
では、マップチップとなる画像を見てみましょう。

32×32のマップチップを要素し、それを配列に入れて描画していきます。
マップチップを準備したら、マップエディターを使いましょう。
自分で作ってもいいですが、ここでは、Platinumというマップエディターを使用します。

Platinum.Exeを起動→上部メニューからファイル(新規作成)→640×480なので、とりあえず、20×15で作成します。
それから、マップチップとなる画像(jpgかbmp)を読み込んでマップを作っていきましょう。
↓こんな感じで作ります

作ったら今度は、テキストデーターとして保存します。
メニュからファイル→書き出し→ファイル種類(CSVTextFile)→保存→type1
これで、マップデーターをcsvファイルとして保存することができました。

csvファイルとは

csvファイルとは、データーがカンマで区切られたファイルのことです。
そのまま配列に書き出すことで、一つ一つ描画プログラムを書く必要がなくなります。
このデーターを利用して、背景とオブジェクトを描画していきます。

マップチップを描画する

では、マップチップで背景を描画します。
マップチップを記録しておく変数を用意して、そこに先ほどcsvファイルで作ったマップデーターを代入します。

/*
	マップ
*/
var g_MapChip = [
			[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32],
			[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32],
			[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32],
			[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32],
			[32,32,32,32,32,32,32,32,32,84,68,84,32,32,32,32,32,32,32,32],
			[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32],
			[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32],
			[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32],
			[32,32,32,32,32,32,84,84,68,84,84,84,68,84,84,32,32,32,32,32],
			[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32],
			[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32],
			[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32],
			[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32],
			[97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97],
			[113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113],
         ];
		

マップチップを入れる変数は、縦と横の2次元配列になります。
[]は自分で書き足さないといけません。自動で変換するツールがあると楽です。
このg_MapChip変数を使用して、背景を描画します。
では、描画する部分を見ていきましょう

/*
	マップチップの描画
*/
function DrawMap(map,maxX,maxY){
	for(var i = 0;i < maxY;++i){
		for(var j = 0;j < maxX;++j){
			{
				// 512*512
				g_Ctx.drawImage(g_MapTex, 32 * ((map[i][j] + 16) % 16), 32 * Math.floor(map[i][j] / 16) , 32, 32, j * 32, i * 32, 32, 32);
			}
		}
	}
}
		

引数のmapは先ほどグローバルで作った変数、maxXは配列の最大値X、maxYは配列の最大値Yです。
2重のfor文で、640×480の画面を埋めるべく描画します。
drawImageはの部分は複雑なので、解説します。
xの切り出し部分32 * ((map[i][j] + 16) % 16)
元のマップチップ画像が512*512で作られてるので、X軸上で16個、Y軸上で16個あるので、XとYの切り出し元は0~480まででないといけません。
この計算で、ちょうど0~480までの値が代入されるようになります。計算してみてください
一方、yの切り出し部分32 * Math.floor(map[i][j] / 16)
y軸に関しては、0-15までで、x軸のようにループしないので、この式で切り出すことができます。

画像の転送先である
j * 32,i * 32
はjはX座標ぶんだけ描画、iはY座標ぶんだけ描画ということです。

これで、マップチップを使用したオブジェクトと背景の描画ができました。
最後にMath.floorについてみていきます。

Math.floorに関して

Math.floorは繰り下げた整数値を返します。45.95 で45 を返し、 -45.95 を渡した場合は、-46 を返します。
小数点を整数に直してくれるわけですが、drawImageに小数点を入れてしまうと、描画が遅くなってしまうので、Math.floorを入れて整数にしています。
なので、描画位置など、小数点でなければ都合が悪いものでなければ、整数にして描画する必要があります。画像の切り出しなどです。

これで、マップチップを使った背景とオブジェクトの描画ができました。
今回の結果です。