プレイヤーが移動できる範囲を示す枠と、右側のボードを表示させます。
その座標や幅高さの定義を以下のようにします。
内枠をIN、外枠をOUTとして、Defineに定義します。
Define.h
#pragma once class Define final { public: const static int WIN_W; //ウィンドウサイズ横 const static int WIN_H; //ウィンドウサイズ縦 const static int OUT_W;//外枠幅 const static int OUT_H;//外枠高さ const static int IN_W;//内枠幅 const static int IN_H;//内枠高さ const static int CENTER_X;//動ける範囲の中央X const static int CENTER_Y;//動ける範囲の中央Y const static int IN_X;//内枠X const static int IN_Y;//内枠Y const static float PI; //円周率 enum eStage { Stage1, Stage2, Stage3, Stage4, Stage5, StageEX, StageNum, }; enum eLevel { Easy, Normal, LevelNum }; };
Define.cpp
#include "Define.h" const int Define::WIN_W = 1280; //ウィンドウサイズ横 const int Define::WIN_H = 960; //ウィンドウサイズ縦 const int Define::OUT_W = 896;//外枠横 const int Define::OUT_H = 960;//外枠縦 const int Define::IN_W = 770;//内枠横 const int Define::IN_H = 880;//内枠縦 const int Define::CENTER_X = (OUT_W / 2);//動ける範囲の中心X const int Define::CENTER_Y = (OUT_H / 2);//動ける範囲の中心Y const int Define::IN_X = ((OUT_W - IN_W) / 2);//内枠のX const int Define::IN_Y = ((OUT_H - IN_H) / 2);//内枠のY const float Define::PI = 3.141592654f; //円周率
ImageクラスにBoardの画像のロードを追加し、Boardクラスで描画します。
Board.h
#pragma once #include "AbstractScene.h" #include "Player.h" #include <memory> #include "Board.h" class GameScene : public AbstractScene { public: const static char* ParameterTagStage;//パラメータのタグ「ステージ」 const static char* ParameterTagLevel;//パラメータのタグ「レベル」 GameScene(IOnSceneChangedListener* impl, const Parameter& parameter); virtual ~GameScene() = default; void update() override; void draw() const override; private: std::shared_ptr<Player> _player; std::shared_ptr<Board> _board; };
Board.cpp
#include "GameScene.h" #include <DxLib.h> #include "Macro.h" using namespace std; const char* GameScene::ParameterTagStage = "ParameterTagStage";//パラメータのタグ「ステージ」 const char* GameScene::ParameterTagLevel = "ParameterTagLevel";//パラメータのタグ「レベル」 GameScene::GameScene(IOnSceneChangedListener* impl, const Parameter& parameter) : AbstractScene(impl, parameter) { _player = make_shared<Player>(); _board = make_shared<Board>(); } void GameScene::update() { _player->update(); _board->update(); } void GameScene::draw() const { _player->draw(); _board->draw(); }
BoardクラスはGameSceneクラスが持ちます。
Playerクラスと同様、インスタンスを生成したらupdateとdrawの指示をしているだけです。
Playerクラスもちょこっといじって枠内でしか移動できないようにします。
Player.cpp
#include "Player.h" #include "Pad.h" #include <DxLib.h> #include "Image.h" #include "Define.h" const static float SPEED = 9; Player::Player() : _x((float)Define::CENTER_X), _y((float)Define::OUT_H*0.8f) { } bool Player::update() { move(); return true; } void Player::draw() const { DrawRotaGraphF(_x, _y, 1.0, 0.0, Image::getIns()->getPlayer(), TRUE); } /*! @brief プレイヤーを動かす */ void Player::move() { float moveX = 0, moveY = 0; if (Pad::getIns()->get(ePad::left) > 0) { moveX -= SPEED; } if (Pad::getIns()->get(ePad::right) > 0) { moveX += SPEED; } if (Pad::getIns()->get(ePad::down) > 0) { moveY += SPEED; } if (Pad::getIns()->get(ePad::up) > 0) { moveY -= SPEED; } if (moveX && moveY) { //斜め移動 moveX /= (float)sqrt(2.0); moveY /= (float)sqrt(2.0); } if (Pad::getIns()->get(ePad::slow) > 0) {//低速移動 moveX /= 3; moveY /= 3; } if (moveX + _x < Define::IN_X) {//左枠より左なら _x = (float)Define::IN_X; //左枠で止める } else if (moveX + _x > Define::IN_X + Define::IN_W) {//右枠より右なら _x = (float)(Define::IN_X + Define::IN_W); //右枠で止める } else {//枠内なら _x += moveX;//普通に移動 } if (moveY + _y < Define::IN_Y) { //上枠より上なら _y = (float)Define::IN_Y; //上枠で止める } else if (moveY + _y > Define::IN_Y + Define::IN_H) { //下枠より下なら _y = (float)(Define::IN_Y + Define::IN_H); //下枠で止める } else {//枠内なら _y += moveY;//普通に移動 } }
実行結果