背景が真っ暗のままでは気分が出ないので、背景を作ってみましょう。
四聖龍神録2の中で一番簡単な背景はスペルカードの背景なので、まずはそれを作ってみます。
まず本章の出来上がりのシーンからご覧ください。
画像を上にスクロールしているだけです。
ではこの1面スペルカード背景であるBackground01spellクラスをご覧ください。
Background01spell.h
#pragma once #include "AbstractBackground.h" #include <array> #include <memory> class Background01spell final : public AbstractBackground { public: Background01spell(); ~Background01spell() = default; bool update() override; void draw() const override; private: class Quadrangle { public: const int img; float x, y; Quadrangle(float x, float y, int img) : x(x), y(y), img(img) {} }; const static int NUM = 4; std::array<std::shared_ptr<Quadrangle>, NUM> _list; };
Background01spell.cpp
#include "Background01spell.h" #include "Image.h" #include "Define.h" #include <DxLib.h> using namespace std; const static int IMG_HEIGHT = 879; const static float SCROLL_SPEED = 2.f; Background01spell::Background01spell() { _list[0] = make_shared<Quadrangle>(0, IMG_HEIGHT * 0, Image::getIns()->getBackSpell00()); _list[1] = make_shared<Quadrangle>(0, IMG_HEIGHT * 1, Image::getIns()->getBackSpell01()); _list[2] = make_shared<Quadrangle>(0, IMG_HEIGHT * 2, Image::getIns()->getBackSpell00()); _list[3] = make_shared<Quadrangle>(0, IMG_HEIGHT * 3, Image::getIns()->getBackSpell01()); } bool Background01spell::update() { for (int i = 0; i < NUM; i++) {//全て上にスクロールさせる _list[i]->y -= SCROLL_SPEED; if (_list[i]->y < -IMG_HEIGHT) {//上に行き切ったら _list[i]->y += IMG_HEIGHT * 4;//一番下に下げる } } return true; } void Background01spell::draw() const { SetDrawArea(0, 0, Define::OUT_W, Define::OUT_H); //エリア外は描画対象外にする for (int i = 0; i < NUM; i++) { DrawGraphF(_list[i]->x, _list[i]->y, _list[i]->img, FALSE); } SetDrawArea(0, 0, Define::WIN_W, Define::WIN_H); //描画範囲を元に戻す }
本クラスはAbstractBackgroundから継承していますが、まだここには何もないので、省略します。
四角形4枚を上にスクロールさせて出来ているので、内部クラスとしてその四角形であるQuadangleを定義しています。
x,yと表示する画像ハンドルのみを持つ内部クラスです。
_listにはこれを4枚積めて、updateで座標 ->y -= SCROLL_SPEED; することで上にスクロールさせています。
特になんて難しいことはありません。
これに伴って変更したGameSceneクラスも今までと同じような追加の仕方をしているだけです。
GameScene.h
#pragma once #include "AbstractScene.h" #include "Player.h" #include <memory> #include "Board.h" #include "AbstractBackground.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; std::shared_ptr<AbstractBackground> _backgroundSpell; };
GameScene.cpp
#include "GameScene.h" #include <DxLib.h> #include "Macro.h" #include "Background01spell.h" using namespace std; const char* GameScene::ParameterTagStage = "ParameterTagStage";//パラメータのタグ「ステージ」 const char* GameScene::ParameterTagLevel = "ParameterTagLevel";//パラメータのタグ「レベル」 GameScene::GameScene(IOnSceneChangedListener* impl, const Parameter& parameter) : AbstractScene(impl, parameter) { _backgroundSpell = make_shared<Background01spell>(); _player = make_shared<Player>(); _board = make_shared<Board>(); } void GameScene::update() { _backgroundSpell->update(); _player->update(); _board->update(); } void GameScene::draw() const { _backgroundSpell->draw(); _player->draw(); _board->draw(); }