OOPの恩恵について考えてみます

eyecatch C/C++
eyecatch

demostage1_state.cpp

using namespace inputkey;

namespace modules {

    namespace phase {

        using namespace gems;

        DemoStageState::DemoStageState() : refs(eBeacon::LOW_RESET) {
            BG_tileset_ = new BG::BGTileSet;
            if (!BG_tileset_->Load("FIELDS", "assets/graphic_material/BG_tile/stage_tileset/demostage_BG.png", 128, 16, 8, 16, 16)) {
                refs = eBeacon::HI_EMERGENCY;
            }
            if (!BG_tileset_->loadMapBin("assets/binary_data/demostage_mapdata.bin")) {
                refs = eBeacon::HI_EMERGENCY;
            }
            sprite_bank_ = new sprites::SpriteBank;
            if (!sprite_bank_->Load("ROCKMAN", "assets/graphic_material/sprites_tile/rockman/r2t_trsp.png", 400, 20, 20, 32, 32)) {
                refs = eBeacon::HI_EMERGENCY;
            }
            if (!sprite_bank_->Load("METALL", "assets/graphic_material/sprites_tile/enemy1/e1001_metall_ex_set.png", 16, 4, 4, 32, 32)) {
                refs = eBeacon::HI_EMERGENCY;
            }
            palette::formal::NESPAL_0x15;
        }


        DemoStageState::~DemoStageState() {
            delete BG_tileset_;
            delete sprite_bank_;
        }


        bool DemoStageState::pushSprite(void) {
            // sample drawer select.
            sprite_bank_->Reset();
            sprite_bank_->Push("ROCKMAN", 78, 80, 24, TRUE);
            sprite_bank_->Push("METALL", 168, 48, 0, TRUE);
            return true;
        }


        bool DemoStageState::drawSprite(void) const {
            return sprite_bank_->Draw();
        }


        bool DemoStageState::pushBG(void) {
            BG_tileset_->Push(0, 0, 0);
            return true;
        }


        bool DemoStageState::drawBG(void) const {
            BG_tileset_->Draw();
            return true;
        }


        bool DemoStageState::doExecute(interface__::IPhaseContext* obj) {
            // TODO:switch文?回避して下さい。
            if (eBeacon::HI_EMERGENCY == refs) {
                return false;
            }
            
            if (eBeacon::LOW_RESET == refs) {

                if (!this->pushBG()) return false;
                if (!this->pushSprite()) return false;
                refs = eBeacon::HI_CONTROLS;

            }
            
            if (eBeacon::HI_CONTROLS == refs) {

                if (!this->drawBG()) return false;
                if (!this->drawSprite()) return false;

                if (1 == C16Key::getInstance()->getC16PressButtons(GPAD_BUTTON::START_KEY)) {
                    refs = eBeacon::MID_NEXT_STATE;
                }

            }

            if (eBeacon::MID_NEXT_STATE == refs) {
                obj->recordLog("Process-Log", "executed successfully of Eris Demo Stage 1 process.");
                obj->setState(nullptr);
            }
            return true;
        }

    }  // namespace phase

}  // namespace modules

コンストラクタでLoadをして、doExecuteでDrawを行う。

画像の描画ですね。

こうやって見ると、データの読み込みと実際に描画する箇所が分かれていて、直感的にコードが読みやすくなっているのが分かるかと思います。(分かる?(笑))

実際の描画処理はDXライブラリで言うとDrawGraphなどですが、このソースファイルでは書かず、カプセル化されたクラスの中で行われています。

そうする事で、描画する定常作業は書かずに済みます。

ようはDraw(なんのキャラクター?、どこに?、いつ?)みたいな恰好で実装をライトシフトできるようになります。

これが今の私が想像する書きたいコードになります。

どうやって実装するかを考えるのは、分からない時は少し苦痛ですが、分かる瞬間というのはやはりいつも考えすぎていない時のような気がします。

つまりロジックなんてものはシンプルに分かりやすい形が、読み手である人間にとってベストなのです、きっと。

それが分かれば後は自分の思うように開発を進めていけるので、そこで本当のゲーム開発が始まっていくんですね。

コメント

タイトルとURLをコピーしました