ページ 11

当たり判定について

Posted: 2009年11月24日(火) 20:57
by Ω
今プチSTGを作っています。
当たり判定を実装しようとしたんですが、うまくいきません。
ゲームプログラミングの館のs11を参考にしましたが、反応がありません。
質問ばかりだとバグ取り能力が育たないんだろうな・・・orz
↓プログラムコード
//コードが長すぎて投稿できないので前板参照「弾の描画について 2」

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

Ziki.x  =320;                      //自機に座標を代入
Ziki.y  =240;
Ziki.hp =Zhp;
Ziki.Mhp=Zhp;
Teki[0].x  =640;
Teki[0].y  =120;
Teki[0].hp =Thp;
Teki[0].Mhp=Thp;

int Ziki_image[Z_image],Teki_image[T_image],Count;

if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

/////////////////////////////////////////////////////////////////////////

SetDrawScreen(DX_SCREEN_BACK);                   //裏画面に設定
LoadDivGraph("Ziki.png",2,2,1,20,26,Ziki_image); //画像を読み込ませる
LoadDivGraph("Teki.png",2,2,1,20,26,Teki_image);

for(int i=0; i<Tamax; i++){
   Tama.Flag =0;
   Tama.x    =Ziki.x;
   Tama.y    =Ziki.y;
 T_Tama.TFlag=0;
 T_Tama.x    =Teki[0].x;
 T_Tama.y    =Teki[0].y;
}

int Range=Ziki.Range+Teki[0].Range;

/////////////////////////////////////////////////////////////////////////

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){

int X=Ziki.x-Teki[0].x,Y=Ziki.y-Teki[0].y;
int Red=GetColor(255,0,0),Blue=GetColor(0,255,255);


Ziki.         Range=7;
Tama[Tamax].  Range=2;

Teki[0].      Range=7;
T_Tama[Tamax].Range=2;   
   
   fps();                          //fpsを固定&表示
   count++;
   wait_fanc();

if(Teki[0].x> -30)Teki[0].x-=10;
   if(Teki[0].x==-30)Teki[0].x=800;
      
   
   if(Key[KEY_INPUT_LEFT]==1)
      Ziki.x-=4;
   if(Key[KEY_INPUT_UP]==1)
      Ziki.y-=4;
   if(Key[KEY_INPUT_RIGHT]==1)
      Ziki.x+=4;
   if(Key[KEY_INPUT_DOWN]==1)
      Ziki.y+=4;
      
   if(X*X+Y*Y<Range*Range){                    //ココ
      DrawCircle(30,30,100,Red,TRUE);
   }
   
   Shot_Tama();
   
   for(int i=0; i<Tamax; i++){
      if(Tama.Flag==1){
         if(Tama.y>0)Tama.y-=T_Speed;
	 else           Tama.Flag=0;
     
         DrawCircle(Tama[i].x,Tama[i].y,ZRange,Blue,TRUE);
      }
   }
   
   Shot_T_Tama();
   
   for(int i=0; i<Tamax; i++){
      if(T_Tama[i].TFlag==1){
         if(T_Tama[i].y<500)T_Tama[i].y+=Teki_Speed;
	 else           T_Tama[i].TFlag=0;
     
         DrawCircle(T_Tama[i].x,T_Tama[i].y,TRange,Red,TRUE);
      }
   }
   
   DrawCircle(Ziki.x+7,Ziki.y+11,Ziki.Range,Red,TRUE         );
   DrawCircle(Teki[0].x+7,Teki[0].y+10,Teki[0].Range,Red,TRUE);
   
   //DrawBox   (50,400,150,405,GetColor(255,255,255),FALSE);      バグってるので放置してる
   //DrawBox   (51,400,51+Zhp*Ziki.hp/Ziki.Mhp,405,GetColor(255,255,255),TRUE ); 
   
   DrawGraph (Ziki.x,Ziki.y,Ziki_image[0],TRUE      );
   DrawGraph (Teki[0].x,Teki[0].y,Teki_image[0],TRUE);
   
   ScreenFlip();
}

/////////////////////////////////////////////////////////////////////////
        DxLib_End() ;           // DXライブラリ使用の終了処理
        return 0 ;              // ソフトの終了
}

Re:当たり判定について

Posted: 2009年11月24日(火) 21:19
by softya
それとデバッグ能力を育てたかったら、当たり判定処理でどうなって当たっていない事になっているか調べてみてください。調べ方が分からなかったら聞いてください。
ヒントは、
・ブレークポイントとステップ実行
・OutputDebugString
のどちらかを使う事。両方使っても可です。

Re:当たり判定について

Posted: 2009年11月25日(水) 17:44
by Ω
すいません・・・
自分はC言語のコンソールアプリケーションより先にWindowsアプリケーションを始めた、
つまりC言語の予備知識なんて皆無なんです。
ブレークポイントの使い方とかステップ実行とか全然わかりません。
ブレークポイントは確か「/*」「*/」ですよね?

Re:当たり判定について

Posted: 2009年11月25日(水) 17:58
by Mist
> ブレークポイントは確か「/*」「*/」ですよね?

ぜんぜん違います。
それはコメントアウトです。
知らない言葉はまずググってみるほうがいいです。
それだけで、解決することはよくあります。

http://cvwww.ee.ous.ac.jp/vc08prog.html
かなり下のほうの「ブレークポイントの設定」以降を読んでください。

Re:当たり判定について

Posted: 2009年11月25日(水) 18:05
by softya
>ブレークポイントは確か「/*」「*/」ですよね?
それは残念ながらコメントですね。
C言語の基本文法は平行して勉強された方が良いです。今後絶対、それが原因でつまづきます。

と言うことで、今後のためにデバッグ講座です。
今から説明するのはC言語の予備知識と言うより、開発環境(VisualStudio)の使い方なんですけどね。
デバッグが出来ると質問してそのものズバリな回答を貰うよりもっと深い知識、考え方を身につけることが可能だと私は思います。まぁ、考え抜いて分からないなら質問したほう良いですけど。

まず、基本的なブレークポイントやステップ実行の知識です。
http://journal.mycom.co.jp/articles/200 ... index.html

OutputDebugStringの使い方。
http://marupeke296.com/DBG_No3_OutputDebugWindow.html
OutputDebugStringは通過する予定の場所や確認したい変数を調べるのに使います。
今回の場合は、当たり判定処理の何処で当たらないと見なされているかと、その時のあたり判定座標を確認してみると思います。
細かい点で、分からなかった聞いてください。

Re:当たり判定について

Posted: 2009年11月25日(水) 18:08
by YuO
> 自分はC言語のコンソールアプリケーションより先にWindowsアプリケーションを始めた、
> つまりC言語の予備知識なんて皆無なんです。
> ブレークポイントの使い方とかステップ実行とか全然わかりません。

コンソールアプリケーションを作らなくても,デバッグの仕方をしらないと現実問題としてプログラムは作れません。

Visual Studioの使用を前提とすると,

・ブレークポイントの設定および解除
設定したい行に移動して[デバッグ] - [ブレークポイントの設定/解除]
※設定したい行の左端でクリックでも可。赤丸を右クリックしてブレークポイントの各種設定が可能。

ブレークポイントを設定すると,その行を実行する直前で実行が停止します。
ウォッチやスタックトレースと組み合わせて,オブジェクトの値や呼び出し順序を調べることが出来ます。
ただし,Windows メッセージの順序に注意してください。
# WM_PAINT中にブレークポイントを置いたりすると,WM_PAINTが延々と呼び出されたりします。

MSDN: ブレークポイントとトレースポイント
http://msdn.microsoft.com/ja-jp/library/ktf38f66.aspx


・ステップ実行
ブレークポイント等によって実行が一時停止状態になった後,[デバッグ]-[ステップイン] or [ステップオーバー] or [ステップアウト]

ステップ実行は一文ずつ実行していく機能です。
ステップインは関数呼び出し時に関数内までステップ実行します。
ステップオーバーは関数呼び出し時に関数内はステップ実行しません。
ステップアウトは関数から抜け出すまでステップ実行を飛ばします。

MSDN: コードのステップ実行の概要
http://msdn.microsoft.com/ja-jp/library/ek13f001.aspx


OutputDebugStringは,デバッグ出力として文字列を出力することが出きます。
Visual Studioを使っているのであれば,トレースポイントで代用した方が簡単だと思います。
MSDN: 方法 : トレースポイントとブレークポイントのアクションを指定する
http://msdn.microsoft.com/ja-jp/library/232dxah7.aspx

他にも,怪しげな場所で変数値をファイルに出力するようなことをしてみたり,というのも有効です。
# ログの出力はリリース版にも仕込まれていたりすることがあります。

> ブレークポイントは確か「/*」「*/」ですよね?

それはコメントです。

Re:当たり判定について

Posted: 2009年11月25日(水) 18:44
by Ω
/* */ はコメントアウトなんですね・・・ 言い忘れましたけど、C++は少し出来ます。
環境はBCC Developerなので、デバッガのダウンロード等します。なので少し遅くなります

Re:当たり判定について

Posted: 2009年11月25日(水) 19:21
by softya
>/* */ はコメントアウトなんですね・・・ 言い忘れましたけど、C++は少し出来ます。
C++でもコメントアウトですよ。

BCCの場合は、Turbo Debugger 5.5を使ってください。
http://www.plustarnet.com/aspil/Programming/c14.htm

Re:当たり判定について

Posted: 2009年11月25日(水) 19:42
by Ω
紹介ありです。ダウンロードして、デバッガの設定をして試運転してみました。
すごく・・・やりづらいです・・・ これから慣れていこうと思います。
それはそうと、ブレークポイントの使い道がよく分かりません。設定した行に入るとプログラムを停止させて、
デバッガの方に制御権が移るのは分かりますが、そこからどうすればいいか分かりません。

>C++でもコメントアウトですよ。
ほぉー そうなんですか。そういえばCとC++は互換性があるらしいですね。

Re:当たり判定について

Posted: 2009年11月25日(水) 21:16
by softya
>デバッガの方に制御権が移るのは分かりますが、そこからどうすればいいか分かりません。

Watchで変数の内容を見たり、F8でステップ実行したり、更に先のポイントにブレークポイントを設定(F2)してF9でそこまで進めるとかして、自分の思ったとおりプログラムが流れているか、変数の内容は思ったとおりかを確認します。
プログラムを組んだわけですから、この行に来たときは変数の値はどうなっていて、どのif文がどのタイミングで動作するとかイメージが出来ているはずですから、そのイメージと違う動作をする部分を見つけるのがデバッグです。

Re:当たり判定について

Posted: 2009年11月26日(木) 18:16
by Ω
うーむ・・・ よく分かりませんね・・・   とりあえずデバッガの使い方を一通り勉強したいと思います。
どうしても解決しない場合はこの板を上げますので一時保留にしたいと思います。
いろいろと勝手ですいません;

Re:当たり判定について

Posted: 2009年11月26日(木) 18:44
by softya
無理にデバッガじゃなくてもかまいませんよ。
BCCでOutputDebugStringAPIを使う場合は次のようなツールをご用意ください。
http://www.geocities.jp/kissy2005jp/doc ... debug.html

それ以外の方法として、当たり判定の動作がちゃんと行われているか当たり判定関連の処理だけを抜き出して別のコンソールアプリにして当たり判定のパラメータを直接与えてしまえばprintfで情報を見る事もできます。こう言うのもデバッグのひとつの手法(ユニットテスト)なので活用してください。

デバッグテクニックの色々。参考↓
http://monoki.fc2web.com/diary/txt/comp ... atern.html

もしチェックするポイントやどの変数を見たら良いか分からないとしたらプログラムの流れや変数の役目を完全に理解できていないものと思われます。その場合は、何処を見ればよいの?って聞いてください。