Re: 敵のショットが描画されない ( No.1 ) |
- 名前:管理人 日時:2014/11/19 02:29
プログラムを拝見しました
とりあえず弾の描画を行っている Bullet.cpp の 152行目の
DrawBillboard3D のところまでプログラムの実行が来ていないようです
あと、Bullet.cpp の 9行目の
for(int jj; jj < SHOT_BULLET_MAX; jj++)
は jj が初期化されていないので
for(int jj = 0; jj < SHOT_BULLET_MAX; jj++)
となります
デバッガを使用されたとのことですが、ビルド構成が Release になっていると
まともにデバッガが機能しませんので、必ず Debug で実行するようにしてください
( 「エラーです。シンボルが見つかりません」「エラーです。式を評価できません」と
表示されるのも、ビルド構成が Release になっていることが原因です )
<ビルド構成を Debug にする方法>
1.VisualStudio メニューから「ビルド」→「構成マネージャ」を開いて「構成マネージャ」ダイアログを開く
2.「構成マネージャ」ダイアログの左上の「アクティブソリューション構成」を「Debug」に変更して「閉じる」ボタンを押す
まともにデバッガが使用できるようになったら、ブレークポイントを沢山配置して、
northさんの意図している順番で処理が実行され、意図する値が変数に入っているか確認して、
必要な変更を行ってとりあえず Bullet.cpp の 152行目の DrawBillboard3D までプログラムが
実行されるようにしてみてください
|
Re: 敵のショットが描画されない ( No.2 ) |
- 名前:north 日時:2014/11/19 04:13
ありがとうございます。
Debugにしてみたところ弾の描画フラグが0のままで弾の描画フラグを1にするように
プログラムを組み直したところハンドルされていない例外が発生する
という表示がでるようになってしまいました。
こちらは原因が全く分からず困っている状態です。
お手数をおかけしますが再度見ていただいてもよろしいでしょうか?
ttp://xfs.jp/QHhpR
下記に修正したプロジェクトをアップいたしました。
また、他に修正した良い点がございましたらご指摘いただけたらと思います。
どうかよろしくお願い致します。
|
Re: 敵のショットが描画されない ( No.3 ) |
- 名前:north 日時:2014/11/19 16:47
こちらで調べて今わかっているのはmain.cppの102行目のEnemyAction()まではブレークが来ているのですが、
この後、EnemyAction()の中に入ると中に書かれている処理がスキップされて次の行のEnemyDrow(CEnemy::ENEMY0)まで行ってしまい
「ハンドルされていない例外が発生しました(スタックオーバーフロー)」と出てしまいます。
原因っぽいEnemy.cppの392行目のEnemyAction関数内の413行目と414行目に記載しました
CBullet bullet
bullet.ShotEntry(ii)
の部分をコメントアウトしましたら発生しなくなりました(弾は描画されたおりません)
もしかしたらnewしていないのが原因かと思い下記のように修正したところ
CBullet *bullet;
bullet = new CBullet();
bullet->ShotEntry(ii);
Bullet.cppのShotEntry関数内の172行目でアクセス違反が起こり、EnmyInfoの中身が「エラーです。式を評価できません」
となっており、Enemy.cppのtEnemyParamの情報が取得できていませんでした。
上記まではわかったのですがこの後どのように修正したら弾が描画されるようになるのかわかりません。
リンク先で言われた通り何度もデバッガを試してはいるのですがやり方が悪いのか分からずじまいで困っております。
どうかご教授願えたらと思います。
|
Re: 敵のショットが描画されない ( No.4 ) |
- 名前:north 日時:2014/11/20 23:14
何度も申し訳ありません。
現在、自分でも原因を調べているのですが未だに描画されない原因がわかりません。
一応
CBullet bullet
bullet.ShotEntry(ii)
記載するとエラーが出るのは私の書き方がまずかった(ローカル変数で書いていたので変数の寿命が切れていた)のが原因でした。
本当はBullet.hをEnemy.hにインクルードして
ShotEntry(ii);
の中身の処理をEnemy.cppで記載したかったのですが、そうしますと
Bullet.hでEnemy.hをインクルードしているにもかかわらず、CEnemyが定義されていないと出てしまいこれの原因がなぜなのかわからず現在のやり方にいたしました。
|
Re: 敵のショットが描画されない ( No.5 ) |
- 名前:管理人 日時:2014/11/23 02:10
すみません、ご返信が遅くなりました
ご説明の内容で原因を究明するのは難しいので、お手数で申し訳ありませんが
現在の最新のプログラムを頂けないでしょうか?
|
Re: 敵のショットが描画されない ( No.6 ) |
- 名前:north 日時:2014/11/23 02:35
こちらこそお忙しい中お手数をおかけして申し訳ありません。
下記に現在のプログラムをアップいたしました
ttp://xfs.jp/SSAWGj
どうかよろしくお願い致します。
|
Re: 敵のショットが描画されない ( No.7 ) |
- 名前:管理人 日時:2014/11/23 02:56
プログラムをダウンロードさせて頂きました
本日( 2014/11/23 )は用事があるので、ご返信は明日( 2014/11/24 )になってしまうかもしれません
|
Re: 敵のショットが描画されない ( No.8 ) |
- 名前:管理人 日時:2014/11/24 11:38
プログラムを拝見しました
その上で northさんの No.3 No.4 のお書き込みを拝見すると
ローカル変数のことや、ポインタ、new の意味を理解されていないように感じます
基礎的なことを掲示板のやりとりだけでご説明するのは大変なので、C言語の書籍などで学んでください
ともあれ、とりあえず頂いたプログラムを弾が表示されるようにしてみましたので、
よろしければお手元のプログラムに以下の変更を加えてください
( もしアップしていただいたプログラムから更に変更を加えてしまっていた場合は、
アップしていただいたプログラムをお使いください )
Bullet.h の 78行目に以下の記述を追加
extern CBullet* bullet;
Bullet.cpp の 4行目に以下の記述を追加
CBullet* bullet;
Bullet.cpp の DrawShot 関数の DrawBillboard3D の部分を
DrawBillboard3D(tShot[ii].tBullet[jj].Pos, tShot[ii].tBullet[jj].Pos.x + PLAYER_MOVEX_MIN,
tShot[ii].tBullet[jj].Pos.z, 1.0f, tShot[ii].tBullet[jj].Angle + PI/2, BulletImage[tShot[ii].tBullet[jj].Kind][tShot[ii].tBullet[jj].Color], TRUE);
以下のように変更
int SizeX, SizeY;
int Handle;
Handle = BulletImage[tShot[ii].tBullet[jj].Kind][tShot[ii].tBullet[jj].Color];
GetGraphSize( Handle, &SizeX, &SizeY );
DrawBillboard3D(tShot[ii].tBullet[jj].Pos, 0.5f, 0.5f, ( float )SizeX / 4.0f, 0.0f, Handle, TRUE);
Bullet.cpp の ShotEntry 関数の memset を使用している次の行に以下の記述を追加
( CBullet のコンストラクタで全ての Pos.y に -280.0f を代入していますが、
memset で 0 を上書きされてしまっているので、再度 -280.0f を代入する必要があるのでこの記述を追加 )
for(int jj = 0; jj < SHOT_BULLET_MAX; jj++)
{
tShot[ii].tBullet[jj].Pos.y = -280.0f;
}
Enemy.cpp の EnemyAction 関数の以下の記述の
CBullet *bullet;
bullet = new CBullet();
bullet->ShotEntry(ii);
上側2行をコメントアウト
// CBullet *bullet;
// bullet = new CBullet();
bullet->ShotEntry(ii);
|
Re: 敵のショットが描画されない ( No.9 ) |
- 名前:north 日時:2014/11/24 22:07
お忙しい中ありがとうございます。
一時期プログラムから大分離れていた時期がありましたのでご指摘いただきました点を並行して復習しております。おかげ様で、前回の問題がなぜ起こったのか少しですが理解できました。
ご指摘の通り修正したのですが、ビルドした際に
「アクセス違反が発生しました」と
Bullet.cppの175行目で止まってしまい、値を見てみましたところ、tShotのの中身が一部初期化されておらず、これが原因だと思われるのですが、
初期化はコンストラクタでmemsetを使用して行っており、なぜそうなってしまうのかがわかりません。
申し訳ないのですが修正したプログラムをもう一度見ていただいてもよろしいでしょうか?
下記にアップし直しました。
ttp://xfs.jp/pDTqp
管理人様のほうでは描画されたみたいですが何が原因でしょうか?プログラムはアップしてから特にいじくってはおりません。
|
Re: 敵のショットが描画されない ( No.10 ) |
- 名前:softya(ソフト屋) 日時:2014/11/24 20:26
私は、まずローカル変数、インスタンスの理解を深めることが先決だと思います。
理解が不十分なままプログラムが巨大化していくと誰にも直せないプログラムが出来てしまいます。そうなると最終的には捨て去るしか無くなります。
なので、動かすことよりも理解することを優先すべき時期だとコメントさせていただきます。
|
Re: 敵のショットが描画されない ( No.11 ) |
- 名前:north 日時:2014/11/24 22:00
>softya様
ご指摘ありがとうございます。
並列しての形とはなっていますが家にある書籍を読み直す、書籍のサンプルプログラムを書いてみる等の復習は並列して行っております。以前の問題もローカル変数で宣言していたために、
関数の寿命が尽きてしまうと同時にローカル変数も破棄され他為に怒っていた問題(実際にスタックエラーでした)でしたし、
なぜnewにしたら解決したのかもnewすると動的なメモリの確保、つまりヒープ領域にメモリが確保され、
deleteを行わない限りは失われないため、そこでのエラーは解決されたと少しずつですが思い出してきております。
|
Re: 敵のショットが描画されない ( No.12 ) |
- 名前:softya(ソフト屋) 日時:2014/11/25 01:03
クラスを含む構造体をmemsetでクリアした場合、クラスの動作は保証されません。Vectorを含んでいますよね?
C++では問題が色々あるのでmemsetは原則使わないほうが良いです。
あと8バイト境界のワナにはまっていないかなどmemsetを使うにはかなりの技量が必要です。
|
Re: 敵のショットが描画されない ( No.13 ) |
- 名前:管理人 日時:2014/11/25 01:28
すみません、お伝えすべき変更点が一箇所抜けていました
Main.cpp のこちらの部分を
//弾の設定
CBullet* bullet = new CBullet();
このように変更してください
//弾の設定
bullet = new CBullet();
|
Re: 敵のショットが描画されない ( No.14 ) |
- 名前:north 日時:2014/11/25 01:42
ありがとうございます。
無事に描画されました。
一部弾の発射にバグが見られますがまずは自分で調査してみたいと思います。
もし、またわからないことがありましたらどうかよろしくお願い致します。
最後まで本当にありがとうございました。
|