DXlibの画像の当たり判定について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
マウス次郎

DXlibの画像の当たり判定について

#1

投稿記事 by マウス次郎 » 11年前

#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回当たったら勝ちの画面を表示させて
自機がミサイルに当たったら負けの画面を表示させたいのですがうまくいきません
ご指導のほどをよろしくお願いします

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: DXlibの画像の当たり判定について

#2

投稿記事 by みけCAT » 11年前

とりあえず、コードを提示するときはBBcodeを有効にした状態でcodeタグで囲み、
かつ適切なインデントをしていただけると、見やすくて助かります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

マウス次郎

Re: DXlibの画像の当たり判定について

#3

投稿記事 by マウス次郎 » 11年前

みけCAT さんが書きました:とりあえず、コードを提示するときはBBcodeを有効にした状態でcodeタグで囲み、
かつ適切なインデントをしていただけると、見やすくて助かります。

申し訳ありません、初めて利用するので詳しいルール等は存じ上げませんでした
次回から気を付けます

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXlibの画像の当たり判定について

#4

投稿記事 by softya(ソフト屋) » 11年前

フォームルールはこちらです。
http://dixq.net/board/board.html
フォーラムルールの説明にありますが、「うまく行きません」は何も説明していないと同じですので今起こっている想定と違う所を事細かに説明しください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

マウス次郎

Re: DXlibの画像の当たり判定について

#5

投稿記事 by マウス次郎 » 11年前

自機と砲台が10回接触するとクリア画面が表示されるようにしたいのですが、10回以上接触しても何も起こりませんプレイ画面がそのまま続きます
自機とロケットが接触しても同じ現象が起こります




ちなみにC言語は約一年勉強しました

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXlibの画像の当たり判定について

#6

投稿記事 by softya(ソフト屋) » 11年前

とにかく読みづらいため、codeタグを付与してみました。
マウス次郎 さんが書きました:

コード:

#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[i] && Mx[i]<=(Px+32) && Py<=My[i] && My[i]<=(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回当たったら勝ちの画面を表示させて
自機がミサイルに当たったら負けの画面を表示させたいのですがうまくいきません
ご指導のほどをよろしくお願いします
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

マウス次郎

Re: DXlibの画像の当たり判定について

#7

投稿記事 by マウス次郎 » 11年前

コード:

#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[i] && Mx[i]<=(Px+32) && Py<=My[i] && My[i]<=(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 ;				// ソフトの終了
}



コマンドを付け加えました
失礼なことをして申し訳ありません

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXlibの画像の当たり判定について

#8

投稿記事 by softya(ソフト屋) » 11年前

コードを見る限りはゲームループ内にlost>2とwin>10が入っていますが、これだと描画後にClearDrawScreen() ;が先に走るので、ScreenFlip() ;しても表示されません。
この

コード:

            if(lost>2)
                DrawExtendGraph(0,0,640,480,over,FALSE);
            if(win>10)
                DrawExtendGraph(0,0,640,480,clear,FALSE);
は、ClearDrawScreen()とScreenFlip() ;の間にないといけないのです。
どうすれば良いかというと、ゲームプレイ中とゲームオーバー、ゲーム勝利の描画状態を分けてやる必要があります。
if文の使い方やif文の位置を工夫すれば出来ます。

【補足】
ClearDrawScreen() ;の前のゲーム処理も「ゲームオーバー」、「ゲーム勝利」の時は通らないようにしないと行けません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: DXlibの画像の当たり判定について

#9

投稿記事 by へにっくす » 11年前

余計なお世話かもしれないが、関数化した方がいいよ。
WinMain一つだけって、よくないと思います。
written by へにっくす

閉鎖

“C言語何でも質問掲示板” へ戻る