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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
プラム
記事: 164
登録日時: 10年前
住所: 東海地方

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

#1

投稿記事 by プラム » 9年前

シューティングゲームであたり判定を実施したいのですがなぜかできません。
あたり判定部分のコード↓(汚いですがすいません)

コード:

                              	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();

                                        }
                                }
回答お願いします

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 9年前

直接的な回答じゃないですが、こういう奴のデバッグ方法をお伝えします。
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] ) {
					
				}
			}
		}
	}
確認用なので、うまく行ったら一行にまとめて良いですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
プラム
記事: 164
登録日時: 10年前
住所: 東海地方

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

#3

投稿記事 by プラム » 9年前

ありがとうございます。
試してみます

アバター
Tatu
記事: 445
登録日時: 13年前
住所: 北海道

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

#4

投稿記事 by Tatu » 9年前

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

アバター
プラム
記事: 164
登録日時: 10年前
住所: 東海地方

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

#5

投稿記事 by プラム » 9年前

>>ソフト屋さん
なんか荒ぶってる。
実行結果↓
メチャクチャ.png
↓間違えてた
>>Tatuさん
確かにそうですねw
気づいて編集しました↓

コード:

if(plx+HIT_W>x[i]&&plx-HIT_W<x[i]&&ply+HIT_H>y[i]&&ply-HIT_H<y[i]){
最後に編集したユーザー プラム on 2015年1月03日(土) 10:08 [ 編集 1 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 9年前

Tatu さんが図を書いてますが、よく分からない時は図を書きましょう。
方眼紙があれば、紙の上でも簡単によく分かる形で確認できますよ。
これもデバッグの方法です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
プラム
記事: 164
登録日時: 10年前
住所: 東海地方

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

#7

投稿記事 by プラム » 9年前

あ、はい(どっちにしろまだ解決してないですけどねw)

アバター
プラム
記事: 164
登録日時: 10年前
住所: 東海地方

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

#8

投稿記事 by プラム » 9年前

あ、はい(どっちにしろまだ解決してないですけどねw)

アバター
プラム
記事: 164
登録日時: 10年前
住所: 東海地方

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

#9

投稿記事 by プラム » 9年前

>>Tatuさん
龍と書いてしまったのは間違えてしまっただけです。本当にすいませんでした!

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

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

#10

投稿記事 by みけCAT » 9年前

適当なコードを書いて実験してみましたが、あたり判定は付いているようです。
他のところがおかしいのではないでしょうか?

コード:

#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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
プラム
記事: 164
登録日時: 10年前
住所: 東海地方

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

#11

投稿記事 by プラム » 9年前

みけさんのコードを少し改良して入れてみたら(あのままでは入らなかったので)あたり判定が付きました!何が悪かったのかはわかりませんがみなさんありがとうございました!

閉鎖

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