関数を持ち歩こう~Boost入門編~&おまけ - Game Science Project

Download Report

Transcript 関数を持ち歩こう~Boost入門編~&おまけ - Game Science Project

プロジェクト演習Ⅳ
インタラクティブゲーム制作
最終回
関数を持ち歩こう
~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
• その他独学で得た技術を盛り込んでも可