Skip to content
This repository was archived by the owner on Jun 6, 2020. It is now read-only.
raduwen edited this page Oct 7, 2012 · 10 revisions

====

マップを作ろう

マップ画像の作り方

大体のゲームライブラリは画像の分割読み込みに対応しています。 その為、マップの画像は一つの画像にまとめて作ります。

例えば4つの画像を用意したい場合、下図のように並べます。

マップ画像1

この画像を読み込むとき、DXRubyの場合Image.loadTilesというメソッドを使います。 画像の分割読み込みについては後で説明します。

また下図のように横に並べても上図と同じように読み込むことができます。同様に縦に並べても同じです。

マップ画像2

分割して読み込んだ画像は配列に0から順番に格納されます。

配列

配列(Array)とはタンスのようなものです。 Rubyの配列は何でも入れることができますが、普通同じ性質の値をまとめて入れておくことが多いです。

配列を扱うときは[]を使います。複数の値を予め入れる場合,で区切ってあげます。

array = []         # 中身が空の配列
array = ["文字列"] # 要素が一つだけある配列
# 要素が複数ある配列
array = [
  "文字列",
  1234.56
]

上記のように記述するとarrayという配列が作られます。

イメージは下図のようになります。

マップ画像2

一番目には文字列、二番目には数値が入っています。左側に0、1、2...と書いてありますね。 配列の中身を参照はこの0とか1という数値で参照します。

array[0] #=> "文字列"
array[1] #=> 1234.56

値を追加したい場合pushメソッドを使います。また<<も同じように追加することができます。値は末尾に追加されます。

array.push(78.9)
array << "Hello"

array[2] #=> 78.9
array[3] #=> "Hello"

Image.loadTilesは画像を分割して読み込み、配列に順番に入れたものを返してくれます。

マップデータ

マップデータは二次元配列にします。二次元配列とは表のようなものです。

二次元配列を作るのは簡単で、配列に配列を入れてあげればいいです。

例えば、

array = [
  [1, 0, 0, 0],
  [1, 0, 2, 0],
  [1, 3, 0, 0],
  [1, 0, 0, 0],
]

のような配列を作ったときに先程の画像を使ってマップを表示したとすると、

二次元配列

のようになります。

マップ画像の読み込み

画像を分割して読み込むにはImage.loadTilesを使うのでしたね。 Image.loadTilesは3つの引数を持ちます。

Image.loadTiles( filename, xcount, ycount )

filenameはファイル名です。xcountとycountは縦横のに幾つ画像があるかを表すものです。

下図の場合、縦に2つ、横に2つに分割したいのでxcountycountはそれぞれ2を指定してあげます。

マップ画像1

下図のように横に並べた場合、縦に1つ、横に4つに分割したいのでxcountは4、ycountは1を指定してあげます。

マップ画像2

実際に記述する際は、

images = Image.loadTiles("image.png", 4, 1)

のようになります。

マップの描画

他のライブラリではあまり見たことがないのですが、DXRubyにはマップを描画するためのメソッドが用意されています。

マップを描画するときはWindow.drawTileを使います。Window.drawTileは9個の引数を持ちます。

Window.drawTile( basex, basey, map, image_arr, startx, starty, sizex, sizey, z=0 )

basex、baseyはマップを描画する画面上の左上基点位置を指定します。 描画するマップ全体をずらすことが出来るのでスクロールとか実装したい場合に活用します。

mapにはマップデータで説明した二次元配列を指定します。

image_arrにはマップ画像の読み込みで読み込んだ画像の配列を指定します。

startx、startyはマップ内の描画開始位置をピクセル単位で指定します。 これもスクロールに使えますが、画面からはみ出した部分はループして反対側に出てきます。

sizex、sizeyは描画するマップタイルの枚数を縦横の数で指定します。

zはマップの描画順を指定します。また、zは省略できます。

例えばスクロールはせずに画面にマップデータを敷き詰めたい場合、

TILE_SIZE = 32
TILE_X = Window.width / TILE_SIZE
TILE_Y = Window.height / TILE_SIZE

tiles = Image.loadTiles("map.png", 2, 2)
map_data = [ ... ]

Window.drawTile(0, 0, map_data, tiles, 0, 0, TILE_X, TILE_Y)

みたいな感じにします。


これまで出てきた要素をすべてまとめたものを用意しました。 ココ

課題-4

タイルの種類を増やしてマップデータを改造してください。

コラム : Array

Rubyで配列を扱うときに便利なメソッドが沢山用意されています。

よく使うメソッドとして、pushpopinsertdeleteshiftfirstlasteachmapなどがあります。

詳しくはRubyリファレンスマニュアル Arrayクラスに記述されています。


Home | 入力処理をしてみよう - マップを作ろう - 当たり判定

Clone this wiki locally