DXlibの画像の当たり判定について
Posted: 2014年4月18日(金) 00:13
#include "DxLib.h"
#include <math.h>
#define MAX_M 100 // ミサイルの最大数定義
#define PI 3.14159 // 円周率
// データ定義
int Hx , Hy ; // 砲台の座標
int Hm ; // 砲台の移動方向
int Hsc ; // 砲台のショット間隔カウンタ
int Px , Py ; // 自機の座標
int Mg,hune,ko_n,haikei,clear,over; // ミサイルのグラフィック
int Mx[ MAX_M ] ,My[ MAX_M ] ; // ミサイルの座標
int Msx[ MAX_M ] , Msy[ MAX_M ] ; // ミサイルの速度
int Mv[ MAX_M ] ; // ミサイルデータの使用状態(1:使用中 0:未使用)
double Ma[ MAX_M ] ; // ミサイルの角度
int Mc[ MAX_M ] ; // ミサイルの追尾カウンタ
// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int Key ;
LONGLONG Time ;
int i ;
int lost=0,win=0;
// 画面モードの設定
SetGraphMode( 640 , 480 , 16 ) ;
// DXライブラリ初期化処理
if( DxLib_Init() == -1 )
{
// エラーが起きたら直ちに終了
return -1;
}
// 描画先を裏画面にセット
SetDrawScreen( DX_SCREEN_BACK ) ;
// 初期化処理
{
// ミサイルのグラフィックロード
Mg = LoadGraph( "ika.png" ) ;
hune = LoadGraph("漁船.png");
ko_n = LoadGraph("コーン.png");
haikei = LoadGraph("haikei.png");
clear = LoadGraph("gameclear.png");
over = LoadGraph("gameover.png");
// 自機の座標セット
Px = 320 ; Py = 200 ;
// 砲台の座標セット
Hx = 320 ; Hy = 30 ;
// 砲台の移動方向セット
Hm = 3 ;
// 砲台の移動間隔カウンタセット
Hsc = 30 ;
// ミサイルデータの初期化
for( i = 0 ; i < MAX_M ; i ++ )
Mv[ i ] = 0 ;
}
// ゲームループ
Time = GetNowHiPerformanceCount() + 1000000 / 60 ;
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// プレイヤーの移動処理
{
// 入力取得
Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;
if( Key & PAD_INPUT_RIGHT ) Px += 5 ; // 右を押していたら右に進む
if( Key & PAD_INPUT_LEFT ) Px -= 5 ; // 左を押していたら左に進む
if( Key & PAD_INPUT_UP ) Py -= 5 ; // 上を押していたら上に進む
if( Key & PAD_INPUT_DOWN ) Py += 5 ; // 下を押していたら下に進む
// 画面外に出ていたら補正
if( Px > 640 - 16 ) Px = 640 - 16 ;
if( Px < 0 ) Px = 0 ;
if( Py > 480 - 16 ) Py = 480 - 16 ;
if( Py < 0 ) Py = 0 ;
}
// ミサイルの移動処理
for( i = 0 ; i < MAX_M ; i ++ )
{
// ミサイルデータが無効だったらスキップ
if( Mv[ i ] == 0 ) continue ;
// 照準に当たっていたらミサイルデータを無効にする
if( ( ( Mx[ i ] > Px && Mx[ i ] < Px + 32 ) || ( Px > Mx[ i ] && Px < Mx[ i ] + 16 ) ) &&
( ( My[ i ] > Py && My[ i ] < Py + 32 ) || ( Py > My[ i ] && Py < My[ i ] + 16 ) ) )
{
Mv[ i ] = 0 ;
continue ;
}
// 追尾カウンタが規定値に来ていなければ追尾処理
if( Mc[ i ] < 100 )
{
double ax , ay , bx , by ;
// bx,by 自分の進んでいる方向 ax,ay 本来進むべき方向
bx = cos( Ma[ i ] ) ;
by = sin( Ma[ i ] ) ;
ax = ( Px + 16 ) - Mx[ i ] ;
ay = ( Py + 16 ) - My[ i ] ;
// 外積を利用し向きを照準側に向ける
Ma[ i ] += ( ax * by - ay * bx < 0.0 ) ? + PI / 180 * 15 : - PI / 180 * 15 ;
}
// 追尾カウンタ加算
Mc[ i ] ++ ;
// 速度変更
Msx[ i ] += ( int )( cos( Ma[ i ] ) * 30.0 );
Msy[ i ] += ( int )( sin( Ma[ i ] ) * 30.0 );
// 移動
Mx[ i ] = ( Mx[ i ] * 100 + Msx[ i ] ) / 100 ;
My[ i ] = ( My[ i ] * 100 + Msy[ i ] ) / 100 ;
// 画面外に出ていたらミサイルデータを無効にする
if( Mx[ i ] < -100 || Mx[ i ] > 740 ||
My[ i ] < -100 || My[ i ] > 580 ) Mv[ i ] = 0 ;
}
// 砲台の移動処理
{
Hx += Hm ;
// 画面端まで来ていたら反転
if( Hx > 640 - 16 || Hx < 0 ) Hm *= -1 ;
// ショットカウンタを減らす
Hsc -- ;
// カウンタが0になっていたらミサイル発射
if( Hsc == 0 )
{
// 使われていないミサイルデータを探す
for( i = 0 ; i < MAX_M ; i ++ )
{
if( Mv[ i ] == 0 ) break ;
}
// もし使われていないミサイルデータがあったらショットを出す
if( i != MAX_M )
{
// ミサイルの位置を設定
Mx[ i ] = Hx + 16 ;
My[ i ] = Hy + 16 ;
// 速度セット
Msx[ i ] = 0 ;
Msy[ i ] = 0 ;
// 角度をセット
Ma[ i ] = PI / 2 ;
// 追尾カウンタをセット
Mc[ i ] = 0 ;
// ショットデータを使用中にセット
Mv[ i ] = 1 ;
}
// 発射間隔カウンタ値をセット
Hsc = 30 ;
}
}
// 描画処理
{
// 画面の初期化
ClearDrawScreen() ;
DrawExtendGraph(0,0,640,480,haikei,FALSE);
// ミサイルの描画
for( i = 0 ; i < MAX_M ; i ++ )
{
// ミサイルデータが有効でない場合は次に移る
if( Mv[ i ] == 0 ) continue ;
// ミサイルの描画
DrawRotaGraph( Mx[ i ], My[ i ], 1.0 , Ma[ i ] , Mg , TRUE ) ;
if(Px<=Mx && Mx<=(Px+32) && Py<=My && My<=(Py+32))
lost++;
}
// プレーヤーの描画
DrawExtendGraph( Px , Py , Px + 32 , Py + 32 , ko_n , TRUE ) ;
// 砲台の描画
DrawExtendGraph( Hx - 8 , Hy - 8 , Hx + 8 , Hy + 8 , hune , TRUE ) ;
if(Px<=(Hx+8) && (Hx-8)<=(Px+32) && Py<=(Hy+8) && (Hy-8)<=(Py+32))
win++;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
// 時間待ち
while( GetNowHiPerformanceCount() < Time ){}
Time += 1000000 / 60 ;
if(lost>2)
DrawExtendGraph(0,0,640,480,over,FALSE);
if(win>10)
DrawExtendGraph(0,0,640,480,clear,FALSE);
}
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
自機が砲台に10回当たったら勝ちの画面を表示させて
自機がミサイルに当たったら負けの画面を表示させたいのですがうまくいきません
ご指導のほどをよろしくお願いします
#include <math.h>
#define MAX_M 100 // ミサイルの最大数定義
#define PI 3.14159 // 円周率
// データ定義
int Hx , Hy ; // 砲台の座標
int Hm ; // 砲台の移動方向
int Hsc ; // 砲台のショット間隔カウンタ
int Px , Py ; // 自機の座標
int Mg,hune,ko_n,haikei,clear,over; // ミサイルのグラフィック
int Mx[ MAX_M ] ,My[ MAX_M ] ; // ミサイルの座標
int Msx[ MAX_M ] , Msy[ MAX_M ] ; // ミサイルの速度
int Mv[ MAX_M ] ; // ミサイルデータの使用状態(1:使用中 0:未使用)
double Ma[ MAX_M ] ; // ミサイルの角度
int Mc[ MAX_M ] ; // ミサイルの追尾カウンタ
// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int Key ;
LONGLONG Time ;
int i ;
int lost=0,win=0;
// 画面モードの設定
SetGraphMode( 640 , 480 , 16 ) ;
// DXライブラリ初期化処理
if( DxLib_Init() == -1 )
{
// エラーが起きたら直ちに終了
return -1;
}
// 描画先を裏画面にセット
SetDrawScreen( DX_SCREEN_BACK ) ;
// 初期化処理
{
// ミサイルのグラフィックロード
Mg = LoadGraph( "ika.png" ) ;
hune = LoadGraph("漁船.png");
ko_n = LoadGraph("コーン.png");
haikei = LoadGraph("haikei.png");
clear = LoadGraph("gameclear.png");
over = LoadGraph("gameover.png");
// 自機の座標セット
Px = 320 ; Py = 200 ;
// 砲台の座標セット
Hx = 320 ; Hy = 30 ;
// 砲台の移動方向セット
Hm = 3 ;
// 砲台の移動間隔カウンタセット
Hsc = 30 ;
// ミサイルデータの初期化
for( i = 0 ; i < MAX_M ; i ++ )
Mv[ i ] = 0 ;
}
// ゲームループ
Time = GetNowHiPerformanceCount() + 1000000 / 60 ;
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// プレイヤーの移動処理
{
// 入力取得
Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;
if( Key & PAD_INPUT_RIGHT ) Px += 5 ; // 右を押していたら右に進む
if( Key & PAD_INPUT_LEFT ) Px -= 5 ; // 左を押していたら左に進む
if( Key & PAD_INPUT_UP ) Py -= 5 ; // 上を押していたら上に進む
if( Key & PAD_INPUT_DOWN ) Py += 5 ; // 下を押していたら下に進む
// 画面外に出ていたら補正
if( Px > 640 - 16 ) Px = 640 - 16 ;
if( Px < 0 ) Px = 0 ;
if( Py > 480 - 16 ) Py = 480 - 16 ;
if( Py < 0 ) Py = 0 ;
}
// ミサイルの移動処理
for( i = 0 ; i < MAX_M ; i ++ )
{
// ミサイルデータが無効だったらスキップ
if( Mv[ i ] == 0 ) continue ;
// 照準に当たっていたらミサイルデータを無効にする
if( ( ( Mx[ i ] > Px && Mx[ i ] < Px + 32 ) || ( Px > Mx[ i ] && Px < Mx[ i ] + 16 ) ) &&
( ( My[ i ] > Py && My[ i ] < Py + 32 ) || ( Py > My[ i ] && Py < My[ i ] + 16 ) ) )
{
Mv[ i ] = 0 ;
continue ;
}
// 追尾カウンタが規定値に来ていなければ追尾処理
if( Mc[ i ] < 100 )
{
double ax , ay , bx , by ;
// bx,by 自分の進んでいる方向 ax,ay 本来進むべき方向
bx = cos( Ma[ i ] ) ;
by = sin( Ma[ i ] ) ;
ax = ( Px + 16 ) - Mx[ i ] ;
ay = ( Py + 16 ) - My[ i ] ;
// 外積を利用し向きを照準側に向ける
Ma[ i ] += ( ax * by - ay * bx < 0.0 ) ? + PI / 180 * 15 : - PI / 180 * 15 ;
}
// 追尾カウンタ加算
Mc[ i ] ++ ;
// 速度変更
Msx[ i ] += ( int )( cos( Ma[ i ] ) * 30.0 );
Msy[ i ] += ( int )( sin( Ma[ i ] ) * 30.0 );
// 移動
Mx[ i ] = ( Mx[ i ] * 100 + Msx[ i ] ) / 100 ;
My[ i ] = ( My[ i ] * 100 + Msy[ i ] ) / 100 ;
// 画面外に出ていたらミサイルデータを無効にする
if( Mx[ i ] < -100 || Mx[ i ] > 740 ||
My[ i ] < -100 || My[ i ] > 580 ) Mv[ i ] = 0 ;
}
// 砲台の移動処理
{
Hx += Hm ;
// 画面端まで来ていたら反転
if( Hx > 640 - 16 || Hx < 0 ) Hm *= -1 ;
// ショットカウンタを減らす
Hsc -- ;
// カウンタが0になっていたらミサイル発射
if( Hsc == 0 )
{
// 使われていないミサイルデータを探す
for( i = 0 ; i < MAX_M ; i ++ )
{
if( Mv[ i ] == 0 ) break ;
}
// もし使われていないミサイルデータがあったらショットを出す
if( i != MAX_M )
{
// ミサイルの位置を設定
Mx[ i ] = Hx + 16 ;
My[ i ] = Hy + 16 ;
// 速度セット
Msx[ i ] = 0 ;
Msy[ i ] = 0 ;
// 角度をセット
Ma[ i ] = PI / 2 ;
// 追尾カウンタをセット
Mc[ i ] = 0 ;
// ショットデータを使用中にセット
Mv[ i ] = 1 ;
}
// 発射間隔カウンタ値をセット
Hsc = 30 ;
}
}
// 描画処理
{
// 画面の初期化
ClearDrawScreen() ;
DrawExtendGraph(0,0,640,480,haikei,FALSE);
// ミサイルの描画
for( i = 0 ; i < MAX_M ; i ++ )
{
// ミサイルデータが有効でない場合は次に移る
if( Mv[ i ] == 0 ) continue ;
// ミサイルの描画
DrawRotaGraph( Mx[ i ], My[ i ], 1.0 , Ma[ i ] , Mg , TRUE ) ;
if(Px<=Mx && Mx<=(Px+32) && Py<=My && My<=(Py+32))
lost++;
}
// プレーヤーの描画
DrawExtendGraph( Px , Py , Px + 32 , Py + 32 , ko_n , TRUE ) ;
// 砲台の描画
DrawExtendGraph( Hx - 8 , Hy - 8 , Hx + 8 , Hy + 8 , hune , TRUE ) ;
if(Px<=(Hx+8) && (Hx-8)<=(Px+32) && Py<=(Hy+8) && (Hy-8)<=(Py+32))
win++;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
// 時間待ち
while( GetNowHiPerformanceCount() < Time ){}
Time += 1000000 / 60 ;
if(lost>2)
DrawExtendGraph(0,0,640,480,over,FALSE);
if(win>10)
DrawExtendGraph(0,0,640,480,clear,FALSE);
}
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
自機が砲台に10回当たったら勝ちの画面を表示させて
自機がミサイルに当たったら負けの画面を表示させたいのですがうまくいきません
ご指導のほどをよろしくお願いします