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