2012-01-16 22 views
3

コンテキスト:私はC++/OpenGLでシンプルなソーラーシステムシミュレーションを行っています。ポイントアンドクリックのユーザーインタラクションモデルを実装するにはどうすればよいですか?

研究:私が探して試してみたが、私は今までのウィジェットやフラッシュHCIのものに関する記事を見つけます。

問題:私は、ユーザーが役者をクリックできるようにし、その後、多分選択を解除、または何か他のものを選びたいです。一度に複数のアクターを選択することがあります。俳優が破壊されたら、私はその選択を外したい。私は俳優にそれが選ばれたことを知らせたい。

は、私がどのようにクリックがこの俳優やその俳優、または最寄りの俳優に起こったかどうかを確認するために、マウスの座標を取得する方法を知っている、と。私が経験することがないのは、相互作用をモデル化することです。私は、CSSのアクティブ、ホバー、プレスのモデルのようなものを考えることができるので、ある種の国家だと思います。しかし、私は所有権の問題に陥ります。そのアクタが削除されるか削除される必要がある場合はどうなりますか?何らかの観察者がいなければなりませんか?

明らかに私は私の目的のためにそれを試して解決するのに十分な問題を理解していません。コールバックやイベントなどの経験はありません。誰かが何か記事、ガイド、または同様のヘルプを教えてくれる?あなたが(例えばboost::shared_pointer)あなたの俳優のためのスマートポインタを使用している場合

+0

私はあなたの質問がはるかに広いと思います。 FAQから:*あなたの質問は合理的なスコープでなければなりませんあなたの質問に答える本全体を想像できれば、あなたはあまりにも多くを求めています。 –

+0

それで私の質問は「私はどうやってこれをするのですか?むしろ「どこでこれを行うのか学ぶことができますか?」 – whiterook6

答えて

1

あなたはあなたの選択のための弱いポインタを使って、簡単に所有権の問題を解決することができます。たとえば、次の

あなたはちょうどあなたがそのセットから取得する任意のポインタは無効である可能性がありますので注意してください、しかし、あなたはそれをチェックするためにかなりの力を後押しする必要が
std::set<boost::weak_pointer<Actor> > selected_actors; 

。例えば

それが選択されているとき、私はちょうどあなたの選択コードで呼ばれているいくつかの仮想メンバ関数になるだろう知っている俳優のために

、:

class Actor { 
public: 
    ... 
    virtual void on_selected() { } 
    virtual void on_deselected() { } 
    ... 
}; 

あなたはまた、俳優が必要な場合それが選択されているかどうかをを追跡するために、このようにそれを実行します。

class Actor { 
bool selected; 
public: 
    Actor() : selected(false) { } 
    ... 
    void selected() { selected = true; on_selected(); } // not virtual 
    void deselected() { selected = false; on_deselected(); } // not virtual 
    ... 
protected: 
    ... 
    virtual void on_selected() { } 
    virtual void on_deselected() { } 
}; 

希望がある!

+0

ありがとうございます。私は既に弱いポインタを使用していますが、これは所有権の問題を解決します。選択されたアクターのセットも良いアイデアです。もし削除されていれば、それをセットから削除することができます。選択された俳優のリストが大量にある場合、俳優に選択されているかどうか尋ねるのが理にかなっていますか?そうすることで、選択されたアクターのリストが、オブジェクトが選択されているかどうかの権限になります。 – whiterook6

+0

ええ、あなたはどちらかの方法で、または両方の方法でそれを行うことができます。あるいは、これがあなたのアーキテクチャに合っていれば、アクターがいくつかのグローバルセレクションマネージャーにアクセスする必要がないように、この情報を必要とする 'Actor'のすべての関数に' bool selected'を渡すことができます(例えば 'draw(bool selected)') 。 – Thomas

0

私はQtで簡単に見を持つことをお勧め。それは、あなたが望むものだけをすべて行います。ほとんどの場合、あなたはあなたが望むものを取ることができ、あなたはしないものを残すことができます。

それはまたアップをラップするための良い方法を持っている/あなたは後にしているユーザインターフェイスのより親しみやすい要素とOpenGLのコードを統合。

関連する問題