自分には言葉で説明するのは難しいので、具体例を挙げると、
TIC-80という仮想のゲーム機上で
data2map.lua
adata={
{0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,0,0,6,6,6,0},
{0,0,1,2,0,0,6,0,6,0},
{0,0,1,2,3,3,6,6,6,0},
{0,0,0,2,3,4,4,5,0,0},
{0,0,0,0,3,3,5,5,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0}
}
のようにエリア番号を二次元配列(テーブル)に
入れたものから
のようなマップデータを作成することが目的です。
(TIC-80と書こうとして挫折しました)
満たしたい要求は以下の通り
- エリア番号が異なる場合は境界線を引く
- 複数のエリアで同じ種類のスプライト(マップチップ)を使い回す
- それなりの拡張性(現在では海と地面の二種だがそれを増やしたり)
- それなりのコードの短さとそれなりの可読性
はい、おそらく同様のことをやった人はいるはずなんですが、自分の検索力では
見つけることができませんでした。この記事のタイトルも多分適切ではありません。
マップチップやタイルなどの語句も後から知りました。
結局紆余曲折の末、以下のような方法にしました。
境界線なし、左との境界線あり、上との境界線あり、左と上との境界線ありの
スプライト(マップチップ)を海と地面それぞれ用意してインデックス#0 から順番に並べる。
後は自身のエリア番号が0(海)なら前半、左とエリア番号が異なれば1ずらし、上なら2、
両方なら足して3ずらす、としました。コードは以下のように
data2map.lua
S_ID=0
adata={
{0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,0,0,6,6,6,0},
{0,0,1,2,0,0,6,0,6,0},
{0,0,1,2,3,3,6,6,6,0},
{0,0,0,2,3,4,4,5,0,0},
{0,0,0,0,3,3,5,5,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0}
}
MAP_W=#adata[1]
MAP_H=#adata
for i=2,MAP_H do
for j=2,MAP_W do
local dSea=(adata[i][j]==0)and 0 or 4
local dLeft=(adata[i][j]==adata[i][j-1])and 0 or 1
local dUp=(adata[i][j]==adata[i-1][j])and 0 or 2
mset(j-1,i-1,S_ID+dSea+dLeft+dUp)
end
end
--sync(0,0,true)
function TIC()
map()
end
とりあえず一番上と一番左は0固定で。
また後で追記します。(初めての記事で疲れました)