1

私は小さなゲームをしようとしています.私のゲームにはいくつかの正方形があり、ユーザーがこれらの正方形をクリックすると強調表示されます. この効果を得るために、私は を使用glutMouseFuncしていglutTimerFuncます。

ユーザーが画面をクリックすると、ピクセルが選択され、強調表示する必要がある正方形が特定されます。正方形が識別されたら、 を呼び出しますglutTimerFunc。登録されている関数glutTimerFuncは、色の各コンポーネントの値を、私が定義した最大値に達するまで 0.01 ずつ増やします。その後、この値は最小値に戻ります。

glutTimerFunc60 ミリ秒で実行すると、ほぼ滑らかな輝きの効果が得られます。

私の問題は、2 つの四角形を非常に速くクリックすると、最初の四角形で効果が開始されますが、終了しないため、四角形が強調表示されたままになり、2 つ目の四角形が全体の効果を発揮することです。すべての四角を狂ったようにクリックすると、すべての四角が強調表示されました。

他の四角をクリックしてもこの光る効果を止めるにはどうすればいいですか?

ここにコードのスニペットがあります

void Memoria::shineEffect(GLint value) {

    if(value == 1) {
        for(GLint i = 0; i < 3; i++) {
            if(colors[selectedSquare][i] > 0) {
                colors[selectedSquare][i] += COLOR_INCREASE;
                if(colors[selectedSquare][i] >= MAX) {
                    colors[selectedSquare][i] = MAX;
                    value = -1;
                }
            }
        }
        glutTimerFunc(FPS, timeWrapper, value);
    }
    else {
        if(value == -1) {
            for(GLint i = 0; i < 3; i++) {
                if(colors[selectedSquare][i] > 0) {
                    colors[selectedSquare][i] -= COLOR_INCREASE;
                    if(colors[selectedSquare][i] <= MIN) {
                        value = 0;
                        colors[selectedSquare][i] = MIN;
                    }
                }
            }
            glutTimerFunc(FPS, timeWrapper, value);
        }
    }
}

timeWrappershineEffectパラメータで渡された値が 1 または -1 の場合に呼び出します。

4

1 に答える 1

1

shineEffect関数が少なくとも1つのハイライトループを通過し、ハイライトされたアイテムが変更された場合は停止する必要があります。これは、OpenGLやGLUTの問題というよりも、UIコードの設計上の問題です。

実装する必要のあるメカニズムは非常に簡単です。

  • updateHighlightsすべての関数に対して1回インストールしglutTimerFuncます:この関数は、クリックされたすべての要素のハイライトを更新する役割を果たします。
  • 要素のキューを作成します。要素がクリックされるたびに、その要素をキューに追加します。

関数によって実行されるタスクは次のupdateHighLightsようになります。

  • キューに1つの要素が含まれている場合は、プログラムですでに行っているように、そのハイライトを繰り返します。
  • キューに複数の要素が含まれている場合、キュー内の要素ごとに、
    • ハイライトサイクルをステップします
    • サイクルが終了し、要素が最後ではない場合は、要素をキューから削除します

これがあなたの問題に対するもう一つのおそらくもっと柔軟な見方です。

Glutイベントループ機構は非常にシンプルな設計です。「アイドル作業」コードを配置するフックは1つしかないため、他の関数のリストを呼び出す関数をそこにインストールする方がおそらく柔軟性があります。次に、そのリストをsetプリミティブで変更して、アイドル時間中に実行する特定のタスクをインストールまたは削除できます。これは、GLUTの「1つの機能」アプローチよりもはるかに柔軟である可能性があります。

たとえば、現在のハイライトコードを、ハイライトする要素を含む構造体を使用して1つの関数に分離し、その要素がハイライトサイクルを通過してアクティブでなくなったときに、関数をリストから削除することができます。

C ++を使用しているので、これらすべての機能をクラスに簡単にバンドルできるはずです。

  • アイドル状態のタスクのリスト用の1つのクラス
  • アイドルタスク用の1つの基本クラス
  • 正方形を強調表示するための1つの派生アイドルタスククラス(正方形とアクティブステータスのフィールドを含む)
  • アクティブな正方形を追跡するための1つのクラス。これにより、簡単に非アクティブ化して、新しいアクティブな正方形に置き換えることができます。これは関数によってアクセスされglutMouseFuncます。
于 2012-12-17T19:29:50.193 に答える