ページ 11

なぜかあたり判定が付かない・・・

Posted: 2015年1月02日(金) 13:48
by プラム
シューティングゲームであたり判定を実施したいのですがなぜかできません。
あたり判定部分のコード↓(汚いですがすいません)

コード:

                              	if(shot[i]==1){ //もしi番目のショットが放たれているなら
		
					if(plx+HIT_W<x[i]&&plx+HIT_W>x[i]&&ply+HIT_H<y[i]&&ply+HIT_H>y[i]){ //あたり判定(何でできないwww)
 
                                               Plminus();

                                        }
                                }
回答お願いします

Re: なぜかあたり判定が付かない・・・

Posted: 2015年1月02日(金) 14:21
by softya(ソフト屋)
直接的な回答じゃないですが、こういう奴のデバッグ方法をお伝えします。
DXライブラリの場合は、printfDxを使って変数を表示してみましょう。
あと条件ごとに分解して、それぞれの条件成立を確認するのも方法です。

コード:

	printfDX( "plx + HIT_W =%d x[i]=%d", plx + HIT_W , x[i] ) ;
	if( plx + HIT_W < x[i] ) {
		printfDX 以下略
		if( plx + HIT_W > x[i] ) {
			printfDX 以下略
			if( ply + HIT_H < y[i] ) {
				printfDX 以下略
				if( ply + HIT_H > y[i] ) {
					
				}
			}
		}
	}
確認用なので、うまく行ったら一行にまとめて良いですよ。

Re: なぜかあたり判定が付かない・・・

Posted: 2015年1月02日(金) 14:26
by プラム
ありがとうございます。
試してみます

Re: なぜかあたり判定が付かない・・・

Posted: 2015年1月02日(金) 14:28
by Tatu
確かにこれでは当たり判定が付きませんね。
x>Aかつx<Aを満たすxは存在するでしょうか。
図.png
図.png (4.33 KiB) 閲覧数: 2103 回
当たり判定の左上の座標と右下の座標はそれぞれどうなるか考えてみてください。

Re: なぜかあたり判定が付かない・・・

Posted: 2015年1月02日(金) 14:35
by プラム
>>ソフト屋さん
なんか荒ぶってる。
実行結果↓
メチャクチャ.png
↓間違えてた
>>Tatuさん
確かにそうですねw
気づいて編集しました↓

コード:

if(plx+HIT_W>x[i]&&plx-HIT_W<x[i]&&ply+HIT_H>y[i]&&ply-HIT_H<y[i]){

Re: なぜかあたり判定が付かない・・・

Posted: 2015年1月02日(金) 15:05
by softya(ソフト屋)
Tatu さんが図を書いてますが、よく分からない時は図を書きましょう。
方眼紙があれば、紙の上でも簡単によく分かる形で確認できますよ。
これもデバッグの方法です。

Re: なぜかあたり判定が付かない・・・

Posted: 2015年1月03日(土) 10:03
by プラム
あ、はい(どっちにしろまだ解決してないですけどねw)

Re: なぜかあたり判定が付かない・・・

Posted: 2015年1月03日(土) 10:03
by プラム
あ、はい(どっちにしろまだ解決してないですけどねw)

Re: なぜかあたり判定が付かない・・・

Posted: 2015年1月03日(土) 10:09
by プラム
>>Tatuさん
龍と書いてしまったのは間違えてしまっただけです。本当にすいませんでした!

Re: なぜかあたり判定が付かない・・・

Posted: 2015年1月03日(土) 11:01
by みけCAT
適当なコードを書いて実験してみましたが、あたり判定は付いているようです。
他のところがおかしいのではないでしょうか?

コード:

#include <DxLib.h>
#include <cmath>

void Plminus(void) {
	DrawString(10,10,"Plminus",GetColor(255,255,255));
}

char Key[256];

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) {
	if(ChangeWindowMode(TRUE)!=DX_CHANGESCREEN_OK || DxLib_Init()==-1) return -1;
	SetDrawScreen(DX_SCREEN_BACK);

	int sw,sh,cbd;
	GetScreenState(&sw,&sh,&cbd);

	const int SHOT_MAX = 10000;

	double plx = 320;
	double ply = 400;
	double HIT_W = 20;
	double HIT_H = 30;
	static double x[SHOT_MAX];
	static double y[SHOT_MAX];
	static double dx[SHOT_MAX];
	static double dy[SHOT_MAX];
	static int shot[SHOT_MAX];

	double plspeed = 3; // ピクセル毎フレーム
	int kankaku = 4; // フレーム
	double speed = 0.5; // ピクセル毎フレーム
	double syuki =131; // フレーム

	int count = 0;

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

		// 玉を出す
		if(count%kankaku==0) {
			for(int i=0;i<SHOT_MAX;i++) {
				if(shot[i]==0) {
					shot[i]=1;
					x[i]=150;
					y[i]=150;
					dx[i]=speed*cos(2*3.1415926535897932384626433*count/syuki);
					dy[i]=speed*sin(2*3.1415926535897932384626433*count/syuki);
					break;
				}
			}
		}
		count++;

		// 自機を移動する
		if(plx-HIT_W>plspeed && Key[KEY_INPUT_LEFT])plx-=plspeed;
		if(ply-HIT_H>plspeed && Key[KEY_INPUT_UP])ply-=plspeed;
		if(plx+HIT_W<sw-plspeed && Key[KEY_INPUT_RIGHT])plx+=plspeed;
		if(ply+HIT_H<sh-plspeed && Key[KEY_INPUT_DOWN])ply+=plspeed;
		// 自機を描画する
		DrawBox(plx-HIT_W,ply-HIT_H,plx+HIT_W,ply+HIT_H,GetColor(255,0,0),FALSE);
		// 玉を処理する
		for(int i=0;i<SHOT_MAX;i++) {
			// 移動と描画
			if(shot[i]!=0) {
				x[i]+=dx[i];
				y[i]+=dy[i];
				DrawLine(x[i]-5,y[i]-5,x[i]+5,y[i]+5,GetColor(0,255,0));
				DrawLine(x[i]+5,y[i]-5,x[i]-5,y[i]+5,GetColor(0,255,0));
				if(x[i]<-10 || x[i]>sw+10 || y[i]<-10 || y[i]>sh+10)shot[i]=0;
			}
			// 当たり判定
			if(shot[i]==1){ //もしi番目のショットが放たれているなら
				if(plx+HIT_W>x[i]&&plx-HIT_W<x[i]&&ply+HIT_H>y[i]&&ply-HIT_H<y[i]){ //あたり判定(何でできないwww)
					Plminus();
				}
			}
		}

		ScreenFlip();
	}

	DxLib_End();
	return 0;
}

Re: なぜかあたり判定が付かない・・・

Posted: 2015年1月03日(土) 16:27
by プラム
みけさんのコードを少し改良して入れてみたら(あのままでは入らなかったので)あたり判定が付きました!何が悪かったのかはわかりませんがみなさんありがとうございました!