マップシステムを考える

こんなことを考えていた。
実装はまだ全く手付かず。
すぐできそうだけど。
コードを書くより仕様を決めるほうが大変だし、大事だ。

require "dxruby"

# マップシステムを考える

# マップシステムモジュールが持つのは、マップの描画方法の指定、それから絵。
# あ、絵も後から指定すればいいのか。と後から気付いた。
# 何を先に指定して何を後で指定するかは調整ってかんじ。
# たたき台という感じで以下。

# マップデータそのものは描画時に2次元配列で指定する。
# 描画方法は、横の移動量(x,y)、縦の移動量(x,y)、基点位置(x,y)、描画順(z)、範囲外を繰り返すかループするかの指定。
# 絵は配列でImageオブジェクトをたくさん。
# Imageオブジェクトのクリッピングはできないから、端を隠すための枠は自分で描くこと。
# もしくはウィンドウの端で切るか。
# 結局ユーザーが作るものはアリガチな2次元配列マップと、絵の配列だけだ。

# 横と縦の移動量指定。省略するとImageオブジェクトのサイズで縦横に並ぶ。
# 縦、横のサイズは1つ目のイメージのサイズが適用される。
# この指定をいじることでクォータービューも可能になるはず。
MapSystem.xstepx = 32
MapSystem.xstepy = 0
MapSystem.ystepx = 0
MapSystem.ystepy = 32

# ループさせるときはtrue。省略はtrue。
# defaultchipはloopflagがfalseのときに、範囲外にどのチップを埋めるかを表す。trueの時は無視。
# ドラクエなんかだと、外はループしてて街の中はしてない。そんな感じ。nilにすると描画しない。
# 洞窟の中はnilみたいな。
# はしっこでスクロールをとめるのはユーザーが作る。
MapSystem.loopflag = true
MapSystem.defaultchip = 1

# 配列で格納する。マップチップ番号は配列の要素番号とイコールとなる。
MapSystem.chipimage = Image.loadToArray("mapchip.png", 5, 10)

# マップ
# データにnilを入れておくとその部分は描画しない。
# 優先順の高い絵をその部分に上書きする場合に、nilにしとけば負荷軽減になる。
data = [[1,2,3],[1,2,3],[1,2,3]]

# 描画
# baseは描画開始座標、dataはマップの2次元配列、startはマップ内の開始位置、sizeは縦横の描画数
# スクロールさせたいときはbaseをいじってちょっとずつずらす。
MapSystem.draw(basex, basey, data1, startx, starty, sizex, sizey, z)

# 手前に上書きさせたいデータは別データとして作って、zを大きくしてもう一度描画
MapSystem.draw(basex, basey, data2, startx, starty, sizex, sizey, z+10)

# キャラの絵はその間のzを指定して描くようなかんじ
Window.draw(x, y, image, z+5)

# これで基本的なRPGぽいものは作れるはず。
# ただこれだと、キャラが縦長で、木より手前だと手前に重なって奥だと木の奥に行くような描画ができない。
# 1枚の背景でzを可変させるには、縦に並んだ複数のマップチップをセットにして同一のzを持たせる必要があって、
# 2次元配列1つでは表現できないため、上書きするマップにzマップを付加するとか考えないといけない。
# でもzマップを作っても、木がごちゃごちゃ生えててその間をすり抜けるとかはできない。
# 同じ位置に別のzを持つ絵が重なるということだから、それは既に背景のレベルではない。
# そのレベルになってきたらキャラとして描画してもらうしかないが、たぶん性能的に無理がある。

ためしに一つ作って性能を検証してみるか。
作ったけど結局遅すぎて話にならんかったら考えるだけ無駄だしな。
いきなり言ってることが変わってるのは気にしない。