Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
コルーチンでC++でも楽々ゲーム作成!           Or Hamigaki.Coroutineの紹介                         @ArGxento
概要   コルーチンとは?  ゲーム開発への応用Hamigaki.Coroutineの紹介      その問題点
コルーチンとは?• 普通のサブルーチンは、一度脱出してしまうと  次に呼び出す時はリセットされてしまう• コルーチンは脱出しても、次に呼び出したら前  回抜けた場所から再開できる。• → ビデオの一時停止と停止の違い
• 一般的には、たくさんのものから一つづ  つ選んでくる処理などによく使われる• ゲーム内のキャラクターの動きや、アニ  メーション処理を作るのに便利
• 具体的には… 1ターンごとに1歩ずつプレイヤーに近づき、攻  撃範囲内に一度でも入ったら数ターン攻撃し  て逃げていく敵  • 近づいている/攻撃している/逃げている を識別す    るフラグと、攻撃したターン数のカウンタが必要  →どうや...
コルーチンを使わない場合                              コルーチンを使った場合switch(this->actionPhase){ // 行動フェーズ      // プレイヤーに接近する  case 0: // 接...
• C#やLuaといった言語には標準で搭載さ  れており、一つの強みだった。• しかし、C++にはない• C++ユーザから要望が強かった →満足なライブラリがなかなか出なかった
そこでBoost.Coroutineが登場!
…あれ、開発止まってる?     …これ動かないんじゃ…   …むしろ今だと入手すら困難……でも他にいいライブラリもあんまりないし…
そこで、郵便はみがき氏が開発した     Boost.Coroutineの上位互換ライブラリ      Hamigaki.Coroutinehttp://sourceforge.jp/projects/hamigaki/            ...
Hamigaki.Coroutineの使い方• 通常の関数の引数+コルーチン制御用の引数な  関数を定義• 目的の引数と返り値の型をテンプレート引数に  取ったオブジェクトを宣言• 上のコンストラクタに目的の関数を入れてコ  ルーチン生成
#include <hamigaki/coroutine/coroutine.hpp>namespace coro = hamigaki::coroutines;typedef coro::coroutine<int(int)> coro_ty...
• self.yield に返り値を渡して、一時中断できる• self.yieldの返り値によって、二回目以降の呼び出し  の引数が分かる• self.exit または通常の return で、コルーチンの  終了を通知できる → 次からは呼び...
問題点• 終了時に例外を投げられると困る      → 例外の代わりにBoost.Optionalを使って通知する   オプションもある• 一度終了すると初期化して再利用できない   → コンストラクタを呼んで初期化する管理クラス    に内包...
ご清聴ありがとうございました                  再掲        Hamigaki C++ Librarieshttp://sourceforge.jp/projects/hamigaki/
Upcoming SlideShare
Loading in …5
×

コルーチンでC++でも楽々ゲーム作成!

7,122 views

Published on

コルーチンの概要とゲーム開発への応用、C++用コルーチンライブラリHamigaki.Coroutineの使い方について説明します。

Published in: Technology
  • Dating direct: ❤❤❤ http://bit.ly/2F4cEJi ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating for everyone is here: ❤❤❤ http://bit.ly/2F4cEJi ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

コルーチンでC++でも楽々ゲーム作成!

  1. 1. コルーチンでC++でも楽々ゲーム作成! Or Hamigaki.Coroutineの紹介 @ArGxento
  2. 2. 概要 コルーチンとは? ゲーム開発への応用Hamigaki.Coroutineの紹介 その問題点
  3. 3. コルーチンとは?• 普通のサブルーチンは、一度脱出してしまうと 次に呼び出す時はリセットされてしまう• コルーチンは脱出しても、次に呼び出したら前 回抜けた場所から再開できる。• → ビデオの一時停止と停止の違い
  4. 4. • 一般的には、たくさんのものから一つづ つ選んでくる処理などによく使われる• ゲーム内のキャラクターの動きや、アニ メーション処理を作るのに便利
  5. 5. • 具体的には… 1ターンごとに1歩ずつプレイヤーに近づき、攻 撃範囲内に一度でも入ったら数ターン攻撃し て逃げていく敵 • 近づいている/攻撃している/逃げている を識別す るフラグと、攻撃したターン数のカウンタが必要 →どうやって保持する?もっとフラグが増えたら? コルーチンならすべて解決!
  6. 6. コルーチンを使わない場合 コルーチンを使った場合switch(this->actionPhase){ // 行動フェーズ // プレイヤーに接近する case 0: // 接近中 while(getDistance(player, *this) > aimToPlayer(); attackRange){ walk(1); aimToPlayer(); if(getDistance(player, *this) <= attackRange){ walk(1); actionPhase = 1; self.yield(); } } return; case 1: // 攻撃中 // 5ターン攻撃 if(attackTurnCounter > 4){ for(int i = 0;i <= 4; i++){ actionPhase = 2; attack(player); attackTurnCounter = 0; self.yield(); } } attack(player); attackTurnCounter++; // 逃げる return; case 2: // 逃走中1 aimTo(getAngle(player) + deg(180)); aimTo(getAngle(player) + deg(180)); while(1){ actionPhase = 3; walk(2); return; self.yield(); case 3: // 逃走中2 } walk(2); return;} 面倒なフェーズ管理とおさらば
  7. 7. • C#やLuaといった言語には標準で搭載さ れており、一つの強みだった。• しかし、C++にはない• C++ユーザから要望が強かった →満足なライブラリがなかなか出なかった
  8. 8. そこでBoost.Coroutineが登場!
  9. 9. …あれ、開発止まってる? …これ動かないんじゃ… …むしろ今だと入手すら困難……でも他にいいライブラリもあんまりないし…
  10. 10. そこで、郵便はみがき氏が開発した Boost.Coroutineの上位互換ライブラリ Hamigaki.Coroutinehttp://sourceforge.jp/projects/hamigaki/  特徴: Windowsでも動く 使いやすい ライセンスがBoostと同じ
  11. 11. Hamigaki.Coroutineの使い方• 通常の関数の引数+コルーチン制御用の引数な 関数を定義• 目的の引数と返り値の型をテンプレート引数に 取ったオブジェクトを宣言• 上のコンストラクタに目的の関数を入れてコ ルーチン生成
  12. 12. #include <hamigaki/coroutine/coroutine.hpp>namespace coro = hamigaki::coroutines;typedef coro::coroutine<int(int)> coro_type;int func_body(coro_type::self& self, int a) {  // 実際の処理 for(int i = 0; i < 42 ; ++i){ self.yield(i + a); } self.exit();}coro_type func(func_body); // コルーチン自身
  13. 13. • self.yield に返り値を渡して、一時中断できる• self.yieldの返り値によって、二回目以降の呼び出し の引数が分かる• self.exit または通常の return で、コルーチンの 終了を通知できる → 次からは呼び出せなくなる• コルーチンが終了すると、例外が投げられる
  14. 14. 問題点• 終了時に例外を投げられると困る    → 例外の代わりにBoost.Optionalを使って通知する オプションもある• 一度終了すると初期化して再利用できない → コンストラクタを呼んで初期化する管理クラス に内包させた方がいいかも
  15. 15. ご清聴ありがとうございました 再掲 Hamigaki C++ Librarieshttp://sourceforge.jp/projects/hamigaki/

×