ププププププププⅡ プププププププププププププ プププププププププ 2 プ 11 プ ププププププププププ 2 ププププププ
Jan 19, 2016
プロジェクト演習Ⅱインタラクティブゲーム制作イントロダクション2
第 11回プログラミングサプリ
2次元と関数編
今日の内容
• 2次元画像の扱い方–画像を読み込んで表示–文字表示–ふよふよしたり動かしたり–画面エフェクトにも使うよ
• 関数 (メソッド )の扱い方–関数の作り方・使い方–値の渡し方・受け取り方–別ファイルへの分け方
今週のプロジェクト
• 授業資料ページからダウンロードします–落とした Zipファイルを解凍して、出てきたフォルダを好きなところに配置
• 今週の FKUT更新情報–サウンド関係の処理に微修正–ウィンドウにフルスクリーン機能を追加
今日のサンプル
• 何かカメラの前に張り付いてます–画像だったり文字だったり
• 関数を使ったプログラムの例
3Dにおける画像との付き合い方
説明するほどのこともないのですが
画像データとは
• 言うまでもないですが、色のついた点の集まり– FKで扱える画像形式• ビットマップ (BMP)
– きれいだがでかい• PNG
– きれいでコンパクト– 透過処理もできる
• JPEG(JPG)– きちゃないけど超コンパクト
表示するには
• fkut_SpriteModel–色々お節介焼きな便利変数です–画像の表示を絶望的に簡単にできます
• 詳しくはお品書きを読んでね– FKUT/SpriteModel.h を参照–できることが書いてあります–それに加えてModel系の命令も使えるよ
基本手順
• fkut_SpriteModel型の変数を作る– fkut_SpriteModel spr;
• 表示させたい画像を読み込む– spr.readPNG(“hoehoe.png”);• readBMP/PNG/JPGを形式に合わせて使う
• ウィンドウにエントリーする– window.entry(spr);• 先にカメラの設定を済ませておくこと• カメラを変更したら再エントリーすれば OK
位置やサイズの調整
• glMoveToや glTranslateなどが利用可能–画像の中心点がどこにくるかを指定
• ただし、有効なのは X,Y座標値のみ–座標の軸の取り方にも注意 (次スライド参照 )
• setPositionLTで、画像の左上がどこにくるか基準での位置指定が可能
• 表示サイズは基本的に画像自体のサイズのままになる–変更したい場合は setSpriteSizeを使う
座標系の注意
• ウィンドウが 800x600の場合
(0,0)
(-400,300)
(400,-300)
文字表示の手順
• 文字データ (フォント )を読み込む– initFontを使う– Vista,7の場合は「メイリオ」をおすすめ
• C:/Windows/fonts/Meiryo.ttc
• 表示させたい文字を drawTextで指定– drawTextを呼ぶたびに文字が付け足される– 改行したい場合は” \n”と書く– 後で書き直すこともできる
• 数値の表示についてはサンプル参照
• 色の変更や細かい装飾はWeb上の資料を参照
3次元空間中に表示したい場合
• SpriteModelは画面上に貼り付ける専門の変数なので、別の変数を用意する
• サンプル中に「背景に画像を敷く」コードがあるので、それを参考にして空間中に配置できる、はず–エリアコメントを解除してみよう
関数を使ってスマートに書こうJavaでも難しいとは思ったでしょうが
関数とは
• Javaで言うところの「メソッド」です• 以下の 3つの特徴を持ちます–いくつかの処理を 1つのカタマリにしておき、
必要に応じて呼び出せる。呼び出した処理が終わったら元の場所に戻ってくる。
–呼び出す際に必要な値を引き渡せる。要らなければ渡さなくてもいい。
–戻ってくる際に計算結果を返すことができる。要らなければ返さなくてもいい。
Javaとの違い
• 大枠は似ているが、細かいお作法が違うので気をつけよう
• 枕詞「 public」は要らない• 「お品書き」と「関数本体」を分けて書く必要がある– 厳密には必須じゃないけど、必須として覚えた方がよい
• 数値以外の変数を受けとる時は引数リストに「&」を付ける– 詳細は後述
キーを押したら音がなる関数
• 今日のサンプルを参照– playSoundByKey()関数–関数は「関数名 ()」と表記することが多い
• ウィンドウの変数、判定するキーの種類、鳴らしたい SEの変数、再生フラグ変数を引数として渡している
お品書きと本体
• 関数を作る時の返値の種類 関数名 ( 引数リスト );
の部分をこの授業ではお品書きと呼ぶ–正確には「プロトタイプ宣言」と呼ぶ
• プログラムの先頭 (main()より前、#includeより後 )にお品書きを書く
• その後ろにお品書きと本体を書くようにする
でもそうやっていくと1つのファイルが膨れあがっていく
• お品書き、本体と、その関数を使いたいファイルは別々にすることができる
• プロジェクトを右クリック→追加→新しい項目、で以下の種類のファイルを追加– ヘッダーファイル (.h)
• お品書きを書くファイル– C++ファイル (.cpp)
• 関数本体を書くファイル
• ファイル名は何でも良い– hと cppの対応は分かるようにした方がいい
インクルードとは
• 使いたい関数 (やその他もろもろ )のヘッダーファイル (お品書き )を取り込む命令– FKUTの機能もインクルードすることで使えるようになっている
• 動作としては、ファイルに書かれている内容をその場にコピペするのと大差ない–なので、プロトタイプ宣言を直書きしても、
ヘッダーをインクルードしても動作は一緒
ゲームでよく使う関数の作り方
• 返値は要らない場合が多い– 座標や数値の計算をしたい場合は返値を返すように作るとよい
– int, doubleの他に、 bool, fk_Vectorなどが返値としてよく用いられる
• 引数は「参照渡し」にした方がよい– 引数リストで受け取る変数名の前に「&」を付ける
– fkut系の変数は必須• fk系も基本的に参照渡しの方が問題が起きない
値渡しと参照渡しの違い
値渡し ( 通常 )の関数void func(int iA){
iA *= 2;}
// 以下main内だとする
int iValue = 10;func(iValue);
// ここでの iValueの値は ?
参照渡しの関数void func(int &iA){
iA *= 2;}
// 以下main内だとする
int iValue = 10;func(iValue);
// ここでの iValueの値は ?
違いのまとめ
• 値渡しだと、引数として「同じ値がコピーされる」ので、関数側でいじってもコピー元には影響がない
• 参照渡しだと、引数として「その変数の箱自体が渡される」ので、関数側でいじった結果が反映される– 多くの場合はこっちの挙動の方がうれしい– だが、変数ではなく値を直書きしているものは受け取れない• キーの種類が参照渡しじゃないのはそのため
– 引数を意図せずにいじって混乱することもある
その他注意点
• Javaと混乱しないように!– Javaで習っている引数は int, doubleについては「値渡し」です
– 配列については「参照渡し」になっています• これは C++でもそう
– Javaには &を付ければ参照渡し、という機能はありません
• 配列を渡したい場合の引数リスト– int [] iArray– fk_Model [] mArray
• SpecialKeyのコード– fk_SpecialKey spKey
• 普通のキーコード– char key
• 文字列を渡したい– string text
より詳しい人のために
• 構造体やクラスの利用は推奨します– ただし、ある程度独学で頑張れるチームのみ
– 分かってる人だけが使うのではなく、チーム全体で出来るだけ理解レベルを統一して開発にあたりましょう
• グローバル変数の利用は極力避けるべし– トラブルのもとです– ゲームを通じて必要な変数はmain関数に作り、面倒でも引数でしっかり渡すように