2Dゲーム制作Ⅰ⑮(2025/07/10)


左右に接触した場合の処理を追加していく。
下移動が発生した場合の次の移動方向を格納しておくenumを定義。:Enemy.cpp

eEnemyMoveDirection enemyNextMoveDirection;//敵キャラの下移動後の移動方向

EnemyInit()内で初期化:Enemy.cpp

enemyNextMoveDirection = ENEMY_DIR_NON;

EnemyMove()内に、分岐を作成していく。:Enemy.cpp

void EnemyMove(void) {
	for (int yy = 0; yy < ENEMY_DISP_YNUM; yy++) {
		for (int xx = 0; xx < ENEMY_DISP_XNUM;xx++) {
			if (enemyFlgArray[yy][xx]) {
				switch (enemyMoveDirection) {
				case ENEMY_DIR_RIGHT:
					enemyPosxArray[yy][xx] += ENEMY_MOVE_X_SPEED;
					break;
				case ENEMY_DIR_LEFT:
					enemyPosxArray[yy][xx] -= ENEMY_MOVE_X_SPEED;
					break;
				case ENEMY_DIR_DOWN:
					enemyPosyArray[yy][xx] += ENEMY_MOVE_Y_SPEED;
					break;

				}
			}
		}
	}
	// エリアの端にぶつかっていないかのチェック
	eEnemyHitEdgeDir hitdir = CheckHitEdgeProc();
	switch (hitdir) {
	case ENEMY_HIT_EDGE_NON:
		// 通常移動:次の方向に移る
		if (enemyNextMoveDirection != ENEMY_DIR_NON) {
			enemyMoveDirection = enemyNextMoveDirection;
			enemyNextMoveDirection = ENEMY_DIR_NON;
		}
		break;

	case ENEMY_HIT_EDGE_RIGHT:
		enemyMoveDirection = ENEMY_DIR_DOWN;
		enemyNextMoveDirection = ENEMY_DIR_LEFT;
		break;

	case ENEMY_HIT_EDGE_LEFT:
		enemyMoveDirection = ENEMY_DIR_DOWN;
		enemyNextMoveDirection = ENEMY_DIR_RIGHT;
		break;

	case ENEMY_HIT_EDGE_DOWN:
		// 敵が最下段に到達 → 負け処理へ
		break;
	}
	
}

main.h の定数定義を各ヘッダーファイルの移動。(main.h/Player.h/PlayerBullet.h/Enemy.h)

//main.h
#pragma once
//-----------------
// 定数定義
//-----------------
const int WINDOW_WID = 800;				// ウィンドウの横サイズ
const int WINDOW_HIG = 600;				// ウィンドウの縦サイズ


//------------------
// 列挙型定数
//------------------
// 移動方向
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,
};


//プロトタイプ宣言
bool Init(void);
void Update(void);
void Draw(void);
//Player.h
#pragma once

//-----------------
// 定数定義
//-----------------
// プレイヤー
const int PLAYER_WID = 32;				// プレイヤー画像の横サイズ
const int PLAYER_HIG = 19;				// プレイヤー画像の縦サイズ
const int PLAYER_MOVE_SPEED = 6;		// プレイヤーの左右の移動速度

//------------------------------------------
//他のファイルでも参照が必要な変数の extern宣言
//------------------------------------------
extern int playerPosX;								// 自機のX座標
extern int playerPosY;								// 自機のY座標
extern bool playerFlg;								// 自機の表示状態管理用フラグ(true:表示、false:非表示)

//-------------------------------------------
//プロトタイプ宣言
//-------------------------------------------
bool PlayerInit(void);
void PlayerMove(void);
void PlayerDraw(void);
//PlayerBullet.h
#pragma once

//-----------------
// 定数定義
//-----------------
// プレイヤー弾
const int PLAYER_BULLET_WID = 6;		// プレイヤー弾の画像の横サイズ
const int PLAYER_BULLET_HIG = 30;		// プレイヤー弾の画像の縦サイズ
const int PLAYER_BULLET_MOVE = 12;		// プレイヤー弾の移動速度

//----------------------------------------------
//他のファイルでも参照が必要な変数の extern宣言
//----------------------------------------------
extern int playerBulletPosX;		// プレイヤー弾のX座標
extern int playerBulletPosY;		// プレイヤー弾のY座標
extern bool playerBulletFlg;		// プレイヤー弾の発射状態管理用フラグ(true:表示、false:非表示)


bool PlayerBulletInit(void);
void PlayerBulletShot(void);
void PlayerBulletMove(void);
void PlayerBulletDraw(void);
//Enemy.h
#pragma once


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

// 敵キャラの画面表示関連
const int ENEMY_DISP_XNUM = 8;				// 敵キャラの横の表示個数
const int ENEMY_DISP_YNUM = 7;				// 敵キャラの縦の表示個数
const int ENEMY_DISP_ALL_NUM = ENEMY_DISP_XNUM * ENEMY_DISP_YNUM;

// 敵キャラの移動関連
const int ENEMY_MOVE_X_SPEED = 4;			//敵の横方向の移動量
const int ENEMY_MOVE_Y_SPEED = (ENEMY_HIG + ENEMY_DISP_Y_DISTANCE);//敵の縦方向移動量


extern int enemyPosxArray[][ENEMY_DISP_XNUM];	// 敵のX座標表示位置テーブル
extern int enemyPosyArray[][ENEMY_DISP_XNUM];	// 敵のY座標表示位置テーブル
extern bool enemyFlgArray[][ENEMY_DISP_XNUM];	// 敵の存在フラグテーブル

//----------------------------------------
//プロトタイプ宣言
//----------------------------------------
bool EnemyInit(void);
void EnemyDraw(void);
void EnemyMove(void);

eEnemyHitEdgeDir CheckHitEdgeProc(void);

移動をゆっくりにする

敵移動のインターバルを定数定義。(Enemy.h)

const int ENEMY_MOVE_X_SPEED = 4;			//敵の横方向の移動量
const int ENEMY_MOVE_Y_SPEED = (ENEMY_HIG + ENEMY_DISP_Y_DISTANCE);//敵の縦方向移動量
const int ENEMY_MOVE_INTERVAL_COUNT = 8;	//敵移動のインターバル

インターバルカウンタを宣言(Enemy.cpp)

int enemyMoveIntervalCounter;				//敵キャラ移動の間隔調整用カウンタ

EnemyInit()で初期化。(Enemy.cpp)

enemyMoveIntervalCounter = -1;

EnemyMove()に、enemyMoveIntervalCounterを組み込み(Enemy.cpp)

void EnemyMove(void) {
	enemyMoveIntervalCounter++;
	if (enemyMoveIntervalCounter > 0) {
		if (enemyMoveIntervalCounter >= ENEMY_MOVE_INTERVAL_COUNT) {
			enemyMoveIntervalCounter = -1;
		}
		return;
	}

	for (int yy = 0; yy < ENEMY_DISP_YNUM; yy++) {
		for (int xx = 0; xx < ENEMY_DISP_XNUM;xx++) {
			if (enemyFlgArray[yy][xx]) {
				switch (enemyMoveDirection) {
				case ENEMY_DIR_RIGHT:
					enemyPosxArray[yy][xx] += ENEMY_MOVE_X_SPEED;
					break;
				case ENEMY_DIR_LEFT:
					enemyPosxArray[yy][xx] -= ENEMY_MOVE_X_SPEED;
					break;
				case ENEMY_DIR_DOWN:
					enemyPosyArray[yy][xx] += ENEMY_MOVE_Y_SPEED;
					break;

				}
			}
		}
	}
	// エリアの端にぶつかっていないかのチェック
	eEnemyHitEdgeDir hitdir = CheckHitEdgeProc();
	switch (hitdir) {
	case ENEMY_HIT_EDGE_NON:
		// 通常移動:次の方向に移る
		if (enemyNextMoveDirection != ENEMY_DIR_NON) {
			enemyMoveDirection = enemyNextMoveDirection;
			enemyNextMoveDirection = ENEMY_DIR_NON;
		}
		break;

	case ENEMY_HIT_EDGE_RIGHT:
		enemyMoveDirection = ENEMY_DIR_DOWN;
		enemyNextMoveDirection = ENEMY_DIR_LEFT;
		break;

	case ENEMY_HIT_EDGE_LEFT:
		enemyMoveDirection = ENEMY_DIR_DOWN;
		enemyNextMoveDirection = ENEMY_DIR_RIGHT;
		break;

	case ENEMY_HIT_EDGE_DOWN:
		// 敵が最下段に到達 → 負け処理へ
		break;
	}
	
}

シーン遷移の実装

タイトルシーン ⇒ ゲームシーン ⇒ ゲームオーバーシーン
   ↑                    |
   +ーーーーーーーーーーーーーーーーーーーー+

シーン管理用のファイルを準備。
(ソリューションエクスプローラーから右クリック>追加>モジュール)
・SceneTitle.cpp / SceneTitle.h
・SceneGame.cpp / SceneGame.h
・SceneGameOver.cpp / SceneGameOver.h


列挙型を定義:main.h

pragma once

//-----------------
// 定数定義
//-----------------
const int WINDOW_WID = 800; // ウィンドウの横サイズ
const int WINDOW_HIG = 600; // ウィンドウの縦サイズ

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

SCENE_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,

};

//-----------------------------------------------
//他のファイルでも参照が必要なもののextern宣言
//-----------------------------------------------
extern eSceneKind sceneKind;

//プロトタイプ宣言
bool Init(void);
void Update(void);
void Draw(void);

組み込みは次回。

コメント

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