プロジェクト演習Ⅳインタラクティブゲーム制作
最終回関数を持ち歩こう~ Boost 入門~
今日のメインディッシュ
• 関数を持ち歩く方法を覚えよう–クラスの設計相談でも、あるクラスから
別のクラスが見えない、という声が多い–関数単位で持ち運べたら便利かも?
• 関数ポインタから関数オブジェクトまで– C 言語レベルでは「関数ポインタ」という
概念がこれを実現できる– C++ になると話が複雑になるので、 Boost
を使って「関数オブジェクト」を利用する
おさらい
• ポインタのメリット– スコープを飛び越えて変
数やオブジェクトを使い回せる
– 複数の変数が存在する時に、わざわざ処理を書き分けなくても、ポインタが指し示す対象を切り替えれば、同じコードで処理が済む• → こんな感じ
string str1 = “hogehoge”;string str2 = “hugehuge”;
string *p_str = &str1;
// 状況に応じてポインタを更新if() { p_str = &str2;}
// p_str が指している対象を処理cout << (*p_str) << endl;
関数ポインタを使ってみる
• 同じ事が関数で出来たら便利なんじゃなかろうか?– 複数の関数が存在する
時に、わざわざ処理を書き分けなくても、関数ポインタが指し示す対象を切り替えれば同じコードで処理が済ませられる• → こんな感じ
void func1();void func2();
// ある関数内にてvoid (*fpFunc)(void) = func1;
// 条件次第で参照先の変更if() { fpFunc = func2;}
// 関数ポインタ経由で呼び出しfpFunc();
しかしこれには問題が
• 関数ポインタは C 言語の機能なので、
クラスのメンバ関数に対応していない
• 厳密には static メンバなら大丈夫なのだが、このご時世にこれは致命的
何故かというと
• メンバ関数呼び出しには、必ず「どのインスタンスに対する呼び出しなのか」が必要– instance.func() か pointer->func()
• クラス内で自分のメンバを呼ぶのも、暗黙の内に this->func() と解釈される
• 関数ポインタは引数をセットにできない
そこで関数オブジェクト
• C++ では関数ポインタを拡張した、メンバ関数ポインタなるものが存在する–だが記号の扱いとかがややこしくて面倒
• ここでは Boost ライブラリの bind とfunction という機能を使ってみよう– Boost で提供されるこれらの機能を使って
「関数オブジェクト」として扱う
更に発展させて
• 関数オブジェクトを利用して、以前に紹介したタスクシステムに相当するものを作れる–共通の基底クラスをどうこうする必要がない
• signal/slot という機能を使う–タスクシステムに限らず、あるイベントが
発生した際に関連する関数を一斉に呼びたい、なんて時にも便利
おまけ
• これさえ出来れば優秀なゲームプログラマになれること間違いなし!の極意
• 間違いないっす、やばいっす
それは…
自分で問題を発見して解決するための技術
ggrks
半分冗談で、半分本気です
• 何故ならこの授業の目的は「自律思考可動型電算遊戯構築者育成」だから–全部誰かから教わったことだけでゲームが作
れると思ったら大間違いである!
• でも調べろって言われたって、どう調べればいいのか分からないんだよ!–それを今日は伝授します
知識・技術のレイヤーを考える
• まず、作ろうとしているものにどんな技術が必要かを見定める
• それを構築するには何を使えばいいのか– ライブラリの選定、 API リファレンス参照
• どのように組めばいいのか– サンプルコード、デザインパターン、設計論
• どのように書けばいいのか– 言語の文法、概念など
世に出回っている知識の傾向
• それを構築するには何を使えばいいのか–Web や本でもよく転がっている–数には困らないが、質はピンキリ
• どのように組めばいいのか–一番分かりづらく、伝えにくい部分–授業で重視したいのはここ
• どのように書けばいいのか–一番の根っこの部分–ここは独学独習を強く推奨
今回のネタ
• 私のブックマークからゲーム制作技術に関するサイトをピックアップして紹介
• 一気に全部を理解しようとしなくていい–いわゆる RPG で「全部の宝箱を開けないと
気が済まない人」は注意してください
C++ の文法・概念編
• 「ロベールの C++教室」– http://www7b.biglobe.ne.jp/robe/cpphtml/–基本的な文法や概念はここでだいたい揃う– 1部の内容は必須– 2部も網羅しておきたい• テンプレートに関しては後回しでもよい• 4部で STL の使い方だけ触れているのでそちらを
STL の使い方
• 「 C++ STL 」でググれ!–いつも vector配列をメインに使っているが、
それ以外にも便利なものが色々ある–私も使い方をど忘れしたときはよく調べます–うちの研究室の資料もどうぞ
• http://www.teu.ac.jp/aqua/GS/text/PDF/Container.pdf
その他言語の基本系
• 「 C++ クラス設計に関するノート」– http://www.ogis-ri.co.jp/otc/hiroba/technical/CppDesignNote/–文法について理解できたら是非
• ロベールが合わなかった人向け–「目指せプログラマー!」
• http://www5c.biglobe.ne.jp/~ecb/cpp/cpp00.html–「猫でもわかるプログラミング」• http://homepage2.nifty.com/c_lang/
言語を学習する際の地図(特に C++ の場合 )
• 言語のコア機能– いわゆる「文法」– C++ の場合はクラス
やテンプレートなどが目玉機能になる
• 標準ライブラリ– C の標準関数群– C++ のテンプレート
を利用したライブラリ(STL)
• 拡張ライブラリ– Boost
• C++ 次期標準機能– Win32SDK, Cocoa
• プラットフォーム API– DirectX, OpenGL
• 描画 API– DXLib, FK
• ラッパーライブラリ
– デバイス系の SDK など
今日のおすすめ
• 「 Let’s Boost 」– http://www.kmonos.net/alang/boost/– Boost の使い方を学ぶならまずここ• 日本語だしね!
–文字列をカンマ区切りにばらす、などの処理もクールに実現できる• ただし、 C++ の言語機能をちょっとディープに
理解していないときついかも
近年充実してきたインデックス
• 「全日本学生ゲーム開発者連合 (全ゲ連 ) 」– http://d.hatena.ne.jp/zengeren/
–学生連合と言いつつ、結構色んな会社の中の人が講演に出たりしていてゴージャス
–同人サークルも多く、実戦的な内容も多い
定番どころ
• 「マルペケつくろーどっとコム」– http://marupeke296.com/–このサイトがあれば私は要らない!かも– C++文法の基礎知識は”前提”になっている–要素技術と、そのサンプル、設計論にまで踏
み込んでいるので非常に有用–著者のレベルアップにより、内容がどんどん高度で複雑になっているので注意
要素技術のフォローアップ
• アニメーションの原理、 3 次元回転概論–「 TMPSwiki 」• http://www.tmps.org/index.php?TMPSwiki• 「 3D空間における回転の表現形式」は必読!
• ネットワーク通信–「 Geek なぺーじ –winsock プログラミン
グ」• http://www.geekpage.jp/programming/winsock/• 私が通信処理を学んだのはここ
Windows API系• 「 Toru の DirectX プログラミング講座」– http://toruweb.web.fc2.com/index.html– DirectInput はここで学びました
• 「 VC++小手先のテクニック集」– http://www.alpha-net.ne.jp/users2/uk413/vc/index.html–Windows ならでは細かい処理や設定など
• 「猫でもわかるプログラミング」もWindows固有の内容には強いです
OpenGL• 「床井研究室」– http://marina.sys.wakayama-u.ac.jp/~tokoi/–うちの研究室でもお世話になっている人が多
い、 OpenGL を使ったテクニックと実装例が豊富な優良サイト
• 「 WisdomSoft 」– http://wisdom.sakura.ne.jp/– OpenGL だけでなく、 Win32 や DirectX 、
C++ 基礎までも淡々とまとまっていてgood.
アルゴリズム・ゲームデザイン
• 「地球にやさしいアルゴリズム」– http://itpro.nikkeibp.co.jp/article/COLUMN/20070109/258278/?ST=develop
–言語の文法は分かるけど、使いこなしがイマイチ…という人のトレーニングにおすすめ
• 「 Gamers Resource 」– http://iwatam-server.sakura.ne.jp/game/index.html–ゲームデザインについての考察。プログラ
マーもたまには読んでおくと良いやも
私が研究中にお世話になった所
• 筑波大学の藤澤先生の wiki– http://www.slis.tsukuba.ac.jp/~
fujis/cgi-bin/wiki/index.php?FrontPage
–プログラミングに関わる有用な Tips が豊富–研究レベルで役に立つような内容なので
ちょっと早いかもしれないが、ブクマ推奨
もう一度注意
• 「 RPG で全部の宝箱を開けないと気が済まない人」は気をつけること!
• 最初から全部のアイテム、全部の魔法が使えるゲームはそうそうない–あったらあったでどういうゲームデザインか
気になりますが• 最低限の言語基礎力があれば、後は必要
に応じて参照すればどうとでもなる!
期末課題について
• 以下のものを 2/8(金 )正午までに提出– [ 必須 ]チームで開発している現状のプロ
ジェクトデータ (ビルドが通るもの )• ゲーム本体以外にも開発したものがあれば一緒に
– [選択 ] 授業の中で学んだ要素を活かして制作したプログラム• エフェクト・シェーダ・ AI• その他独学で得た技術を盛り込んでも可