- 1 名前:名無しさん@お腹いっぱい。 mailto: [01/11/21 04:33 ID:???]
- がんばりましょう。
- 601 名前:SGGK ◆6pZCoAtaxk mailto:sage [2009/03/04(水) 22:20:50 ID:M0lqZAHx]
- こちらは、まだまだバグ取り中〜。
昨日言っていたバグの原因は、プログラムをかなり略して書くと、 メインループ(){ 選手.move();//選手の移動処理 ボール.move();//ボールの移動処理 ゴール.move();//ゴールの移動?処理 当たり判定();//それぞれのオブジェクトの当たり判定をここでまとめて行う } ・・・となっていて、当たり判定関数の中では、 while(最後の選手まで繰り返す){ if( 選手とボールが当たっているか? ){ a->atari=true;// 選手のメンバ変数atariのフラグをONする。 b->atari=true;// ボールのメンバ変数atariのフラグをONする。 } else{ a->atari=false;// 選手のメンバ変数atariのフラグをOFFする。 b->atari=false;// ボールのメンバ変数atariのフラグをOFFする。 } ボールを蹴る処理は、メインループの「ボール.move();//ボールの移動処理」の中にあって、蹴れる条件は、 (Xキーが押されている)&&(ボールのatariフラグがONである) なのに対し、今のプログラムでは、自分がコントロールできるのは一番目の選手だけなので、 選手をボールに接触させてatariフラグをONにしても当たり判定関数のwhile内で最後の選手まで 判定するので、最後の選手はボールに触れてないから、b->atari=falseになって、ボールのatariフラグは結局最後にはOFFにされてしまう。 その状態でメインループのボール移動関数に戻るので、いつまでたってもボールを蹴れる条件が成立しない・・・orz
- 602 名前:名前は開発中のものです。 mailto:sage [2009/03/04(水) 22:40:39 ID:/ZV4wLD2]
- 何故else条件でボールのフラグを落とすのか、40文字以内で説明せよ(5点)
フラグ落とすのは選手だけでいいと思うんだが。そもそもボールのフラグもいらない。 ボール持ってる選手しか蹴る(移動の初期値を与える)ことができないのなら ボール支配できたときにボール蹴る関数にでも飛ばせばいいと思うが、どうか。
- 603 名前:436 mailto:sage [2009/03/05(木) 00:50:31 ID:LR5dYdvr]
- ああああせりました;
窓枠ドラッグ時の拡大率を取得する為SetAlwaysRunFlag();をON-OFF多用してたら なぜかSetAlwaysRunFlag();をOFFにするとデバッグに行く途中で止まり、 ON状態の一文を入れないと動かなくなり、とうとうそれを入れても入れなくても動かなくなり・・・ VCリインストールしたら今度はヘッダファイルを読まなくなり(パスは渡してるのに)、 レジストリからVC関連を全消去してリインストール、さっきようやくまともに動いたっぽい SetAlwaysRunFlag();を乱用乱発してたのが悪かったのかなぁ
- 604 名前:SGGK ◆6pZCoAtaxk mailto:sage [2009/03/05(木) 23:27:28 ID:hIYt1MGi]
- >>602
else条件でボールのフラグを落とすのは、(Xキー押し)&&(ボール接触フラグON)がボールを蹴れる条件なので、 選手がボールから離れている(else)時には、ボール接触フラグをOFFにする必要があった為。 今のプログラムでは、ボールに接触してるので蹴ろうとしても、ボールに接触していない選手がいたら、elseが成立してしまい ボールの接触フラグをOFFされてしまうという問題がありました・・・。 確かに今思うとボールのフラグは必要無かった様です。 選手全てにボールに接触してるかどうかを表すフラグを持たせておいたのは、同時に複数の選手がボールを蹴る様な場合を考えてました。 同時蹴りの時にボールに接触してる複数の選手から一人を選ぶ仕組みが必要かと思いながら実装の案はまだ何もなし・・・。 バグの修正はもう少し検討中〜、今のボール移動関数は、選手のデータを引数に持っていないので、選手のフラグ変数を使えないのデス・・・orz >>603 レジストリとか全然わからないので、自分もその関数には注意しておきます〜。
- 605 名前:名前は開発中のものです。 mailto:sage [2009/03/06(金) 00:01:32 ID:zNsEmWk0]
- >同時に複数の選手がボールを蹴る様な場合を考えてました。
それは「蹴った」時の処理であって、 接触したかどうか判定する時点では関係ないんじゃないかな。 同時蹴りの優先度は確かに悩むところだね。
- 606 名前:436 mailto:sage [2009/03/06(金) 00:30:05 ID:SvQUccHR]
- 拡大率取得する関数がすでにあったorz
拡大率変えるとSetMousePointが元のウィンドウの大きさ基準で動く為、 元の解像度を超える座標を指定出来ないorz ので、新たに思い付いたインタフェース案はモロにその影響を受ける為、 すっぱりあきらめられたw 今は構造をもっとスッキリ出来ないかイジクリ中 >>604 今後は念の為C:とソースのバックアップを取る様にしました;
- 607 名前:SGGK ◆6pZCoAtaxk mailto:sage [2009/03/06(金) 23:39:57 ID:Fo+vpfkW]
- >それは「蹴った」時の処理であって、
>接触したかどうか判定する時点では関係ないんじゃないかな。 た・・・確かにそうです。 メインループ内での処理を移動、当たり判定に分けておいて、当たり判定内で いろいろな組み合わせの当たり判定をあらかじめ行い、その結果を各種フラグ変数に記憶させておいて 移動関数でそのフラグ変数を参照するようにすれば、移動関数から当たり判定関数を呼ばなくても済み、 プログラムが整理できそうな気がしたけど、なかなか上手く行っていないです・・・orz >>606 そういえば自分もバックアップ全然取っていないです。もしもハードディスクがクラッシュしたら・・・。(汗;) やっと>539のバグがなんとか取れました。(もっと日数かかるかと思ってた) このスレでやってたおかげでVC++2008EEに移れた影響も大きかった。 ボール移動関数に選手のオブジェクトのアドレスを渡して、選手のメンバ変数の中から ボールとの当たり判定用フラグにアクセスして、(Xキー押し)&&(ボールとの当たり判定用フラグON)が真なら ボール移動処理に移る様にするとOK!
|

|