トップページ > 記事閲覧
敵のショットが描画されない
名前:north 日時: 2014/11/18 00:02

いつもご質問に答えていただきありがとうございます。 DXライブラリとはあまり関係のない質問なのですが、 今回質問したいのは敵のショットの描画についてです。 敵のショットのプログラムを組んでみたのですが、敵の弾が描画されず、どのように修正したらよいかわからず 困っております。 一応デバッガを使ってみてみたところ敵の構造体を格納するEnemyInfoとプレイヤーの構造体を格納するPlayerInfoと弾の画像のハンドルを格納している BulletImageが「エラーです。シンボルが見つかりません」「エラーです。式を評価できません」となっておりこれではないかなと思っております。 ただ、これがどのようにしたら修正できるのかがわかりません。 下記にプロジェクトをアップいたしました。 ttp://xfs.jp/J4p9Ut もしかしたら初歩的なミスで躓いてしまっているかもしれないですが、ご教授して頂けたらと思います。 どうかよろしくお願い致します。 また、下記の掲示板でも同じ質問をさせていただきました。 ttp://dixq.net/forum/viewtopic.php?f=3&t=15988&p=126789#p126789
メンテ

Page: 1 |

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

ありがとうございます。 無事に描画されました。 一部弾の発射にバグが見られますがまずは自分で調査してみたいと思います。 もし、またわからないことがありましたらどうかよろしくお願い致します。 最後まで本当にありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存