読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

メイン関数概論?

http://d.hatena.ne.jp/nagoya313/20100604/1275655953でゲームにおけるメイン関数についてグダグダ語ってますが、また新たなひらめきがあったのでメモしておきます。
http://d.hatena.ne.jp/nagoya313/20100914/1284459662で、for_eachを使ったメッセージループが書けることが判明したのでそれのレンジを返す関数を書いてやればいいのではという発想です。

pstade::oven::any_range<int, boost::forward_traversal_tag> process_message() {
  return pstade::oven::iteration(0, [](int) -> int {
    MSG message;
    return PeekMessage(&message, nullptr, 0, 0, PM_NOREMOVE);
  }) | pstade::oven::taken_while([](const int x) -> bool {
    if (x) {
      MSG message;
      const BOOL result = GetMessage(&message, nullptr, 0, 0);
      if (!(result && ~result)) {
        return false;
      }
      TranslateMessage(&message);
      DispatchMessage(&message);
    }
    return true;
  });
}

取り敢えず書いたのがこれです。以下の様に使えます。

int WINAPI WinMain(const HINSTANCE inst, HINSTANCE, LPSTR, const int cmd_show) {
  // ウィンドウとかを生成
  pstade::oven::for_each(process_message(), [](int) {
    // ゲームメインループを書く
  });
  return 0;
}

WinMain関数が返す値はmessage.wParamが守れてないことや、渡すファンクタがintを取らなければいけないのにとった値にあまり有用性がないという問題が残るのをなんとかしたいところですが、雰囲気大分C++っぽくなってる気がします。