ページ 11

vs2010にて制作したゲームのrelease版での問題

Posted: 2013年4月19日(金) 14:54
by 玉井
visualstudio2010にて制作したゲーム(固定画面のシューティングです)が
完成したのでreleaseビルドをしてexeを実行させたところ、
debug時には無かった問題が発生しました。

その問題とはエラー等が出て、exeが実行できないわけではなく
タイトル画面が表示され、スタートさせ、ステージ1が始まった時に起こります。

「プレイヤーだけが表示されていない」というものです。
発射ボタンを押しても、弾も表示されなければ、撃つ音もしないので、
どうやらプレイヤーのインスタンス化自体が出来ていないのかな?と推測しています。
が、同じ関数内にてインスタンス化している別のオブジェクトはしっかり表示されているので
プログラム文には問題ないと思うのです。

なにより、気持ち悪いのは、そのプレイヤーが存在していない状態で
ゲームオーバー画面に飛ばし(強制的にゲームオーバーになるボタンを作っています)、
その後タイトルに戻って再度ゲームをスタートさせると
今度は主人公が表示され、弾も撃て、なんの問題もなくゲームをプレイ出来てしまうのです。

何度確認しても、exeを実行して最初の「ゲームスタート」後のみ、
ステージが始まったらプレイヤーが表示されていない状態になります。
Drawのミス(表示云々)では無く、存在が無い気がしますので
一度でもタイトルに戻ると、そのあとは何度プレイしても問題無く遊べます。

ちなみに、プレイヤーインスタンス化までの流れですが
画面遷移でステージに移ると、ステージクラスのコンストラクタ内で
プレイヤークラスのインスタンス化、それをすぐオブジェクト用のリストに
pushさせています。
このリストにはゲームステージのオブジェクトをすべて入れてってます。
そのプレイヤーが表示されない状況でもそれ以外のオブジェクトが
すべてちゃんと機能しているため、このリスト構造に問題があるとは思えません。

とにかく、一度タイトルに戻ってやりなおせば
問題なく遊べるようになる、というのが解せないです。

これらのことからどういうミスが推測出来ますか?
エラーが出ないし、やり直すと問題無く遊べるしで
初心者の自分には原因がわかりません。

Re: vs2010にて制作したゲームのrelease版での問題

Posted: 2013年4月19日(金) 14:58
by usao
debug実行だと 未初期化の変数に対して なんらかの初期値が勝手に入れられるけど,
releaseだと未初期化のままなので その辺で問題が起こっているとかいうことは無いでしょうか?

Re: vs2010にて制作したゲームのrelease版での問題

Posted: 2013年4月19日(金) 15:17
by 玉井
>releaseだと未初期化のままなので その辺で問題が起こっているとかいうことは無いでしょうか?

一応、初期化を探ってみます。
ただ、そのケースが原因だとすれば
タイトルに戻ってまたスタートしたところで
また同じ現象になるはずではないでしょうか、、?

あと、初期化で気になることがひとつだけあります。
基底クラスの変数があるとして、
その変数の初期化(初期値を入れる)は、その変数を利用する継承先で行う、
それで問題ないですよね?
要は、その変数を利用しない継承クラスである場合は
その変数の初期化どころか、
その変数は無いものとして考えていたので大丈夫ですよね?

Re: vs2010にて制作したゲームのrelease版での問題

Posted: 2013年4月19日(金) 15:54
by softya(ソフト屋)
私は何らかのインスタンスの生成の問題は有ると思います。

テストとしてプレイヤークラスの情報を画面に表示させてみてください。
タイトルに戻る前後で何処が変わるかスクリーンンショットを撮って比べてみましょう。

Re: vs2010にて制作したゲームのrelease版での問題

Posted: 2013年4月19日(金) 17:25
by usao
>一応、初期化を探ってみます。
>ただ、そのケースが原因だとすれば
>タイトルに戻ってまたスタートしたところで
>また同じ現象になるはずではないでしょうか、、?

プログラムの構造がわからないのでなんともいえませんが…

例えば,自機のインスタンスを ステージ開始時とかに
if( !pPlayerFighter )pPlayerFighter = new CPlayerFighter();
とかして,「インスタンスがまだなかったら作る」みたいなことをしていて,
「インスタンスの有無はポインタがNULLかどうか」で判定しているとしたらどうでしょう.
pPlayerFighterのNULL初期化をもしわすれていたら,既にインスタンスが存在していると判断されますが,
実際,ポインタがさしている箇所の値はでたらめなので,まともな表示はされないでしょう.(ぶっ飛んだ座標に描画しようとしているかもしれない)
で,「タイトルに戻る」処理あたりに
if( pPlayerFighter ){ delete pPlayerFighter; pPlayerFighter=NULL; }
のような後始末がされていたら,今度はステージ開始時に期待通りに自機インスタンスが生成される… みたいな.

Re: vs2010にて制作したゲームのrelease版での問題

Posted: 2013年4月22日(月) 17:23
by ソーン
以前知人がreleaseでのみ問題が起こったことがあったのですが、その時の原因はバッファオーバーランでした
配列周りを確認したり、vector::atを使ってみると何か見つかるかもしれません