FPSを作ってみる@wiki
メモ書き
最終更新:
slice
-
view
Qt5で作成したプログラムの配布時
LinuxからMinGWでクロスコンパイルした時にハマッたのでメモ。
問題発覚の流れとしては
問題発覚の流れとしては
コンパイルしたバイナリをまずwineでテスト -> OK
windowsでテスト -> NG
windowsでQt5をビルド後、先ほどのバイナリをテスト -> OK
暫く別の作業した後でまた実行 -> NG え?
windowsでテスト -> NG
windowsでQt5をビルド後、先ほどのバイナリをテスト -> OK
暫く別の作業した後でまた実行 -> NG え?
こんな感じ。
原因を先に述べるとwindowsでビルドしたQtのオプションが気に入らなかったので一旦消した為に
DLL依存を調べるツール Dependancy Walker でも表示されない依存ファイルを読み込めずエラーになっていた。
原因を先に述べるとwindowsでビルドしたQtのオプションが気に入らなかったので一旦消した為に
DLL依存を調べるツール Dependancy Walker でも表示されない依存ファイルを読み込めずエラーになっていた。
Qtのアプリケーションをビルドして配布する時はライセンスからいって通常、ダイナミックリンクを選択する事になるが
windowsにおいてこの時添付するDLLがQt4ではQtCore4.dllやQtGui4.dll(などの用途に応じた物)、
Qt5でも同じようにQt5Core.dllやQt5Gui.dllなのであるがQt5ではもう一つ必要なファイルがある。
それは (qtsdk)/plugins/platforms/qwindows.dll だ。
windowsにおいてこの時添付するDLLがQt4ではQtCore4.dllやQtGui4.dll(などの用途に応じた物)、
Qt5でも同じようにQt5Core.dllやQt5Gui.dllなのであるがQt5ではもう一つ必要なファイルがある。
それは (qtsdk)/plugins/platforms/qwindows.dll だ。
後から見つけたのだが、同じようなスレッド立ててる人がやっぱり居た。
http://qt-project.org/forums/viewthread/23367
http://qt-project.org/forums/viewthread/23367
配布するバイナリと同じ場所に platforms フォルダを作ってその中にqwindows.dllを放り込んだら無事動いた。
スクリプトで記述する範囲
結構前からゲーム内スクリプト言語としてLuaを使用しているが当初からの疑問である
「どの程度までスクリプトで動かすべきか」がようやく掴めてきたのでメモ。
Luaはメタテーブルという機構があるのでこれを駆使すればクラスの様な振る舞いをさせる事ができるし
C++から関数を登録していけば幾らでも機能を追加できるので
放っておけば柔軟性の名の元に、スクリプトでゲームの大部分を全体を記述する事態・・と言えば聞こえは良いが
実際はデバッグし難いわ変数名を間違えているのが実行時に露呈したりであまり嬉しくない。遅いし。
ここまでが前置き。
「どの程度までスクリプトで動かすべきか」がようやく掴めてきたのでメモ。
Luaはメタテーブルという機構があるのでこれを駆使すればクラスの様な振る舞いをさせる事ができるし
C++から関数を登録していけば幾らでも機能を追加できるので
放っておけば柔軟性の名の元に、スクリプトでゲームの大部分を全体を記述する事態・・と言えば聞こえは良いが
実際はデバッグし難いわ変数名を間違えているのが実行時に露呈したりであまり嬉しくない。遅いし。
ここまでが前置き。
色々試行錯誤した結果、ゲーム末端の部分だけでいいかと。
例えば場に敵を出したい場合
local hModel = ModelManager:load("model") -- モデルのロード
local hChara = Enemy.new(hModel, ...etc) -- 敵キャラ作成
CollisionManager:addObj(hChara) -- コリジョン登録
scene:addObj(hChara) -- シーンへの登録
例えば場に敵を出したい場合
local hModel = ModelManager:load("model") -- モデルのロード
local hChara = Enemy.new(hModel, ...etc) -- 敵キャラ作成
CollisionManager:addObj(hChara) -- コリジョン登録
scene:addObj(hChara) -- シーンへの登録
とかやるんではなくて (現バージョンがそうなんだが)
FPSならそれ用のコリジョンや描画やアップデートの仕組みをC++のクラスで作ってから
FPSManager:spawn("enemy.def", ...etc) -- 敵キャラを配置
FPSManager:spawn("enemy.def", ...etc) -- 敵キャラを配置
とやった方が簡便だし、速い。
FPSManagerではFPS、それも屋内なら屋内特化のFPSしか作れないだろうが
もしShoot'em upを作りたくなればSTGManagerでも用意すればいい話。
FPSManagerではFPS、それも屋内なら屋内特化のFPSしか作れないだろうが
もしShoot'em upを作りたくなればSTGManagerでも用意すればいい話。
詰まるところ、スクリプトで記述するのは「そのゲーム固有」の部分という事に。
ステージ演出(エフェクト係数、敵の数や配置など)なんかはその典型かなと。
ステージ演出(エフェクト係数、敵の数や配置など)なんかはその典型かなと。
やらかしたメモ
プログラムする上でハマッた事の箇条書き
- Lua: setmetatable()でメタテーブルをセットできるのはテーブルのみ
他はCから設定しなければならない
- Lua: 独立してメタテーブルを持てるのはテーブルとユーザーデータ(非ライト)のみ
他は型毎に共有される.数値別にメタテーブルで凝った事などは出来ない
- Lua: メタテーブルの__gcフィールドが有効なのはユーザーデータ(非ライト)のみ
テーブルに__gcとかつけて凝った事など(略
- Lua: 数値型が浮動小数点数(デフォルトはdouble)の場合,C側でlua_tointeger()しても切り捨てではない
環境/実装依存.x86のVC++だと一端FPUに格納してハード側でINT変換してるけどこの時の丸めモードによって動作が異なる.
常に切り捨てにしたければ一端doubleで受けて改めてINTにするかluaのソース改変必須.
常に切り捨てにしたければ一端doubleで受けて改めてINTにするかluaのソース改変必須.
- Lua: テーブルのインデックスに数値を使う場合,下1桁までぴったり同じにしないと配列として扱われない
ある計算でインデックスを算出してテーブルから参照しようとすると意外にはまる.
危なそうな場面ではくどくてもmath.floor()を使った方がいい.
2.00002とかでもアウト.
危なそうな場面ではくどくてもmath.floor()を使った方がいい.
2.00002とかでもアウト.
- XAudio: IXAudio2SourceVoice::Stop()は非同期
関数から処理が返ってきたので停止済みと思い込んでバッファを編集したりすると・・
- OAuth: ブラウザのアドレス欄なんかで見るURLエンコーディングと,OAuthのそれ(パーセンテージエンコーディング)は別物
一見すると似ているが罠.サーバは署名違ってるよとしかエラー返してくれないから余計混乱.
- Direct3D: DirectX Control Panelで「Use Retail Version~」を選択していても Debugging欄の設定は無効にならない.
少なくともMaximumValidationにチェックが入っているとAPIの呼び出し負荷が倍以上かかる.
開発とは別にゲームで遊ぶ時とか注意.
開発とは別にゲームで遊ぶ時とか注意.
- Direct3D: D3DEffectクラスで現在アクティブでないTechniqueのパラメタをセットしても無視される(?)
あとで使うTechのパラメタを先に指定しておけば内部にキャッシュされ,然るべき時に自動で適用されるかと思ったが,どうもそうでない様子
- Direct3D: 動的なVertex/Index Buffer(D3DUSAGE_DYNAMIC)を,確保直後にオフセット0の位置からD3DLOCK_NOOVERWRITEでロックするとちゃんとデータを書き込めない(?)
原因究明に2時間程費やした.解せぬ・・・
デバッグランタイムを使っても警告は出ないしソフトウェア頂点処理の時は普通に動くから厄介.
デバッグランタイムを使っても警告は出ないしソフトウェア頂点処理の時は普通に動くから厄介.
- Direct3D: 行列A,Bとこれらを積算したC、ベクトルVがあったとしてV*A*BとV*(A*B)はコンピュータ上で計算すると異なる。理由は浮動小数点数の誤差。マルチパスなんかでZFuncをEqualにする時は誤差を考慮に入れないとモアレの原因になる。
VisualStudioのショートカットメモ
よく使ってるショートカットをメモしておこうかと思ったので、そうする。
メンドイのでデフォルトで使う派。
メンドイのでデフォルトで使う派。
- ブックマーク
作成 / 解除 Ctrl+K Ctrl+K 次へ Ctrl+K Ctrl+N 前へ Ctrl+K Ctrl+P クリア Ctrl+K Ctrl+L - テキスト選択して使うコマンド
ソース整形 Ctrl+K Ctrl+F 右にインデント Tab 左にインデント Shift+Tab コメント化 Ctrl+E Ctrl+C コメント解除 Ctrl+E Ctrl+V - ビルド
単体コンパイル Ctrl+F7 ビルド Ctrl+Shift+B - デバッガ
デバッグ開始 F5 デバッガ無しで実行 Ctrl+F5 指定した行まで実行 Ctrl+F10 ステップイン F11 ステップオーバー F10 ステップアウト Shift+F11 デバッグ中断 Shift+F5 プログラム一時停止 Ctrl+Alt+Break - ブレークポイント
作成 / 解除 F9 すべて削除 Ctrl+Shift+F9 - インテリセンス
候補 Ctrl+Space 関数候補 Ctrl+Shift+Space