質問: ``` void main(){}//毎フレーム実行 void mouceon(){}//マウスクリック void loop(){} ``` 上のようなプログラムがあるとします、仮にマウスをクリックした場合、void mouceon()が一度だけ呼ばれるとします。 そうした場合、loopとゆう処理をmainのあとに繰り返し実行するようにしたいのです 普通は以下のようにすればいいのですが ``` bool loopon; void main(){ if(loopon){loop();} } void mouceon(){loopon=true;} void loop(){} ``` 今回は、mouceonが呼ばれるたびに、loopをクリックした回数分だけupdate後に呼び込むようにしたいのです。 ちなみに、マウス位置を引数にとり、loopに値を渡すような処理をしたいです。 なにか、そういった処理をしてくれる関数等ないでしょうか。。 eventなども考えましたが、どうもうまくいきません。。 なにかアドバイスよろしくお願いいたします
回答: こんにちは。 > > 今回は、mouceonが呼ばれるたびに、loopをクリックした回数分だけupdate後に呼び込むようにしたいのです。 > > ちなみに、マウス位置を引数にとり、loopに値を渡すような処理をしたいです。 > > > クリックされる度にその時のマウス・ポインタの位置を記録し、loop()関数へ渡したいということでしょうか? YESでしたら、そのような場合は待ち行列(queue)が使えます。C++の標準ライブラリにもstd::queueがあります。 マウス座標を例えばPoint構造体で保持する場合、`std::queue mouse_queue;`のようにしてグローバルに定義するとよいと思います。 mouseon()関数で、マウス座標を取り出してmouse_queueへエンキュー(push)します。 main()関数では、mouse_queue.empty()がfalseの時にデキュー(front → pop)してloop()関数へPointを渡せばよいです。 もし、main()関数とmouseon()関数が別スレッドで動作するようでしたら、スレッド間の排他制御が必要になります。std::mutexとstd::lock_guardを使えば簡単・確実です。