プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション2 第11回 プログラミングサプリ 2次元と関数編
今日の内容 2次元画像の扱い方 関数(メソッド)の扱い方 画像を読み込んで表示 文字表示 ふよふよしたり動かしたり 画面エフェクトにも使うよ 関数の作り方・使い方 値の渡し方・受け取り方 別ファイルへの分け方
今週のプロジェクト 授業資料ページからダウンロードします 今週のFKUT更新情報 落としたZipファイルを解凍して、 出てきたフォルダを好きなところに配置 今週のFKUT更新情報 サウンド関係の処理に微修正 ウィンドウにフルスクリーン機能を追加
今日のサンプル 何かカメラの前に張り付いてます 画像だったり文字だったり 関数を使ったプログラムの例
説明するほどのこともないのですが 3Dにおける画像との付き合い方
画像データとは 言うまでもないですが、 色のついた点の集まり FKで扱える画像形式 ビットマップ(BMP) PNG JPEG(JPG) きれいだがでかい 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の場合 (-400,300) (0,0) (400,-300)
文字表示の手順 文字データ(フォント)を読み込む 表示させたい文字をdrawTextで指定 数値の表示についてはサンプル参照 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と混乱しないように! 配列を渡したい場合の引数リスト SpecialKeyのコード 普通のキーコード 文字列を渡したい Javaで習っている引数はint, doubleについては「値渡し」です 配列については「参照渡し」になっています これはC++でもそう Javaには&を付ければ参照渡し、という機能はありません 配列を渡したい場合の引数リスト int [] iArray fk_Model [] mArray SpecialKeyのコード fk_SpecialKey spKey 普通のキーコード char key 文字列を渡したい string text
より詳しい人のために 構造体やクラスの利用は推奨します グローバル変数の利用は極力避けるべし ただし、ある程度独学で頑張れるチームのみ 分かってる人だけが使うのではなく、チーム全体で出来るだけ理解レベルを統一して開発にあたりましょう グローバル変数の利用は極力避けるべし トラブルのもとです ゲームを通じて必要な変数はmain関数に作り、面倒でも引数でしっかり渡すように