続 Min-in 駆動型ゲームライブラリ
前回は method_missing とか使ったりして、ヒドイもんだったけど今回はちょっと真面目(当社比)
ライブラリが揃っていたと仮定して、ゲーム部分はこんな感じになりす。
require_relative "framework" require_relative "unit" require_relative "mixinlibrary" class Enemy < Unit include Move, Fire, Render setting { position rand(800), rand(600) speed rand * 3 + 2.0 size 40, 40 color [255, 0, 0] fire_interval 20 bullet Bullet } end class Bullet < Unit include Move, Render setting { speed 2 size 10, 10 color [0, 255, 0] } end class Player < Unit include InputMove, Render setting { position 100, 200 speed 10 size 50, 50 color [255, 255, 255] } end class MyApplication < Framework def initialize super(800, 600) @player = Player.new @enemies = [] 5.times { enemy = Enemy.new enemy.extend(Fire::Homing) enemy.homing_target(@player) @enemies << enemy } regist_units(@player, @enemies) end end MyApplication.boot
初期化とかはちゃんとインスタンス作成時なので、継承関係は構築済みなので、kind_of? で依存関係のチェックが可能。
@enemy に extend してるのでわかると思うけど、オブジェクトに対しての Mix-in にたいしても Render とかとまったく同じインターフェイスで拡張が書けます。
けどやっぱりカオス。まぁ前回よりかは遥かにましですけど。
細かい実装はZIPにまとめたコードを参照のこと。頭が痛くなるコードでごめんなさい。
コード一式ダウンロード:http://ux.getuploader.com/whiteleaf/download/3/meta.zip