



s11. 当たり判定。
シューティングゲームやアクションゲームなど、自機と敵との当たり判定を計算したい時がありますね。
そんな時はピタゴラスの定理を使いましょう。
直角三角形の底辺の2乗と高さの2乗の和は斜辺の2乗に等しいという奴です。
斜辺^2 = x^2 + y^2
これをふまえて図を見てください。

青を敵の当たり判定範囲だとします。黄色を自機の当たり判定範囲だとします。
int x , y , range ; として変数を用意し、
range = 自機範囲 + 敵範囲;
x = 自機.x - 敵.x;
y = 自機.y - 敵.y;
とすれば、
x^2 + y^2 = range^2
が成り立ちます。つまり、これより近くにあると言う事は、
x^2 + y^2 < range^2
この時、接触している事がわかります。その事を見せたサンプルがこちらです。
↓コピー&コンパイル用サンプルプログラム↓
#include "DxLib.h"
typedef struct{
int x,y,range;
}enemy_t;
enemy_t enemy[2];
int count=0;
char Key[256];
void ini(){
enemy[0].range=100;
enemy[1].range=180;
}
void set(){
enemy[0].x=GetRand(640);
enemy[0].y=GetRand(480);
enemy[1].x=GetRand(640);
enemy[1].y=GetRand(480);
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ini();
int x,y,range=enemy[0].range+enemy[1].range;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //描画先を裏画面に設定
SetDrawBlendMode( DX_BLENDMODE_ADD , 256 ) ;//これは気にしなくていい。
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了
if(count%120==0) set();
DrawCircle(enemy[0].x,enemy[0].y,enemy[0].range,GetColor(255, 0, 0),TRUE);
DrawCircle(enemy[1].x,enemy[1].y,enemy[1].range,GetColor( 0,255,255),TRUE);
x=enemy[0].x-enemy[1].x;
y=enemy[0].y-enemy[1].y;
if(x*x+y*y<range*range)
DrawString( 0,0,"○接触しています!!○",GetColor(255,255,0));
else
DrawString(300,0,"×接触していません。×",GetColor(255,255,0));
count++;
ScreenFlip();
}
DxLib_End();
return 0;
}
実行結果
- Remical Soft -