ども、たくあんっす。
学際イベント運営、GESメンバーお疲れさまでした。
参加できなかったのが激しく残念です。
気を取り直して今日はコルーチンについて語ります。
コルーチンはC#、Lua等で実装されているものですがやろうと思えばC言語でもそれっぽいものを作れるので
是非読んで欲しいっす!
あとプチデジについては総評?みたいなのがまだあるようなので、その後に軽く私の方も触れます。
[0回]
さて今回もコルーチン(coroutine)についてgoogle先生に聞くと・・・
プログラミングの構造の一種。
サブルーチンがエントリーからリターンまでを一つの処理単位とするのに対し、
コルーチンはいったん処理を中断した後、続きから処理を再開できるモノとありました。
どういう事かと言うとそのまま文字通りです。
例えば順番に
タイトル文字表示
↓
サブタイトル文字表示
↓
メニュー文字表示
という状態遷移の処理をしたいときに
これを一つの関数内で行います。
しかし、ただ順番で書くだけではと全て一気に実行されてしまうし、かといって
Stateフラグを作って毎回状態を判断してswitchというのもめんどい、
もしかしたら各処理を3秒待ってからタイトル、二秒待ってから、サブタイトルと
いった具合にさらに状態遷移が複雑になるととても大変になります。
そんな時コルーチンです。
これはそんなときにとても役立ちます。
C#での実装を説明してみます。
というのもコルーチン実現には「 yield 」キーワードが必要なのですが、C,C++には多分ないです。
yieldキーワードについては
http://wisdom.sakura.ne.jp/programming/cs/cs2_8.html
ありそうな気もしますが私にはわからん。
C言語でですが、コルーチンを実現していたモノがあったのでペタリしときます。
http://arms22.blog91.fc2.com/blog-entry-134.html
ここでとりあえず実装していたので、自分なりに入れてみたい人は参考にして下さい。
あとライブラリで入れたいなら、Boostにそれっぽいものがあるようなので、興味ある方は調べて下さい。
話はもどって、C#での実装ですが。
http://ufcpp.net/study/csharp/sp2_microthread.html#coroutine
にがっつり説明があるのでどういう動きなのかは読んでください。
簡単に書くと、ある関数内の処理をちょっと止めといて
次に処理がきたときに止めといた所から始めるって意味で、
その目印(再開する場所)がyieldのわけです。
こればっかりは使わないと掴みにくいかもしれないですが、このコルーチン構造を作ってしまえばかなりゲーム作りが楽になると思います。
「でも、C#じゃねぇかよっ!」
と言われそうなので、C言語で実装しているモノを上にはっといたので気になる方はどぞ。
私も実装をC++で実装できるか考えようかと思いましたがしんどいのでやめましたw
まぁ冗談はさておき、C#での構造を知れば、なんとなくは作りやすくなるのではないかと思ったんですが・・・
思ったんですが、すいません。やっちまいました;
コード見ればわかりますが、コレクションクラスのイテレータ構文を仕様しているので完全に説明する順番を間違えましたね。たぶん説明しようにも書く事多すぎて意味わからなくなると思います。
書いてて気づいた。
なのでその辺を、次回以降に説明して行きます。(暇があれば)
今回はコルーチンと言う構造、考え方がある事を抑えて置いて下さい。
それとC/C++で実装してやったぜって方は是非どうやったか教えて下さいね。
調べれば色々やり方はありますから。
以上!!
いやー今回参考サイトばかりで申し訳ない。
正直コード書くのは大変。
あとまいどの事ながら誤字、脱字は勘弁を。
睡魔がブログアップの邪魔をするんだ・・・
PR
COMMENT
無題
boostのasioの階層深くにcoroutine.hppとyield.hppがあります。
実装が驚くぐらいスッキリしていて見やすかったです。
無題
そう言ってもらえるとうれしいです。
>boostのasioの階層深くにcoroutine.hppとyield.hppがあります。
おぉなるほど~。
情報提供に感謝!!