プロジェクト演習Ⅳ インタラクティブゲーム制作 最終回 関数を持ち歩こう ~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/cgibin/wiki/index.php?FrontPage – プログラミングに関わる有用なTipsが豊富 – 研究レベルで役に立つような内容なので ちょっと早いかもしれないが、ブクマ推奨 もう一度注意 • 「RPGで全部の宝箱を開けないと気が済 まない人」は気をつけること! • 最初から全部のアイテム、全部の魔法が 使えるゲームはそうそうない – あったらあったでどういうゲームデザインか 気になりますが • 最低限の言語基礎力があれば、後は必要 に応じて参照すればどうとでもなる! 期末課題について • 以下のものを2/8(金)正午までに提出 – [必須]チームで開発している現状のプロジェ クトデータ(ビルドが通るもの) • ゲーム本体以外にも開発したものがあれば一緒に – [選択]授業の中で学んだ要素を活かして制作 したプログラム • エフェクト・シェーダ・AI • その他独学で得た技術を盛り込んでも可
© Copyright 2024 ExpyDoc