2011-07-18 8 views
1

ああ、こんにちは。私はいくつかの2Dタイルベースのゲームで自由な時間に働いているジュニアJava開発者です。今では、さまざまなタイプのオブジェクトが互いにどのように相互作用するのか、ゲームの基本的なものを実装しようとしています。 シングルトンティッカー(独自のスレッドで実行中)がサブスクライブされたオブジェクトに.tick()を通知すると、それらのオブジェクトは以前に割り当てられたコマンドオブジェクトを実行します。今私は、いくつかの呪文をチャネリング1のお尻を蹴ったり上のポイントに実行されているような、より複雑なアクションのスケルトン実装を書きたいuhmのようなトリッキーなアクションの抽象実装

abstract class Character extends AbstractActing { 

    void tick() { 
     action.execute(); 
    } 

    private void pickUp(Item item) { 
     inventory.add(item); 
    } 

    private IAction action; 

    //... 

    class PickUp implements IAction { 
     void execute() { 
      //check if allowed to do 
      pickUp(item) 
     } 

     PickUp(Item item) { 
      this.item = item; 
     } 

     private Item item; 
    } 
} 

:いくつかのオブジェクトを拾うような 実装するシンプルなワンダニの活動は次のように、非常に簡単でした地図。私は、これらの複雑なアクションを表すオブジェクトが、内部で単純なアトミック命令のキューにそれらを埋め込んでいると思います。たとえば、 "Walk(Location x)"コマンドは、内部でPathfindingアルゴリズムを使用して "DoOneStep(Direction d)"のキューを作成し、途中で何かが発生した場合に再構築することができます。 問題は、1つのアトミックステップでは、Characterの速度や地面タイプのようにさらに多くの情報を実行する必要があることです。ところで、キャラクターのスピードに応じて、私はキャラクターの本当の位置を1ダニごとに変えたくないかもしれません。私は、計算に関連するオブジェクトを観察し、状態を更新するAction内にいくつかのステップ実行オブジェクトを追加する必要があると思います。

私のクエストオン(最終的に!)は - 私が瞑想するためにいくつかのよく知られたデザインパターンがありますか?私のコードは、すべての編集でわかりにくくなり、継承できなくなります。多分私は演技システム全体を書き直すでしょうか?

答えて

2

State patternステートマシンパターンとも呼ばれます(有限状態マシンの数学的理論に基づいているため)を使用することを検討してください。キャラクター(またはそのような他の種類のゲームオブジェクト)は、常に正確に1つの状態(可能な状態の所定の集合から選んだ)であり、特定のイベントは他の状態への遷移を引き起こすことができるという考えがある。次に、tick()メソッドは、現在の状態に応じて異なるアクションを実行できます。このパターンのより高度なバージョンは、異なる状態のクラスを持ち、状態クラスのインスタンスを使用して、例えば、あなたがその州にいた期間あなたのIAction概念はessentialy状態と同じものであるように、あなたのケースでは、可能性のある状態等WalkingPickingUpIdle

ある実際に、あなたはほとんど、このパターンを自分で発明しました。だから私はあなたが正しい方向に向かっていると思う。

編集:具体的には、具体的には、IActionがアトミックであるという要件を削除することをお勧めします。代わりに、それは数ティックの間続くかもしれません。 IAction.execute()は、所望の経路に沿って小さな距離を歩くなど、1つのチックの過程で実行され得るほど多くの動作を実行するだけでよい。アクション自体は、例えば、

(ヒストリカルノート:元のUnreal Engineは州に基づいています(新しいバージョンもそうであると思います) - たとえばコーディングするときなどに、ターゲット位置がどこにあるかを把握してください。カスタム武器では、FiringReloadingIdleなどの可能な状態ごとにコードを1つのセクションに分割します。

+0

大変ありがとうございます!ステートマシンがぴったりのようだ – 0andvoid

関連する問題