当たり判定後にその場での一定時間画像の表示の仕方がわかりません

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

当たり判定後にその場での一定時間画像の表示の仕方がわかりません

#1

投稿記事 by TSS » 10年前

http://homepage2.nifty.com/natupaji/DxL ... re1_6.html
ここのサンプルプログラムを使っています。
OS はWindousです。
visual studio2013 のc++、DXライブラリを使っています。
下記のプログラムを実行すると弾丸が画像にあたるとヒットエフェクトが一瞬だけ表示されます。
このヒットエフェクトの画像を2秒間その場に表示するにはどうしたらいいでしょうか?

C言語理解度は制御文がどのような処理をするのか理解している程度です。

コード:

#include "DxLib.h"
#define SHOT 20
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow)
{
	int buX, buY, busterGraph;
	int leafX, leafY,leafmuki, leafGraph;
	int ShotX[SHOT],ShotY[SHOT],ShotFlag[SHOT],ShotGraph;
	int ShotBFlag,i;
	int leafW, leafH, shotW, shotH;
	int backgraph,StartTime;
	int hitgraph,hitflag;
	int count=0;


	char buf[256];

	//画面モードの設定
	SetGraphMode(640, 480, 16);

	StartTime = GetNowCount();

	//DXライブラリの初期化処理
	if (DxLib_Init() == -1) return -1;

	//グラフィックの描画先を裏画面にセット
	SetDrawScreen(DX_SCREEN_BACK);

	//背景の設定
	backgraph=  LoadGraph("forest1.jpg");
	//ヒットエフェクトの画像
	hitgraph = LoadGraph("ヒットエフェクト.png");
	//ヒットエフェクトが出ていないというフラグに0を代入
	hitflag = 0;

	//グラフィック1をメモリにロード&表示座保養をセット
	busterGraph = LoadGraph("ブースター.png");
	buX = 400;  buY = 300;

	
	//グラフィック2をメモリにロード&表示座標をセット
	leafGraph = LoadGraph("リーフィア2.png");
	leafX = 0; leafY = 50;

	//弾丸のグラフィックをメモリにロード
	ShotGraph = LoadGraph("Shot.png");

	//弾丸が画面上に存在しているか保持する変数に「存在していない」という意味の0を代入
	for (i = 0; i < SHOT; i++)
	{
		ShotFlag[i] = 0;
	}
		//ショットボタンが前のフレームで押されたかどうかを保存する変数に0(押されていない)を代入
	ShotBFlag = 0;
	//グラフィック2の移動方向をセット
	leafmuki = 1;
	
	//弾丸のグラフィックのサイズを得る
	GetGraphSize(ShotGraph, &shotW, &shotH);

	//グラフィック2のサイズを得る
	GetGraphSize(leafGraph, &leafW, &leafH);
	//移動ルーチン
	while (1){


		//画面を初期化
		ClearDrawScreen();
		DrawGraph(0, 0, backgraph, FALSE);
		{
			GetHitKeyStateAll(buf);
			//↑キー移動
			if (buf[KEY_INPUT_UP] == 1)buY -= 3;
			//←キー移動
			if (buf[KEY_INPUT_LEFT] == 1)buX -= 3;
			//→キー移動
			if (buf[KEY_INPUT_RIGHT] == 1)buX += 3;
			//zキーで↓移動
			if (buf[KEY_INPUT_Z] == 1)buY += 3;

			//スペースキーを押していて、且つ弾丸が打ち出されていなかったら弾丸を発射する
			if (buf[KEY_INPUT_SPACE] == 1)
			{
				if (ShotBFlag == 0)
				{
				//画面上にでていない弾丸があるか、弾丸の数だけ繰り返しで調べる
				for (i = 0; i < SHOT; i++)
				{
					//弾丸が画面上にでていない場合はその弾丸を画面に出す
					if (ShotFlag[i] == 0){


						int bw, bh, sw, sh;
						//グラフィック1と弾の画像のサイズを得る
						GetGraphSize(busterGraph, &bw, &bh);
						GetGraphSize(ShotGraph, &sw, &sh);

						//弾丸の位置をセット、位置はグラフィック1の中心にする
						ShotX[i] = (bw - sw) / 2 + buX-10;
						ShotY[i] = (bh - sh) / 2 + buY+20;

						//弾丸を現時点を持って存在するので、存在状態を保持するのに変数1を代入
						ShotFlag[i] = 1;
						break;
					}
					}
				}
				ShotBFlag = 1;
			}
			else
			{
				ShotBFlag = 0;
			}
				

				
			//グラフィック1が画面左からはみ出そうになったら画面内に移動
			if (buX < 0) buX = 0;
			//グラフィック1が画面右からはみでそうになったら画面内に移動
			if (buX>640 - 120)buX = 640 - 120;
			//グラフィック1が画面↑からはみ出そうになったら画面内に移動
			if (buY < 0)buY = 0;
			//グラフィック1が画面↓からはみ出そうになったら画面内に移動
			if (buY>480 - 120)buY = 480 - 120;

			//グラフィック1描画
			DrawGraph(buX, buY, busterGraph, TRUE);
		}
		for (i = 0; i < SHOT; i++){

			//自機の弾丸1の移動ルーチン(存在状態を保持している変数の内容が1の場合のみ行う)
			if (ShotFlag[i] == 1){
				//弾丸を16ドット上に移動させる
				ShotX[i] -= 16;

				if (ShotX[i] < -80){
					ShotFlag[i] = 0;

				}
				
					DrawGraph(ShotX[i], ShotY[i], ShotGraph, TRUE);
				
			}
		}

		//グラフィック2の移動ルーチン
		{
			//グラフィック2の座標を移動している方向に移動する
			if (leafmuki == 1)leafY += 3;
			if (leafmuki == 0)leafY -= 3;

			//グラフィック2が画面→から出そうになったら画面内に移動
			if (leafY > 360)
			{
				leafY = 360;
				leafmuki = 0;
			}

			//グラフィック2が画面←から出そうになったら画面内に移動
			if (leafY < 0)
			{

				leafY = 0;
				leafmuki = 1;
			}
			
			//グラフィック2を描画
			DrawTurnGraph(leafX+40, leafY, leafGraph, TRUE);
		}

		//弾丸とグラフィック2のあたり判定、弾丸の数だけ繰り返す
		for (i = 0; i < SHOT; i++){
			//弾丸iが存在している場合のみ次処理
			if (ShotFlag[i] == 1){
				//あたり判定
				if (((ShotX[i]>leafX && ShotX[i]<leafX + leafW)
					|| (leafX>ShotX[i] && leafX<ShotX[i] + shotW))
					&& ((ShotY[i]>leafY &&ShotY[i]<leafY + leafH)
					|| (leafY>ShotY[i] && leafY < ShotY[i] + shotH)))


				{
					//接触している場合は当たった弾丸の存在を消す
					ShotFlag[i] = 0; 

						//ヒットエフェクトを表示
					
						DrawRectGraph(ShotX[i], ShotY[i] - 10, 224, 32, 32, 32, hitgraph, TRUE, FALSE);
						

				
				}
					
			}
			
					

		}

		//裏画面の内容を表画面にコピーする
		ScreenFlip();

		//Windouws特有の面倒な処理をDxライブラリにやらせる
		//-1が帰ってきたらループを抜ける
		if (ProcessMessage() < 0)  break;
		//escキーが押されたらループから抜ける
		if (CheckHitKey(KEY_INPUT_ESCAPE))break;
	}

	//Dxライブラリの使用の終了の処理
	DxLib_End();
	//ソフトの終了
	return 0;

}


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

Re: 当たり判定後にその場での一定時間画像の表示の仕方がわかりません

#2

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

ヒットエフェクトをオブジェクト(Tonyu System的な意味で)で管理すればいいと思います。

コード:

#include <DxLib.h>
#define HIT 200

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	if (ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() != 0) return -1;
	SetDrawScreen(DX_SCREEN_BACK);

	int HitX[HIT],HitY[HIT],HitFlag[HIT],HitTime[HIT];
	int mouseFlag = 0;
	int i;

	for (i = 0; i < HIT; i++) HitFlag[i] = 0;

	while (ProcessMessage() == 0 && ClearDrawScreen() == 0) {
		if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) {
			if (mouseFlag == 0) {
				// マウスのクリックがあった場所で当たったとみなす
				int mx = 0, my = 0;
				GetMousePoint(&mx, &my);
				for (i = 0; i < HIT; i++) {
					if (HitFlag[i] == 0) {
						HitX[i] = mx;
						HitY[i] = my;
						HitFlag[i] = 1;
						HitTime[i] = GetNowCount();
						break;
					}
				}
			}
			mouseFlag = 1;
		} else mouseFlag = 0;

		// ヒットエフェクトを描画する
		for (i = 0; i < HIT; i++) {
			if (HitFlag[i] == 1) {
				// DrawRectGraph(HitX[i], HitY[i] - 10, 224, 32, 32, 32, hitgraph, TRUE, FALSE);
				DrawString(HitX[i], HitY[i], "当", GetColor(255, 0, 0));
				if (GetNowCount() - HitTime[i] > 2000) HitFlag[i] = 0; // 2秒経っていたら消す
			}
		}

		ScreenFlip();
	}

	DxLib_End();
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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