見出し画像

当たった時の演出(画像の点滅):サンプルプログラム

実装イメージ

・プレイヤーは上下キーで移動し、敵は画面左に移動しています。
・今回はこのプレイヤーと敵で当たり判定をしています。
・当たった後、一定時間プレイヤー画像を点滅させています。

#include "DxLib.h"

#define IMAGE_SIZE	50			// 画像1枚の大きさ

// プレイヤー画像ハンドル
int PlayerGraph;
// プレイヤー座標
int PlayerX;
int PlayerY;

// 敵画像ハンドル
int EnemyGraph;
// 敵座標
int EnemyX;
int EnemyY;

// 当たった後の点滅時間
int HitFrame;

// ==============================
// *** 初期化処理 ***
// ==============================
void Game_Init()
{
	// プレイヤー画像の読み込みと初期座標の設定
	PlayerGraph = LoadGraph( "プレイヤー.png" );
	PlayerX = 100;
	PlayerY = 30;

	// 敵画像の読み込みと初期座標の設定
	EnemyGraph = LoadGraph( "敵.png" );
	EnemyX = 500;
	EnemyY = 120;

	HitFrame = 0;
}
// ==============================
// *** 更新処理 ***
// ==============================
void Game_Update()
{
	// 上下キーでプレイヤー移動
	if( CheckHitKey( KEY_INPUT_DOWN ) )	PlayerY += 3;
	if( CheckHitKey( KEY_INPUT_UP ) )	PlayerY -= 3;

	// 敵は画面左に移動
	EnemyX -= 2;
	if( EnemyX < -IMAGE_SIZE ){
		EnemyX = 500; 
		EnemyY = GetRand( 150 );
	}

	// プレイヤー画像と敵画像で当たり判定
	if( PlayerX + IMAGE_SIZE >= EnemyX && PlayerX <= EnemyX + IMAGE_SIZE ){
		if( PlayerY + IMAGE_SIZE >= EnemyY && PlayerY <= EnemyY + IMAGE_SIZE ){
			// 当たったら再び画面の右から
			EnemyX = 500;
			EnemyY = GetRand( 150 );
			// 当たったので点滅時間を設定
			HitFrame = 100;
		}
	}

	// 点滅時間を減らしていく
	HitFrame--;
	if( HitFrame < 0 ){
		HitFrame = 0;
	}
}
// ==============================
// *** 描画処理 ***
// ==============================
void Game_Draw()
{
	// 敵の描画
	DrawGraph( EnemyX, EnemyY, EnemyGraph, TRUE );

	// プレイヤーの描画
	if( ( HitFrame / 10 ) % 2 == 0 ){
		DrawGraph( PlayerX, PlayerY, PlayerGraph, TRUE );
	}
}
// ==============================
// *** 終了処理 ***
// ==============================
void Game_End()
{
	DeleteGraph( PlayerGraph );
	DeleteGraph( EnemyGraph );
}

// ******************************
// メイン関数
// ******************************
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	ChangeWindowMode( TRUE );
	SetGraphMode( 500, 200, 16 );
	if( DxLib_Init() == -1 ){
		return -1;
	}
	SetDrawScreen( DX_SCREEN_BACK );

	Game_Init();		// *** 初期化処理 ***

	while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ){
		Game_Update();	// *** 更新処理 ***

		ClearDrawScreen();
		Game_Draw();	// *** 描画処理 ***
		ScreenFlip();
	}

	Game_End();			// *** 終了処理 ***
	DxLib_End();
	return 0;
}

サンプルプログラムで記述している描画や操作関係はDXライブラリを使っていますが、DXライブラリを使わない開発でも処理としては同じような実装で動作すると思います。

いいなと思ったら応援しよう!