プロジェクト演習Ⅳ インタラクティブゲーム制作 最終回 関数を持ち歩こう ~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++教室」 – – 基本的な文法や概念はここでだいたい揃う – 1部の内容は必須 – 2部も網羅しておきたい テンプレートに関しては後回しでもよい 4部でSTLの使い方だけ触れているのでそちらを
STLの使い方 「C++ STL」でググれ! – いつもvector配列をメインに使っているが、 それ以外にも便利なものが色々ある – 私も使い方をど忘れしたときはよく調べます – うちの研究室の資料もどうぞ
その他言語の基本系 「C++クラス設計に関するノート」 – – 文法について理解できたら是非 ロベールが合わなかった人向け – 「目指せプログラマー!」 – 「猫でもわかるプログラミング」
言語を学習する際の地図 (特にC++の場合) 言語のコア機能 – いわゆる「文法」 – C++の場合はクラスや テンプレートなどが 目玉機能になる 標準ライブラリ – Cの標準関数群 – C++のテンプレートを 利用したライブラリ (STL) 拡張ライブラリ – Boost C++ 次期標準機能 – Win32SDK, Cocoa プラットフォーム API – DirectX, OpenGL 描画 API – DXLib, FK ラッパーライブラリ – デバイス系の SDK など
今日のおすすめ 「Let’s Boost」 – – Boostの使い方を学ぶならまずここ 日本語だしね! – 文字列をカンマ区切りにばらす、 などの処理もクールに実現できる ただし、C++の言語機能をちょっとディープに 理解していないときついかも
近年充実してきたインデックス 「全日本学生ゲーム開発者連合(全ゲ連)」 – – 学生連合と言いつつ、結構色んな会社の中の 人が講演に出たりしていてゴージャス – 同人サークルも多く、実戦的な内容も多い
定番どころ 「マルペケつくろーどっとコム」 – – このサイトがあれば私は要らない!かも – C++文法の基礎知識は”前提”になっている – 要素技術と、そのサンプル、設計論にまで踏 み込んでいるので非常に有用 – 著者のレベルアップにより、内容がどんどん 高度で複雑になっているので注意
要素技術のフォローアップ アニメーションの原理、3次元回転概論 – 「TMPSwiki」 「3D空間における回転の表現形式」は必読!3D空間における回転の表現形式 ネットワーク通信 – 「Geekなぺーじ –winsockプログラミング」 私が通信処理を学んだのはここ
Windows API系 「ToruのDirectXプログラミング講座」 – – DirectInputはここで学びました 「VC++小手先のテクニック集」 – – Windowsならでは細かい処理や設定など 「猫でもわかるプログラミング」も Windows固有の内容には強いです
OpenGL 「床井研究室」 – – うちの研究室でもお世話になっている人が多 い、OpenGLを使ったテクニックと実装例が 豊富な優良サイト 「WisdomSoft」 – – OpenGLだけでなく、Win32やDirectX、 C++基礎までも淡々とまとまっていてgood.
アルゴリズム・ゲームデザイン 「地球にやさしいアルゴリズム」 – – 言語の文法は分かるけど、使いこなしがイマ イチ…という人のトレーニングにおすすめ 「Gamers Resource」 – – ゲームデザインについての考察。プログラ マーもたまには読んでおくと良いやも
私が研究中にお世話になった所 筑波大学の藤澤先生のwiki – bin/wiki/index.php?FrontPage bin/wiki/index.php?FrontPage – プログラミングに関わる有用なTipsが豊富 – 研究レベルで役に立つような内容なので ちょっと早いかもしれないが、ブクマ推奨
もう一度注意 「RPGで全部の宝箱を開けないと気が済 まない人」は気をつけること! 最初から全部のアイテム、全部の魔法が 使えるゲームはそうそうない – あったらあったでどういうゲームデザインか 気になりますが 最低限の言語基礎力があれば、後は必要 に応じて参照すればどうとでもなる!
期末課題について 以下のものを2/8(金)正午までに提出 – [必須]チームで開発している現状のプロジェ クトデータ(ビルドが通るもの) ゲーム本体以外にも開発したものがあれば一緒に – [選択]授業の中で学んだ要素を活かして制作 したプログラム エフェクト・シェーダ・AI その他独学で得た技術を盛り込んでも可