自分なりの拡張性や柔軟性がある書き方

どうも、barrierっていいます
最近私は趣味で太鼓の達人のような音ゲーを作ってるんですが
拡張性がなさすぎることに萎えて新しく基礎を作ってました

今回は私が探求した基礎部分のお話です
よかったら見てってください




完成系の前にしょぼめの基礎から

最初に作った基礎

私が一番最初に使っていた基礎は
ソースコード1枚でやりくりするものでした

今でもたまに簡単なソースコードでは1枚でやりますが
やはりゲームとかの大きなプロジェクトになると
1枚では限界が見えてきます

見えてきますというより、いつか限界が来ます
ソースコード上下するのが割と億劫っていう意味を最近理解しました

その次作った基礎(途中で断念)

次に作ったのは、よくあるシーンチェンジをやってみようと思って
ソースファイルいっぱい作ってなんやかんやしてみたんですが
当時の私には拡張性や柔軟性を考慮したものを作れなくて
結局途中で断念し、前の基礎を使いまわします

その次作った基礎(データ系は別で分ける)

次に作ったのは、前の基礎の上位互換ともいえるものです
ゲームにはたいていの場合、読み込んで保管しておくデータ類と
メインの処理でそのデータを使うもので分けると思います

今回の基礎は正にそれなんですが、これでもまだ拡張性や柔軟性が無く
まだまだ完全に万能な基礎とは言えないものでした

ですがしばらくの間はこの基礎を使いまわしながら
なんとか頑張って作っていきました

その次作った基礎(準万能?)

次に作ったのは、シーンチェンジを
ファイルやフォルダなどを分けつつ実現してたものなんですが
この時作っていた構造が意味わからないもので
多分一般のC++erが見ると嘔吐してたと思います

でもこの基礎でこういう物だと思い込んでがんばっていました
が、ついに限界がきてやっぱり書き換えようということになり
万能の基礎を構築することにしました


今回作った基礎

今回作った基礎は、ちゃんとC++erが見ても
「まぁいいんじゃね?」で済むくらいのものです
ガチのC++erからすると違和感があると思いますが
自分これで大分しっくり来ているのでしばらくはこれを使います

それでだいたいの構成はというと
クラスのポインタでシーンチェンジをする方式です
これが単純そうに見えてかなり難しかったです

今までの癖が抜けてないせいで難しかったのかはわからないですけどね
というのも、どうしても設定ファイルのデータとかを
シーン分けした所で使いたかったので
結構回りくどい方法で実現しています

例でいうとこんな感じです

// Scene.h
#pragma once
#include "GameSystem.h"

class Scene : public SceneBase {
public:

	Scene();
	~Scene();

	void Init();
	void Draw();
	void Proc();
	void End();

private:

	class _ScenemainScene* _ptr;
};
// Scene.cpp
#include "Scene.h"

class _ScenemainScene {
public:

	void Init() {
	
	}
	void Draw() {
	
	}
	void Proc() {
	
	}
	void End() {
	
	}
};

Scene::Scene() {
	_ptr = new _ScenemainScene;
}

Scene::~Scene() {
	delete _ptr;
	_ptr = nullptr;
}

void Scene::Init() {
	_ptr->Init();
}
void Scene::Draw() {
	_ptr->Draw();
}
void Scene::Proc() {
	_ptr->Proc();
}
void Scene::End() {
	_ptr->End();
}

これでやっとシーン1つ表現できるようになります
なぜこの構造に至ったかというと
別のシーンの情報も得たいからという理由(あくまでもシーンチェンジする際に使うくらい)もあって
.hに別のシーンのヘッダーファイルをincludeするとclassの多重定義だ!
ってコンパイラに怒られてしまうんです

なのでそれをどうにかするために考えた結果
.cppでincludeすればいいじゃん!
となりました

でもデータとかは一つのソースファイルでできるようにしたい…
という欲を満たすために1つのクラスのためだけに
2個クラスを定義しています


最後に

今回は私が探求した基礎についてのお話でした
まだなんも知らないので語れるものは何もないんですが
no+e書きたい欲が出たので語れるだけ語りました

基礎はこういう構造のほうが良いよ、
みたいな指摘が思いつきましたらお願いします

ここまで見てくれてありがとうございます!


この記事が気に入ったらサポートをしてみませんか?