2Dゲーム制作㉘(2025/10/20)

GameOver処理をSceneManagerに組み込んでいく。
(SceneManager.cpp)

#include<DxLib.h>
#include"SceneManager.h"
#include"TitleScene.h"
#include"GameScene.h"
#include"GameOverScene.h"

//コンストラクタ
SceneManager::SceneManager(void)
{
	scene_ID = SCENE_KIND_NON;
//オブジェクト生成時のみに行われるため、数値の初期化は別関数で行う
	title = nullptr;
	game = nullptr;
	gover = nullptr;

}

//デストラクタ
SceneManager::~SceneManager(void)
{

}

bool SceneManager::SystemInit(void)
{
	//オブジェクトの作成
	title = new TitleScene(this);
//titleオブジェクトを作成してSceneManagerインスタンスのポインタを格納
	if (title == nullptr)return false;

	game = new GameScene(this);
//gameオブジェクトを作成してSceneManagerインスタンスのポインタを格納
	if (game == nullptr)return false;

	gover = new GameOverScene(this);
	if (gover == nullptr)return false;


	if(title->SystemInit()==false)return false;
	if(game->SystemInit()==false)return false;
	if(gover->SystemInit() == false)return false;

	scene_ID = nextSceneID = SCENE_KIND_TITLE;

	prevSpaceKey = nowSpaceKey = 0;

	return true;
}

//更新処理
void SceneManager::Update(void)
{
	//スペースキーの状態を更新
	prevSpaceKey = nowSpaceKey;					//現在のキー状態を直前の状態として保存
	nowSpaceKey = CheckHitKey(KEY_INPUT_SPACE);	//現在のキー状態を更新

	eSceneKind nextSID = scene_ID;//現在のscene_IDを代入(初期化)

	switch (scene_ID) {
		case SCENE_KIND_TITLE:
			title->Update();
			nextSID = title->GetNextSceneID();
			break;
		case SCENE_KIND_GAME:
			game->Update();
			game->ExitConditionProc();
			break;
		case SCENE_KIND_GAMEOVER:
			gover->Update();
			nextSID = gover->GetNextSceneID();
			break;

	}

	if (scene_ID != nextSID) {
		scene_ID = nextSID;
		switch (scene_ID) {
		case: SCENE_KIND_TITLE
				title->GameInit();
				break;
		case: SCENE_KIND_GAME
				game->GameInit();
				break;
		case: SCENE_KIND_GAMEOVER
				gover->GameInit();
				break;
		}
	}
}

//描画処理
void SceneManager::Draw(void)
{
	switch (scene_ID) {
	case: SCENE_KIND_TITLE:
		title->Draw();
		break;
	case: SCENE_KIND_GAME:
		game->Draw();
		break;
	case: SCENE_KIND_GAMEOVER:
		gover->Draw();
		break;
	}
}

//解放処理(最初の一回のみ実行)
bool SceneManager::Release(void)
{
	//タイトルシーンクラスのオブジェクトの破棄
	title->Release();
	delete title;
	title = nullptr;

	game->Release();
	delete game;
	game = nullptr;

	gover->Release();
	delete gover;
	gover = nullptr;

	return true;
}

敵キャラのアニメーション

敵キャラの種類を3種類に増やしてアニメーションさせる。
StDefine.hに列挙型定数定義を追加。

#pragma once

//------------------
// 列挙型定数
//------------------
//シーンの種類
enum eSceneKind {
	SCENE_KIND_NON = -1,	//ゲーム開始時
	SCENE_KIND_TITLE,		//タイトルシーン
	SCENE_KIND_GAME,		//ゲームシーン
	SCENE_KIND_GAMEOVER,	//ゲームオーバー

	SCENE_KIND_MAX,			//
};

//ゲーム進行状況
enum eStageExitConditionsKind {
	ESTAGE_EXIT_NON = -1,			//戦闘中
	ESTAGE_EXIT_CLEAR,				//条件1:プレイヤーの勝利
	ESTAGE_EXIT_ENEMY_SHOT,			//条件2:敵弾がプレイヤーにヒット
	ESTAGE_EXIT_ENEMY_OCCUPATION,	//条件3:敵が最下段に到達

	ESTAGE_EXIT_KIND_MAX,
};

// 移動方向
enum eEnemyMoveDirection {
	ENEMY_DIR_NON = -1,	//方向設定がない場合
	ENEMY_DIR_RIGHT,	//0 :右方向
	ENEMY_DIR_LEFT,		//1 :左方向
	ENEMY_DIR_DOWN,		//2 :下方向

	ENEMY_DIR_MAX,		//
};

//接触している端の方向
enum eEnemyHitEdgeDir {
	ENEMY_HIT_EDGE_NON = -1,	//どの端にも接触していない
	ENEMY_HIT_EDGE_RIGHT,		//0:右方向
	ENEMY_HIT_EDGE_LEFT,		//1:左方向
	ENEMY_HIT_EDGE_DOWN,		//2:下端に接触

	ENEMY_HIT_EDGE_MAX,
};

enum eEnemyKind {
	ENEMY_KIND_NON = -1,
	ENEMY_KIND_1,	//敵キャラ種別1
	ENEMY_KIND_2,	//敵キャラ種別2
	ENEMY_KIND_3,	//敵キャラ種別3

	ENEMY_KIND_MAX,
};

//構造体の宣言
struct POSITION {
	int x;		//X座標
	int y;		//Y座標
};

struct charData {
	POSITION pos;	//表示座標
	bool flag;		//表示フラグ
	int kind;		//キャラ種別(敵のみ)
};

imageArrayを1次元配列⇒2次元配列に修正
(Enemy.h)

#pragma once
#include "StDefine.h"

class Enemy
{

public:
	Enemy(void);
	~Enemy(void);

	bool SystemInit(void);
	void GameInit(void);
	void OccupationInit(void);
	void Update(void);
	void Draw(void);
	bool Release(void);

	eEnemyHitEdgeDir CheckHitEdgeProc(void);
	int GetEnemyRestNum(void);				//敵の残機数を取得

	bool GetAlive(int x, int y){ return flgArray[y][x]; }
	void SetAliveOff(int x, int y) { flgArray[y][x] = false; }
	POSITION GetPos(int x, int y) { return posArray[y][x]; }
	void SetPos(int x, int y, POSITION pos) { posArray[y][x] = pos; }
	eEnemyMoveDirection GetMoveDir(void) { return eMoveDirection; }
	eEnemyMoveDirection GetNextMoveDir(void) { return eNextMoveDirection; }
	void SetMoveDir(eEnemyMoveDirection dir) { eMoveDirection = dir; }
	void SetNextMoveDir(eEnemyMoveDirection dir) {eNextMoveDirection = dir;	}


	// 敵キャラ
	static constexpr int ENEMY_WID = 32;		// 敵の画像の横サイズ
	static constexpr int ENEMY_HIG = 23;		// 敵の画像の縦サイズ
	static constexpr int ENEMY_PATTERNS = 2;	//敵のアニメーション配列数
	static constexpr int ENEMY_DISP_X_DISTANCE = 8;	//敵キャラ同士の横の間隔
	static constexpr int ENEMY_DISP_Y_DISTANCE = 4;	//敵キャラ同士の縦の間隔

	// 敵キャラの画面表示関連
	static constexpr int ENEMY_DISP_XNUM = 8;	// 敵キャラの横の表示個数
	static constexpr int ENEMY_DISP_YNUM = 7;	// 敵キャラの縦の表示個数
	
	// 敵キャラの移動関連
	static constexpr int ENEMY_MOVE_X_SPEED = 4;	//敵の横方向の移動量
	static constexpr int ENEMY_MOVE_Y_SPEED = 
                               (ENEMY_HIG + ENEMY_DISP_Y_DISTANCE);//敵の縦方向移動量
	static constexpr int ENEMY_MOVE_INTERVAL_COUNT = 8;	//敵移動のインターバル



private:
	//敵キャラの表示関連
	static constexpr int ENEMY_DISP_ALL_NUM = ENEMY_DISP_XNUM * ENEMY_DISP_YNUM;

	// 敵キャラ
	int imageArray[ENEMY_KIND_MAX][ENEMY_PATTERNS];	// 敵の画像ハンドル番号
	charaData eArray[ENEMY_DISP_YNUM][ENEMY_DISP_XNUM];	// 敵のX座標表示位置と生存フラグと種類のテーブル

	bool flgArray[ENEMY_DISP_YNUM][ENEMY_DISP_XNUM];// 敵の存在フラグテーブル

	eEnemyMoveDirection eMoveDirection;		//敵キャラの現在の移動方向
	eEnemyMoveDirection eNextMoveDirection;	//敵キャラの下移動後の移動方向
	int eMoveIntervalCounter;	//敵キャラ移動の間隔調整用カウンタ
	int eAnimCounter;		//敵キャラのアニメーションカウンタ
};

敵画像の読み込みを配列化。
(Enemy.cpp)

bool Enemy::SystemInit(void)
{
	const char* fileName[] = {
		{"image / Enemy_1.png"},
		{"image / Enemy_2.png"},
		{"image / Enemy_3.png"},
	};
	
	//敵の画像の読込み
	for (int ii = 0; ii < ENEMY_KIND_MAX; ii++) {
		int err = LoadDivGraph("fileName[ii]", ENEMY_PATTERNS, ENEMY_PATTERNS, 1, ENEMY_WID, ENEMY_HIG, imageArray[ii]);
		if (err == -1)return false;
	}

	return true;

}

(Enemy.cpp)

void Enemy::GameInit(void)
{
	//-----------------
	// 変数の初期化
	//-----------------

	// 敵キャラの変数テーブルの初期化
	for (int yy = 0; yy < ENEMY_DISP_YNUM; yy++) {
		for (int xx = 0; xx < ENEMY_DISP_XNUM; xx++) {
			eArray[yy][xx].pos.x = (ENEMY_WID + ENEMY_DISP_X_DISTANCE) * xx;
			eArray[yy][xx].pos.y = (ENEMY_HIG + ENEMY_DISP_Y_DISTANCE) * yy;
			eArray[yy][xx].flag = true;
			if (yy < 2)
			{
				eArray[yy][xx].kind = ENEMY_KIND_3;
			}
			if (yy < 4)
			{
				eArray[yy][xx].kind = ENEMY_KIND_2;
			}
			else
			{
				eArray[yy][xx].kind = ENEMY_KIND_1;
			}
		}
	}

	eMoveDirection = ENEMY_DIR_RIGHT;
	eNextMoveDirection = ENEMY_DIR_NON;

	eMoveIntervalCounter = -1;//カウンタ初期化(00:15~)
	eAnimCounter = -1;	//アニメーションカウンタ初期化


}

コメント

タイトルとURLをコピーしました