visualstudio2010にて制作したゲーム(固定画面のシューティングです)が
完成したのでreleaseビルドをしてexeを実行させたところ、
debug時には無かった問題が発生しました。
その問題とはエラー等が出て、exeが実行できないわけではなく
タイトル画面が表示され、スタートさせ、ステージ1が始まった時に起こります。
「プレイヤーだけが表示されていない」というものです。
発射ボタンを押しても、弾も表示されなければ、撃つ音もしないので、
どうやらプレイヤーのインスタンス化自体が出来ていないのかな?と推測しています。
が、同じ関数内にてインスタンス化している別のオブジェクトはしっかり表示されているので
プログラム文には問題ないと思うのです。
なにより、気持ち悪いのは、そのプレイヤーが存在していない状態で
ゲームオーバー画面に飛ばし(強制的にゲームオーバーになるボタンを作っています)、
その後タイトルに戻って再度ゲームをスタートさせると
今度は主人公が表示され、弾も撃て、なんの問題もなくゲームをプレイ出来てしまうのです。
何度確認しても、exeを実行して最初の「ゲームスタート」後のみ、
ステージが始まったらプレイヤーが表示されていない状態になります。
Drawのミス(表示云々)では無く、存在が無い気がしますので
一度でもタイトルに戻ると、そのあとは何度プレイしても問題無く遊べます。
ちなみに、プレイヤーインスタンス化までの流れですが
画面遷移でステージに移ると、ステージクラスのコンストラクタ内で
プレイヤークラスのインスタンス化、それをすぐオブジェクト用のリストに
pushさせています。
このリストにはゲームステージのオブジェクトをすべて入れてってます。
そのプレイヤーが表示されない状況でもそれ以外のオブジェクトが
すべてちゃんと機能しているため、このリスト構造に問題があるとは思えません。
とにかく、一度タイトルに戻ってやりなおせば
問題なく遊べるようになる、というのが解せないです。
これらのことからどういうミスが推測出来ますか?
エラーが出ないし、やり直すと問題無く遊べるしで
初心者の自分には原因がわかりません。
vs2010にて制作したゲームのrelease版での問題
-
usao
Re: vs2010にて制作したゲームのrelease版での問題
debug実行だと 未初期化の変数に対して なんらかの初期値が勝手に入れられるけど,
releaseだと未初期化のままなので その辺で問題が起こっているとかいうことは無いでしょうか?
releaseだと未初期化のままなので その辺で問題が起こっているとかいうことは無いでしょうか?
-
玉井
Re: vs2010にて制作したゲームのrelease版での問題
>releaseだと未初期化のままなので その辺で問題が起こっているとかいうことは無いでしょうか?
一応、初期化を探ってみます。
ただ、そのケースが原因だとすれば
タイトルに戻ってまたスタートしたところで
また同じ現象になるはずではないでしょうか、、?
あと、初期化で気になることがひとつだけあります。
基底クラスの変数があるとして、
その変数の初期化(初期値を入れる)は、その変数を利用する継承先で行う、
それで問題ないですよね?
要は、その変数を利用しない継承クラスである場合は
その変数の初期化どころか、
その変数は無いものとして考えていたので大丈夫ですよね?
一応、初期化を探ってみます。
ただ、そのケースが原因だとすれば
タイトルに戻ってまたスタートしたところで
また同じ現象になるはずではないでしょうか、、?
あと、初期化で気になることがひとつだけあります。
基底クラスの変数があるとして、
その変数の初期化(初期値を入れる)は、その変数を利用する継承先で行う、
それで問題ないですよね?
要は、その変数を利用しない継承クラスである場合は
その変数の初期化どころか、
その変数は無いものとして考えていたので大丈夫ですよね?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: vs2010にて制作したゲームのrelease版での問題
私は何らかのインスタンスの生成の問題は有ると思います。
テストとしてプレイヤークラスの情報を画面に表示させてみてください。
タイトルに戻る前後で何処が変わるかスクリーンンショットを撮って比べてみましょう。
テストとしてプレイヤークラスの情報を画面に表示させてみてください。
タイトルに戻る前後で何処が変わるかスクリーンンショットを撮って比べてみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
usao
Re: vs2010にて制作したゲームのrelease版での問題
>一応、初期化を探ってみます。
>ただ、そのケースが原因だとすれば
>タイトルに戻ってまたスタートしたところで
>また同じ現象になるはずではないでしょうか、、?
プログラムの構造がわからないのでなんともいえませんが…
例えば,自機のインスタンスを ステージ開始時とかに
if( !pPlayerFighter )pPlayerFighter = new CPlayerFighter();
とかして,「インスタンスがまだなかったら作る」みたいなことをしていて,
「インスタンスの有無はポインタがNULLかどうか」で判定しているとしたらどうでしょう.
pPlayerFighterのNULL初期化をもしわすれていたら,既にインスタンスが存在していると判断されますが,
実際,ポインタがさしている箇所の値はでたらめなので,まともな表示はされないでしょう.(ぶっ飛んだ座標に描画しようとしているかもしれない)
で,「タイトルに戻る」処理あたりに
if( pPlayerFighter ){ delete pPlayerFighter; pPlayerFighter=NULL; }
のような後始末がされていたら,今度はステージ開始時に期待通りに自機インスタンスが生成される… みたいな.
>ただ、そのケースが原因だとすれば
>タイトルに戻ってまたスタートしたところで
>また同じ現象になるはずではないでしょうか、、?
プログラムの構造がわからないのでなんともいえませんが…
例えば,自機のインスタンスを ステージ開始時とかに
if( !pPlayerFighter )pPlayerFighter = new CPlayerFighter();
とかして,「インスタンスがまだなかったら作る」みたいなことをしていて,
「インスタンスの有無はポインタがNULLかどうか」で判定しているとしたらどうでしょう.
pPlayerFighterのNULL初期化をもしわすれていたら,既にインスタンスが存在していると判断されますが,
実際,ポインタがさしている箇所の値はでたらめなので,まともな表示はされないでしょう.(ぶっ飛んだ座標に描画しようとしているかもしれない)
で,「タイトルに戻る」処理あたりに
if( pPlayerFighter ){ delete pPlayerFighter; pPlayerFighter=NULL; }
のような後始末がされていたら,今度はステージ開始時に期待通りに自機インスタンスが生成される… みたいな.
-
ソーン
Re: vs2010にて制作したゲームのrelease版での問題
以前知人がreleaseでのみ問題が起こったことがあったのですが、その時の原因はバッファオーバーランでした
配列周りを確認したり、vector::atを使ってみると何か見つかるかもしれません
配列周りを確認したり、vector::atを使ってみると何か見つかるかもしれません