私は現在、SFML を使用した 2D ゲーム エンジンに取り組んでおり、手続き的に開始しましたが、長期的には OOP に移行することで改善されると判断しました。OOP の概念は理解していますが、他のクラス (ImageManager、Grid など) へのインスタンス化をどこで定義すればよいか正確にはわかりません。
たとえば、私Engine
のクラスは に依存してImageManager
おり、 の多くの関数は のEngine
変数に依存していますImageManager
。ImageManager
したがって、単一の関数内でクラスのインスタンスを単純に宣言して定義することはできません。他の関数では使用できないためです。
私がやったことはこれです: Engine.h:
class Engine
{
private:
sf::RenderWindow window;
grid (*gridArray)[SIZE];
...//more variables, removing for length
//Initializes the engine
bool Init(); //Main Game Loop
void MainLoop(); //Renders one frame
void RenderFrame(); //Processes user input
void ProcessInput(); //Updates all Engine internals
public:
Engine(int w, int h, int tileSize);
~Engine();
ImageManager * imageManager;
GridClass * gridClass;
...//removed some methods for length
};
基本的に、ヘッダーで 2 つのクラスを宣言していることがわかりImageManager
ますGridClass
。Engine.cpp の内部:
Engine::Engine(int w, int h, int tileSize)
{
imageManager = new ImageManager;
gridClass = new GridClass();
gridArray = new grid[SIZE][SIZE]();
masterArray = new unsigned char[MAP_SIZE][MAP_SIZE];
videoSize = sf::Vector2i(w, h);
this->tileSize = tileSize;
startX = startY = endX = endY = 0;
}
クラスを定義しています。グッドプラクティスに準拠するために、どこでそれを行うべきかわからないため、コンストラクターで行います。腐敗する要素にずっと悩まされているimageManager
ので、やり方が悪いのか気になります。
それが悪い考えである場合は、これらのクラスをどこでインスタンス化する必要があるか教えていただけますか? Engine 内の多くの関数は、これらのクラスのこれらのインスタンスの変数に依存していることを思い出してください。実際には、各関数に多くのパラメーターを渡したくありません。
ありがとう。