280 likes | 379 Views
プロジェクト演習 Ⅳ インタラクティブゲーム制作. 最終 回 関数を持ち歩こう ~ Boost 入門~. 今日のメインディッシュ. 関数を持ち歩く方法を覚えよう クラス の 設計 相談でも、あるクラスから 別のクラスが見えない、という声が多い 関数単位 で持ち運べたら便利かも? 関数ポインタから関数オブジェクトまで C 言語レベルでは「関数ポインタ」という 概念がこれを実現できる C++ になると話が複雑になるので、 Boost を使って「関数オブジェクト」を利用する. おさらい. ポインタのメリット スコープを飛び越えて変数やオブジェクトを使い回せる
E N D
プロジェクト演習Ⅳインタラクティブゲーム制作プロジェクト演習Ⅳインタラクティブゲーム制作 最終回 関数を持ち歩こう ~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 • その他独学で得た技術を盛り込んでも可