Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2006-02-28

[Easy Rocket]子タスクの生成

require 'er'

class SampleImage < ER::ImageTask
end

ER::init 640, 480, 30.0
image = SampleImage.new(:image => 'sample.bmp')
image.create_sample_image(:image => 'sample.bmp', :pos => [100, 100, 0])
ER::loop do
  image.x += 1
  image.sample_image.x += 1
  image._draw
end

SampleImage を image の子タスクとして生成する場合は、

image.create_sample_image

とします。これで SampleImage のインスタンスが image の子タスクとして作られます。 image に対して sample_image というアクセサも同時に定義されます。

ローカル座標とワールド座標

子タスクは親タスクのローカル座標に配置されます(上記サンプルでは (100, 100) )。つまり親タスクを移動させると子タスクも同じ量だけ同時に移動します。上のサンプルでは親タスク (image) と子タスク (image.sample_image) の両方の x を加算しているので子タスクは親タスクの2倍の速度で右へ移動することになります。

子タスクのワールド座標は wpos で取り出すことができます。

image.create_sample_image.wpos

draw と _draw

draw を毎回呼ぶことで画面への描画を行います。

またループ内で image.draw ではなく image._draw を呼び出しています。 _draw は内部で自分および子タスクの draw を実行します。

デフォルトオプション

ちなみに SampleImage のデフォルトの画像をこのように設定しておけば、

class SampleImage < ER::ImageTask
  image 'sample.bmp'
end

次のように書くだけで同じ画像タスクを生成出来ます。

image = SampleImage.new
image.create_sample_image :pos => [100, 100, 0]