Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
コルーチンで
C++でも楽々ゲーム作成!
           Or
 Hamigaki.Coroutineの紹介


                         @ArGxento
概要

   コルーチンとは?

  ゲーム開発への応用

Hamigaki.Coroutineの紹介

      その問題点
コルーチンとは?

• 普通のサブルーチンは、一度脱出してしまうと
  次に呼び出す時はリセットされてしまう

• コルーチンは脱出しても、次に呼び出したら前
  回抜けた場所から再開できる。

• → ビデオの一時停止と停止の違い
• 一般的には、たくさんのものから一つづ
  つ選んでくる処理などによく使われる

• ゲーム内のキャラクターの動きや、アニ
  メーション処理を作るのに便利
• 具体的には…

 1ターンごとに1歩ずつプレイヤーに近づき、攻
  撃範囲内に一度でも入ったら数ターン攻撃し
  て逃げていく敵

  • 近づいている/攻撃している/逃げている を識別す
    るフラグと、攻撃したターン数のカウンタが必要

  →どうやって保持する?もっとフラグが増えたら?


     コルーチンならすべて解決!
コルーチンを使わない場合                              コルーチンを使った場合
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;
}



                      面倒なフェーズ管理とおさらば
• C#やLuaといった言語には標準で搭載さ
  れており、一つの強みだった。

• しかし、C++にはない

• C++ユーザから要望が強かった
 →満足なライブラリがなかなか出なかった
そこでBoost.Coroutineが登場!
…あれ、開発止まってる?


     …これ動かないんじゃ…


   …むしろ今だと入手すら困難…

…でも他にいいライブラリもあんまりないし…
そこで、郵便はみがき氏が開発した
     Boost.Coroutineの上位互換ライブラリ


      Hamigaki.Coroutine
http://sourceforge.jp/projects/hamigaki/



                 特徴:
            Windowsでも動く
               使いやすい
          ライセンスがBoostと同じ
Hamigaki.Coroutineの使い方
• 通常の関数の引数+コルーチン制御用の引数な
  関数を定義

• 目的の引数と返り値の型をテンプレート引数に
  取ったオブジェクトを宣言

• 上のコンストラクタに目的の関数を入れてコ
  ルーチン生成
#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); // コルーチン自身
• self.yield に返り値を渡して、一時中断できる


• self.yieldの返り値によって、二回目以降の呼び出し
  の引数が分かる


• self.exit または通常の return で、コルーチンの
  終了を通知できる → 次からは呼び出せなくなる


• コルーチンが終了すると、例外が投げられる
問題点
• 終了時に例外を投げられると困る
   
   → 例外の代わりにBoost.Optionalを使って通知する
   オプションもある



• 一度終了すると初期化して再利用できない

   → コンストラクタを呼んで初期化する管理クラス
    に内包させた方がいいかも
ご清聴ありがとうございました
                  再掲
        Hamigaki C++ Libraries
http://sourceforge.jp/projects/hamigaki/

More Related Content

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