2011-06-17 4 views
2

私はDirectX 9とC++を使って簡単なゲームを作っています。私はSDKのGUIを見ましたが、私はもっと単純なものを実装できると思います。C++ GUIイベント/メッセージング設計

私が必要なのは、ウィンドウ、ラベル、ボタン、テキストボックス、チェックボックスです。

すべてを継承した基本クラスGUIObjectを作成しました。それは、サイズやフォーカスなどの基本を含んでいます。次に、派生クラスGUILabelは、すべてrender()、update()およびその他のものを定義します。

私の質問は、クリックなどのイベントをどのように処理するかです。私はGUILabel :: Click()を使って、現在のインスタンスのテキストメンバー値に基づいてすべての可能性を定義しました。間違っていると感じました。クリックする必要があるすべてのラベルは、GUILabelクラスで定義する必要があります。私はそれを各ゲーム州のコードに移したいと思います。

そこで、GUILabel :: Click()が引数として関数ポインタを取るようにしました。しかし、私は状態のクラスメンバメソッドを静的なものにする必要があることに気付きました。(実際には静的なものを除いて静的でない限り)、あるいはGUIObjectクラスにも渡す必要があります。それは行く方法ですか?

ゲーム状態内でGUILabel(またはボタンなど)の派生を定義し、必要なアクションをオーバーライドできますか?そして、その状態で必要なコントロールがあれば、それをしますか?

イベント処理を実装する適切な方法は何ですか?

+0

私は私の場合には、ゲームの状態は、いくつかのGUI要素(ウィンドウを言う)に由来していると、すべてのアクションが定義されている場合、私はJavaのSwingのようにこれを設計する方法を見しようとしていますそこには独自のメソッドがあり、コールバックとして(boostライブラリを使用して)うまくいけばコールバックとして渡されます。これがどうなるか見てみましょう。私はこれをあまり好きではなく、ゲームの肉を得るためにそれをハックしようとしましたが、ゲームのほとんどがこのGUIのやりとりに依存しているのを見て、ちょっとした計画が長く進んでいると思います... – Nick

答えて

3

boost::signalsなどのシグナリングライブラリを使用して、GUIオブジェクトと各コールバックがトリガする基本イベントとの間のインターフェイスを柔軟に定義できるようにすることができます。基礎となるイベントに応答するために、ステータスインジケータなどのGUI要素が必要な逆の関係にも便利です。

1

コールバック/クリックイベントでは、boost :: function/boost :: bindを使用します。 私のGUIフレームワークでは、2つの異なる抽象クラスInputHandlerとRenderableを使って、タッチやレンダリングを処理していました。これは、(UILabelのような)クリック可能である必要のないコンポーネントが無駄なメソッドを実装する必要がないという設計につながります。

HTH、 アレックス

関連する問題