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 -