Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
2005-01-30

[開発ログ]タスクチェンジ

全面的にタスク処理を取り入れるべくオブジェクト指向で実装を試みるがなかなかうまくいかない。

まず難しいのがタスクチェンジ。経験上、シーンの切り替えくらいにしか使わないからタスクチェンジはいらないかと思ったが、例えばサッカーゲームのオフェンスとディフェンスの CPU の思考ルーチンの切り替えに使ったり、シューティングゲームの武器の切り替えにも使ったりできそうなのでやっぱり実装することにする。

  • どうやって自分自身でクラスを差し替えるか
    • 実際には直接は無理なのでラッパー的なものをかます
  • メモリ使用量の問題から旧クラスを破棄してから新クラスを生成しなければならない

で考えたのがタスク本体クラスを生成したときに内部でラッパー的なクラスを作成するようにして(……やっぱりラッパーという言い方は違うな)そのラッパーの方で本体を差し替えて……のような方法。これで一見うまくいったかと思ったが全然ダメ。はじめに生成したインスタンスが破棄されたことになるのはいろいろ困る。いろんなところが参照してるから。やっぱり本当のラッパーにしないとダメか。

--

いや、うーん。

小一時間考える。やっぱり武器が勝手に変わるのは変じゃないか?

class Man
  def init
    @wepon = WeponA.new
  end
  def proc
    at = @wepon.at
  end
end

武器が変わるタイミングがあるはずで、武器自身が自分の判断で持ち主の知らないうちに変化するとは考えにくい。

場面の切り替えは自身で判断して切り替わる実装を今までしてきたが、場面切り替えだったら、

class SceneLauncher < Task
  def init
    @scene = TitleScene.new
  end
  def proc
    klass = @scene.next_scene
    if klass
      @scene.delete
      @scene = klass.new
    end
  end
end

このように場面生成のタスクを設ければ解決する。場面は外から参照しないのでこれでいい。でもやっぱり、すぐには思い浮かばないが、外から参照されるものが勝手に切り替わるのが有効な場合もあるのかも知れない。その場合はインスタンス変数は維持したまま特異メソッドでメソッドを置き換えればいいケースなのだろうか……。つまりタスクチェンジは特異メソッドで可能な変化に限ると。

こういうの考えるの苦手なんだろうか。