Location via proxy:
[ UP ]
[Report a bug]
[Manage cookies]
No cookies
No scripts
No ads
No referrer
Show this form
Submit Search
Submit Search
Upload
コルーチンでC++でも楽々ゲーム作成!
•
5 likes
•
7,603 views
コルーチンの概要とゲーム開発への応用、C++用コルーチンライブラリHamigaki.Coroutineの使い方について説明します。
Read less
Read more
1 of 15
Download now
Download to read offline
More Related Content
コルーチンでC++でも楽々ゲーム作成!
1.
コルーチンで C++でも楽々ゲーム作成!
Or Hamigaki.Coroutineの紹介 @ArGxento
2.
概要
コルーチンとは? ゲーム開発への応用 Hamigaki.Coroutineの紹介 その問題点
3.
コルーチンとは? • 普通のサブルーチンは、一度脱出してしまうと
次に呼び出す時はリセットされてしまう • コルーチンは脱出しても、次に呼び出したら前 回抜けた場所から再開できる。 • → ビデオの一時停止と停止の違い
4.
• 一般的には、たくさんのものから一つづ
つ選んでくる処理などによく使われる • ゲーム内のキャラクターの動きや、アニ メーション処理を作るのに便利
5.
• 具体的には… 1ターンごとに1歩ずつプレイヤーに近づき、攻
撃範囲内に一度でも入ったら数ターン攻撃し て逃げていく敵 • 近づいている/攻撃している/逃げている を識別す るフラグと、攻撃したターン数のカウンタが必要 →どうやって保持する?もっとフラグが増えたら? コルーチンならすべて解決!
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.
• C#やLuaといった言語には標準で搭載さ
れており、一つの強みだった。 • しかし、C++にはない • C++ユーザから要望が強かった →満足なライブラリがなかなか出なかった
8.
そこでBoost.Coroutineが登場!
9.
…あれ、開発止まってる?
…これ動かないんじゃ… …むしろ今だと入手すら困難… …でも他にいいライブラリもあんまりないし…
10.
そこで、郵便はみがき氏が開発した
Boost.Coroutineの上位互換ライブラリ Hamigaki.Coroutine http://sourceforge.jp/projects/hamigaki/ 特徴: Windowsでも動く 使いやすい ライセンスがBoostと同じ
11.
Hamigaki.Coroutineの使い方 • 通常の関数の引数+コルーチン制御用の引数な
関数を定義 • 目的の引数と返り値の型をテンプレート引数に 取ったオブジェクトを宣言 • 上のコンストラクタに目的の関数を入れてコ ルーチン生成
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.
• self.yield に返り値を渡して、一時中断できる •
self.yieldの返り値によって、二回目以降の呼び出し の引数が分かる • self.exit または通常の return で、コルーチンの 終了を通知できる → 次からは呼び出せなくなる • コルーチンが終了すると、例外が投げられる
14.
問題点 • 終了時に例外を投げられると困る
→ 例外の代わりにBoost.Optionalを使って通知する オプションもある • 一度終了すると初期化して再利用できない → コンストラクタを呼んで初期化する管理クラス に内包させた方がいいかも
15.
ご清聴ありがとうございました
再掲 Hamigaki C++ Libraries http://sourceforge.jp/projects/hamigaki/
Download now