LoginSignup
1
1

More than 5 years have passed since last update.

【TIC-80】エリア番号を振った配列(テーブル)から境界線付きのマップデータを作成

Posted at

自分には言葉で説明するのは難しいので、具体例を挙げると、
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}
}

のようにエリア番号を二次元配列(テーブル)に
入れたものから
mapdata.png
のようなマップデータを作成することが目的です。
(TIC-80と書こうとして挫折しました)

満たしたい要求は以下の通り

  • エリア番号が異なる場合は境界線を引く
  • 複数のエリアで同じ種類のスプライト(マップチップ)を使い回す
  • それなりの拡張性(現在では海と地面の二種だがそれを増やしたり)
  • それなりのコードの短さとそれなりの可読性

はい、おそらく同様のことをやった人はいるはずなんですが、自分の検索力では
見つけることができませんでした。この記事のタイトルも多分適切ではありません。
マップチップやタイルなどの語句も後から知りました。

結局紆余曲折の末、以下のような方法にしました。
tile.png
境界線なし、左との境界線あり、上との境界線あり、左と上との境界線ありの
スプライト(マップチップ)を海と地面それぞれ用意してインデックス#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固定で。

また後で追記します。(初めての記事で疲れました)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1