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; //アニメーションカウンタ初期化
}
コメント