シューティングゲームであたり判定を実施したいのですがなぜかできません。
あたり判定部分のコード↓(汚いですがすいません)
回答お願いします
なぜかあたり判定が付かない・・・
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: なぜかあたり判定が付かない・・・
直接的な回答じゃないですが、こういう奴のデバッグ方法をお伝えします。
DXライブラリの場合は、printfDxを使って変数を表示してみましょう。
あと条件ごとに分解して、それぞれの条件成立を確認するのも方法です。 確認用なので、うまく行ったら一行にまとめて良いですよ。
DXライブラリの場合は、printfDxを使って変数を表示してみましょう。
あと条件ごとに分解して、それぞれの条件成立を確認するのも方法です。 確認用なので、うまく行ったら一行にまとめて良いですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: なぜかあたり判定が付かない・・・
確かにこれでは当たり判定が付きませんね。
x>Aかつx<Aを満たすxは存在するでしょうか。
当たり判定の左上の座標と右下の座標はそれぞれどうなるか考えてみてください。
x>Aかつx<Aを満たすxは存在するでしょうか。
当たり判定の左上の座標と右下の座標はそれぞれどうなるか考えてみてください。
Re: なぜかあたり判定が付かない・・・
>>ソフト屋さん
なんか荒ぶってる。
実行結果↓ ↓間違えてた
>>Tatuさん
確かにそうですねw
気づいて編集しました↓
なんか荒ぶってる。
実行結果↓ ↓間違えてた
>>Tatuさん
確かにそうですねw
気づいて編集しました↓
最後に編集したユーザー プラム on 2015年1月03日(土) 10:08 [ 編集 1 回目 ]
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: なぜかあたり判定が付かない・・・
Tatu さんが図を書いてますが、よく分からない時は図を書きましょう。
方眼紙があれば、紙の上でも簡単によく分かる形で確認できますよ。
これもデバッグの方法です。
方眼紙があれば、紙の上でも簡単によく分かる形で確認できますよ。
これもデバッグの方法です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: なぜかあたり判定が付かない・・・
>>Tatuさん
龍と書いてしまったのは間違えてしまっただけです。本当にすいませんでした!
龍と書いてしまったのは間違えてしまっただけです。本当にすいませんでした!
Re: なぜかあたり判定が付かない・・・
適当なコードを書いて実験してみましたが、あたり判定は付いているようです。
他のところがおかしいのではないでしょうか?
他のところがおかしいのではないでしょうか?
#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で殴ればいい!(死亡フラグ)
Re: なぜかあたり判定が付かない・・・
みけさんのコードを少し改良して入れてみたら(あのままでは入らなかったので)あたり判定が付きました!何が悪かったのかはわかりませんがみなさんありがとうございました!