ページ 11

龍神録レーザー部でのエラーについて

Posted: 2009年5月03日(日) 19:50
by あ~る
お久しぶりです
龍神録の館のレーザーを実装するところでなんとかコンパイルは通ったんですけど、レーザーが太くなる時に
atan2:DOMAIN error
というメッセージが出てきてプログラムが止まってしまいます
OKボタンを押すと問題無く進むんですけど、このままだとゲームとして論外なんで、どなたか解決策を教えて下さい
環境はBCCでソースは館の物をほとんどいじっていません

(5/4 9:20 管理人により題名が変更されました)

Re:エラーについて

Posted: 2009年5月03日(日) 20:01
by MNS
思うに、0の除算が行われているせいではないでしょうか?
atan2の引数が0である場合はないか確認してください。

Re:エラーについて

Posted: 2009年5月03日(日) 20:56
by あ~る
レーザーと当たり判定を求める式の中の、get_sita関数の中の変数thetaに使われてるatanが0の時に「エラー」と表示されるようにしたら、「エラー」が2個表示されました(その後一回弾幕がループ(もう一度レーザーが描画)するごとに2個ずつ表示されました)
これはどうすればいいのでしょうか?

Re:エラーについて

Posted: 2009年5月03日(日) 20:58
by box
> 変数thetaに使われてるatanが0以下の時に「エラー」と表示されるようにしたら

ソースコードを見せてください。
atanが0以下のとき、の意味がわかりません。

Re:エラーについて

Posted: 2009年5月03日(日) 21:00
by あ~る
あ、すいません、編集したんですけど間に合いませんでした
atanが0以下の時ではなく0の時の事でした

Re:エラーについて

Posted: 2009年5月03日(日) 21:07
by あ~る
というか調べるのは引数ですね
物凄い勘違いしてた気がします
すいませんでした、もう一度調べ直してきます

Re:エラーについて

Posted: 2009年5月03日(日) 21:15
by あ~る
atan2に渡されている引数sとtが0の時、それぞれ別の表示をするようにしたら1回弾幕がループする毎にそれぞれ2回ずつ表示されました
ソースは龍神録のをコピペしたので間違いは無いと思うのですが、どこか足りてない部分があるかもしれません

Re:エラーについて

Posted: 2009年5月03日(日) 21:30
by MNS
コピー・ペーストしたというなら、
どこかをコピー・ペーストし忘れているのかもしれませんし、
ソースコードの中で、自分の独自の処理を行っていると、
たとえコピー・ペーストしたコードがあっていたとしても、
食い違う点が出てきてしまうかもしれません。

しっかりと理屈を理解しておかないと、こういう不測の状況で困りますので、
コードを提示できなというのなら、理屈を1から理解して、書き直すしかないと思います。
こういう場合は、コードを提示しないと、解決は難しいと思いますので。
(私が回答できるかは別として、ですが)

私はレーザーをゲームとして実装したことがないので、
的確な回答はできないですが、34章を読んだ限りでは、
内積・外積を求める関数で何かを間違えていることしか考えられません

Re:エラーについて

Posted: 2009年5月03日(日) 21:33
by Justy

>ソースは龍神録のをコピペした

 館の方はすべて VisualC++を前提としており、その場合は atan2のそれぞれの引数に 0を
入れてもそのまま実行を続けますが、BCCの場合はエラーになります。

 なので、両方の引数が 0だった場合は atan2を実行しないようにしてください。

 どうしても 0でもかまわず実行したいのでれば、

int _matherr(struct _exception *__e) { return 1; }

をソースのどこかに入れてください。

 これで数学系のエラーは(それが良いことなのかどうかは別にして)出なくなります。

ttp://d.hatena.ne.jp/wata_d/20061017/1161052576

Re:エラーについて

Posted: 2009年5月03日(日) 21:50
by あ~る
皆さんありがとうございました!
atanの前に
if(s!=0&&t!=0)
を入れたら無事動くようになりました
BCCでは駄目だったんですね…知りませんでした…
どうもありがとうございました!

Re:エラーについて

Posted: 2009年5月04日(月) 09:15
by Dixq (管理人)
× ソースは龍神録のをコピペしたので間違いは無いと思うのですが
○ ソースは龍神録のをコピペしたので間違いがあると思うのですが

でお願いします(汗
VC++を前提にしているので,他が考慮出来ていませんでした。ごめんなさい。
修正したいのですが,龍神録のこのコードは前の章の内容を直すと後のコードも全て直さないといけないのがやっかいなんですよね・・;

Re:龍神録レーザー部でのエラーについて

Posted: 2009年5月04日(月) 20:46
by あ~る
わかりました、以後気をつけます(笑)
元はといえばVC用だって分かっておきながらBCでやってる僕がいけないので…(-.-;)

そしてもう一個質問が出来てしまいました…
レーザーはちゃんと描画出来るようになったのですが(微妙に当たり判定にミスがありましたが…)ボスのHPを0にしてもレーザーが描画されたままになってしまいました…
これもどこかでVCと違いが出ているのでしょうか?
どなたか理由が分かる方がいらっしゃいましたら教えて下さい

Re:龍神録レーザー部でのエラーについて

Posted: 2009年5月04日(月) 21:07
by Dixq (管理人)
むむむ・・きっとボスのHPが0になった時にレーザーに関わる構造体がリセットされていないんだと思います。
ボスのHPが0になった時

memset(レーザーの先頭アドレス, 0, レーザーの領域分);

が書いてなければ初期化漏れだと思います・・。

Re:龍神録レーザー部でのエラーについて

Posted: 2009年5月05日(火) 00:25
by あ~る
ありがとうございます!
どこに入れれば良いのかわかんなかったんですけど、とりあえずenter_boss関数の中に書いたら上手くいったんですけど、あってましたかね?(プロジェクトの中を探しても発見出来なかったので…)
つまらないミスでお手を煩わせてすいませんでした…
ありがとうございました!!