#include "DxLib.h" #include #include #include #include #pragma warning(disable : 4996) int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ /* 変数の宣言はここから */ int Cr[5] ; int x[2],y[2]; int vx[2],vy[2]; int tmp[4]; int r; /* 変数の宣言はここまで */ /* ここから変更する必要なし */ SetGraphMode( 640 , 480 , 32 ) ; if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); //描画先を裏画面に設定 /* ここまで変更する必要なし */ Cr[0] = GetColor( 0 , 0 , 255 ) ; // 青色の値を取得 Cr[1] = GetColor( 255 , 0 , 0 ) ; // 赤色の値を取得 Cr[2] = GetColor( 0 , 255 , 0 ) ; // 翠色の値を取得 /* ここからソースコードの記述 */ // ここでボール1の座標設定 x[0] = 320; y[0] = 240; vx[0]= -2; vy[0]= 0; // ここでボール2の座標設定 x[1] = 160; y[1] = 240; vx[1]= 0; vy[1]= 0; // ボールの半径の設定 r = 5; while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ){ //ESCキーでWhile文を脱出 ClearDrawScreen() ; //画像描画の初期化、消さないこと // 文字の表示 DrawFormatString( 420 , 40 , GetColor(255,255,255) , "ボール赤 Vx = %d Vy = %d" , vx[0],vy[0] ) ; DrawFormatString( 420 , 60 , GetColor(255,255,255) , "ボール緑 Vx = %d Vy = %d" , vx[1],vy[1] ) ; DrawFormatString( 420 , 80 , GetColor(255,255,255) , "運動量の絶対値 : %f" , sqrt(pow(vx[0],2.0) + pow(vy[0],2.0)) + sqrt(pow(vx[1],2.0) + pow(vy[1],2.0)) ); // 正方形の箱の設定 DrawBox( 40 , 40 , 400 , 400 , Cr[0] , FALSE ) ; // ボールの設定 DrawCircle( x[0] , y[0] , r , Cr[1] , TRUE ) ; DrawCircle( x[1] , y[1] , r , Cr[2] , TRUE ) ; // ボールの当たり判定の条件 if( pow( (double)(x[0] - x[1]) , 2.0) + pow((double)(y[0] - y[1]) , 2.0) < pow((double)(r),2.0) ){ /* 条件式1 三平方の定理で二つのボールの距離を求め、そこから判定する */ tmp[0] = vx[1]; tmp[1] = vy[1]; tmp[2] = vx[0]; tmp[3] = vy[0]; vx[0] = tmp[0]; vy[0] = tmp[1]; vx[1] = tmp[2]; vy[1] = tmp[3]; }else if( ( (abs(400 - x[0]) < r) || (abs(40 - x[0]) < r) ) ){ /* 条件式2 横方面の壁の接触の判定式 */ vx[0] = -vx[0]; }else if( ( (abs(400 - y[0]) < r) || (abs(40 - y[0]) < r) ) ){ /* 条件式2 横方面の壁の接触の判定式 */ vy[0] = -vy[0]; }else if( ( (abs(400 - x[1]) < r) || (abs(40 - x[1]) < r) ) ){ /* 条件式2 横方面の壁の接触の判定式 */ vx[1] = -vx[1]; }else if( ( (abs(400 - y[1]) < r) || (abs(40 - y[1]) < r) ) ){ /* 条件式2 横方面の壁の接触の判定式 */ vx[1] = -vy[1]; } // ボールの進行 x[0] += vx[0]; x[1] += vx[1]; y[0] += vy[0]; y[1] += vy[1]; ScreenFlip() ; //裏画面に描画したグラフィックを表示 } /* ここまでソースコードの記述 */ DxLib_End() ; return -1; }