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 -