ホームへ戻る

13章. 背景を実装する (スペルカード編)

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


→分からないことがあれば掲示板で質問して下さい


HPトップへ 質問掲示板へ

- Remical Soft -