左右に接触した場合の処理を追加していく。
下移動が発生した場合の次の移動方向を格納しておく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);
組み込みは次回。
コメント