龍神録の改造 バグの原因が分からない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Fimbul
記事: 100
登録日時: 8年前

龍神録の改造 バグの原因が分からない

#1

投稿記事 by Fimbul » 8年前

龍神録を d.3章 ゲームの設計と分割コンパイル(1) http://dixq.net/g/d_03.html の様にどこからでも参照できるグローバル変数を用いずに作っています。
今、 エクセルを使って敵の出現データを作ってみよう http://dixq.net/rp/11.html に取り掛かっているのですが、敵の出現に不具合があり、Visual C++のデバッガを用いてデバッグしたのですが、原因を突き止められませんでした。
ご教示お願いします。
どこが原因なのか分からないので、圧縮したデータをアップしました。
最後に編集したユーザー Fimbul on 2011年11月25日(金) 09:36 [ 編集 1 回目 ]

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: 龍神録の改造 バグの原因が分からない

#2

投稿記事 by h2so5 » 8年前

「不具合」のような曖昧な表現ではなく、具体的な不具合の内容を書いてください。

Fimbul
記事: 100
登録日時: 8年前

Re: 龍神録の改造 バグの原因が分からない

#3

投稿記事 by Fimbul » 8年前

http://dixq.net/rp/11.html
このページの下にある動画に様になるのが正しいのですが、左半分の敵が正常な動きをしてくれません。

アバター
DVDM
記事: 38
登録日時: 9年前
住所: 大阪
連絡を取る:

Re: 龍神録の改造 バグの原因が分からない

#4

投稿記事 by DVDM » 8年前

>>Fimbul さん
ソースや実行結果を見た訳ではないので直接解決に結び付かないかもしれません。
左半分の敵が正常な動きをしてくれないとのことであれば、
間違いが起きそうなのは、エクセルの入力情報が間違っているか、
エクセルデータの読み込みに失敗しているか、描画時の座標を間違っているのではないでしょうか。

右半分は上手くいっているようですので、左半分のデータと照らし合わせると何が違うのか解るかもしれません。
デバッグは出来るようですので、今一度確認してみては如何でしょう。

Fimbul
記事: 100
登録日時: 8年前

Re: 龍神録の改造 バグの原因が分からない

#5

投稿記事 by Fimbul » 8年前

エクセルに入っているデータは10行ですが、エクセルから読み込んだデータを保存する構造体の配列 enemyOrder[ENEMY_ORDER_MAX] は500個のデータを格納できます。
enemyOrder[ENEMR_ORDER_MAX] は静的変数なので残り490個のメンバは0で初期化されます。
enemy.cpp の EnterEnemy() の敵登録処理で、nStageCount が0の時にこの0で初期化されたデータを登録している様です。
敵の初期位置である fEnmX fEnmY も0で初期化されており、消滅条件を満たしていない位置に現れているので、登録上限までそれらの敵が登録され、左上に重なって表れている様です。

敵が右半分だけ現れたのは、重なった敵が画面外に移動しフラグが下がって、登録に空きが出た時がnStageCountの値が偶然5体目の敵の出現カウントの直前だったから・・・なのかもしれません。

試しに init.cpp の memset(enemy, 0, sizeof(enemy_t) * ENEMY_MAX); を memset(enemy, -60, sizeof(enemy_t) * ENEMY_MAX); にして、0で初期化された敵が登録されない様にあらかじめ登録上限まで敵を登録させた状態とし、直後の ActEnemy() でフラグを下げる(消滅)ようにしました。
次の登録処理ではnStageCountが1となっているので0で初期化されているデータは登録されず、全ての敵が正しく動作してくれました。

ただ、本家の龍神録の方は前者の様に0で初期化して正しく動いている様なので、本家と私のコードのどこの違いが上記の様な原因を作ったのか分かりませんでした。
ご教示お願いします。
最後に編集したユーザー Fimbul on 2011年11月25日(金) 09:36 [ 編集 1 回目 ]

Fimbul
記事: 100
登録日時: 8年前

Re: 龍神録の改造 バグの原因が分からない

#6

投稿記事 by Fimbul » 8年前

原因が分かりました。

本家では nGameCount(本家では stage_count)を1で初期化をしていましたが、私は0で初期化をしていました。
そのため静的変数 enemyOrder[ENEMY_ORDER_MAX] の0で埋められたデータを登録していたようです。

コード:

//init.cpp init()
SetStageCount(0);
SetStageCount(1);

memset(enemy, -60, sizeof(enemy_t) * ENEMY_MAX)  
memset(enemy, 0, sizeof(enemy_t) * ENEMY_MAX)
それぞれ前者を後者に直したら、全ての敵が思い通りの行動をしてくれました。


閲覧、コメント、不具合の調査をしてくださった方々、大変ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る