


背景が真っ暗のままでは気分が出ないので、背景を作ってみましょう。
四聖龍神録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();
}