New Articles

Recent Comments

  1. Storekeeper 設計編(1)
    1. 09/11 : by ?尚男装
    2. 08/04 : by チャンルー
    3. 07/11 : by 男性用水着 ビキニ
    4. 09/12 : by ヒーハー!!!!
    5. 09/05 : by ついつい・・・
  2. Seesaaで自作HTMLカスタムしてみたの
    1. 08/02 : by 吸引力の変わらないただひとつの…
    2. 08/13 : by テレビ電話 エッチな女の子
    3. 10/29 : by Kelvin Perry
    4. 10/26 : by Emma Erickson
    5. 10/24 : by Vince Shepard
  3. 作るモノ・課題 募集中!
    1. 02/11 : by ポロリン
    2. 02/01 : by PC自作男
    3. 01/27 : by タソタソメソ
    4. 01/27 : by ちょろ毛
    5. 01/19 : by まろゆき
  4. トラックバックのテスト
    1. 10/03 : by english amatuer porn
  5. Storekeeper 設計編(3)
    1. 10/03 : by mature women amatuer

Recent TrackBacks

  1. 12/02 : Seesaaで自作HTMLカスタムしてみたのまげフ
  2. 11/29 : Seesaaで自作HTMLカスタムしてみたのふりす
  3. 11/22 : Seesaaで自作HTMLカスタムしてみたの犬コロ
  4. 11/08 : Seesaaで自作HTMLカスタムしてみたの花びら
  5. 10/25 : Seesaaで自作HTMLカスタムしてみたの暴走

Log

  1. May 2005 (1)
  2. Apr 2005 (10)

RSS

21 Apr 2005 :: Storekeeper 設計編(1)

んでは、Storekeeper(倉○番)の設計を始めてみようかな、と。
設計なんて言っても、そんな大それたモンじゃなく、どんなモノが出てくるとか、それぞれのモノがどう動くかとか、どういう風に関連しあってるかとか、全体的な流れなどなど、整理してみるわけですよ!(サンボマスター風に)

まずは、キー入力をどう受け取るか考えてみる。
それぞれのモノが、各々キー入力判定をしてみてもいいんだけど、こういうシステム依存的なコードは、なるべく一箇所に集中したいのココロ。なので、キー入力を受け取るクラスを作る事に。

■ Key
キー入力を input() メソッドで受け取るクラス。
倉○番では、方向キーしか使わないので input(direction) にするべか。
それぞれのオブジェクトにキー入力があった事を通知するのは、Observer パターンを使う事にする。
というわけで、Key は Observable(Subject) を継承して、input が呼ばれたら、接続してる Observer を、入力された方向を引数に update するってことで。

次に、倉○番の「舞台」が必要ですな。何しろ舞台が無いことには、主人公も倉庫の荷物も置けません。

■ Field
舞台となるクラス。1つの主人公と、複数の荷物を持っている。
複数の荷物は、リストか何かで管理するとして。
あと、大事なのが地形。ステージがどういう形なのかを、ここに持たせる。つまり、ここに移動できるかとか、ここには荷物があるか、などはこれに問い合わせればわかるって事で。
さらに、ゲームの終了を判定しなくちゃいけない。終了条件は、全ての荷物がゴールにある事なので、これじゃないと判定できない。荷物が移動したかどうかは、教えてもらわないとわからないので、Observer を継承して、Update してもらう事にする。
主人公の初期位置とか、ステージの形とか、荷物の数・位置は、ファイルに書いておいて、読み込むようにするべさ。
Model-View の Model にあたるクラスなので、Observable も継承して、View に通知できるようにしておく。
なんか、役目が多いな… しょうがないけど。

今度は、荷物クラスだけど、色々な種類の荷物を作れるようにする為に、荷物抽象クラスを作る事にする。荷物って英訳すると何だろ。Baggage …だと、手荷物って感じだし… Package だと、java.lang.Package とかぶっちゃうし… Box でいいや。箱〜。

■ Box(abstract class)
荷物(箱)を表す抽象クラス。
コンストラクタで、初期位置を設定。位置は、ゲッタだけ提供して、動かすには「押す」。「押す」のはどんな荷物でも出来るけど、実際に動くかどうかは押してみないとわからない、というわけで、「押す」は、実際に動いたかどうかを bool で返す。引数には押す方向かな。
あと、移動先に移動できるかどうか知る必要があるので、コンストラクタで Field を渡す事にしましょ。依存しちゃうけど、しょうがあるまい。
んで、移動した時に Field に伝える必要があるので、Observable を継承して、接続できるようにしておく。

具体的な箱としては、「押せない HeavyBox」「押すとその方向に1つ動くけど他の荷物があると押せない StepBox」「押すと壁や他の荷物にぶつかるまで動く箱 SlipBox」「押すとその方向に1つ動き他の荷物がある場合は飛び越えて2つ進む JumpBox」などが考えられる。どれも「押す」メソッドは共通。

…あれ? ちょっと待てよ。って事は、Field がファイルを読み込んで舞台を構築する時に、それぞれの荷物の種類に応じてインスタンスを作らないとだめだぞ。
…ここは、Javaお得意のリフレクションの出番ですか!(リフレクションを使えば、クラス名からインスタンスを生成したりできるみたい)
Class.forName("StepBox") で、StepBox のクラス型クラスをゲッツ! んで、getConstructor(Class[])で、コンストラクタをゲッツゲッツ! そして newInstance(Object[]) で、インスタンスを生成してゲッツゲッツゲッツ!

はぁ… はぁ…

すげーぞJava!これ便利すぎ!ぶっちゃけありえなーい!!
という事で、Box に追加。

■ 追加: Box
static な getBox(String classname, Field field, Point pos) メソッドを持つ。classname の Box を、field と pos を使ってコンストラクタを呼んでインスタンスを返すファクトリーメソッド。
つまり、Box の派生クラスは (Field, Point) のパラメータで呼べるコンストラクタを提供する。

次に、主人公。まー、主人公はほとんど考える所ないか。

■ Keeper
主人公(倉○番)を表すクラス。
コンストラクタで、初期位置を設定。荷物と同じく、位置はゲッタだけ提供して、動かすには Move(direction) で。Key に接続できるように、Observer を継承。Key から Update されたら、渡された方向へ Move する事にしませう。
Move する時に、移動先に Box があれば、Pushしてみる。true が返ってきた(動かせた)ら、移動する。
Box と同じく、移動先の問い合わせを Field にするので、コンストラクタで Field も渡す必要があるな。

このぐらいでしょうか。あとは、GUI部分だけど、この辺は後で考えるとして。
interface の使いどころが思いつかなかったのが心残り。実装の時に思いつくかも知れないですけども。
ってか、UMLで描くべきか…。ごめんなさい、UMLは勉強中で、描くのに時間がかかりすぎです。orz
何か良いアイデアがあればコメントください。戯言

Posted at 00:28 / 30 Comments / 0 TrackBacks / Category : Study

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。