を実装する助けが必要。それは最高のエンジンではありませんが、私は一度やり直せば再利用できると確信しています。私はコードを要求していないか、またはspoonfedされていませんが、私はいくつかのアドバイスを求めています:-)。私は、再利用可能なゲームエンジンを書くに私の試みで助けを必要と私のイベントマネージャおよびエンジンシステム(SDL && C++)
私の現在のレイアウト:
私はエンジンクラス、ゲームクラス、およびイベント・マネージャ・クラスを持っています。エンジンクラスはイベントマネージャクラスを拡張し、ゲームクラスはエンジンクラスを拡張します。ここではこれらの3つのクラスのための私の現在のコードがある(Graphicsクラスを無視する - それが、私は、フルスクリーンを書き換えないように初期化し、画面の機能のサイズを変更するために使用するだけで再利用可能なクラスです)。
ENGINE.HPP
#ifndef _ENGINE_HPP
#define _ENGINE_HPP
#pragma once
#include <SDL/SDL.h>
#include "event_manager.hpp"
enum
{
ENGINE_SUCCESS = 0,
ENGINE_INITIALIZATION_ERROR
};
class Engine : public EventManager
{
public:
Engine();
virtual ~Engine();
int exec();
void handle_event(SDL_Event *);
void update_engine();
virtual bool init();
virtual void render();
virtual void update();
virtual void clean();
bool running_;
};
ENGINE.CPP
#include "./engine.hpp"
Engine::Engine()
{
running_ = false;
}
Engine::~Engine()
{
}
int Engine::exec()
{
if (!init())
{
clean();
return ENGINE_INITIALIZATION_ERROR;
}
SDL_Event event;
while (running_)
{
while (SDL_PollEvent(&event))
handle_event(&event);
update();
render();
}
clean();
return ENGINE_SUCCESS;
}
void update_engine()
{
}
void handle_event(SDL_Event *event)
{
EventManager::handle_event(event);
}
bool init() {return true;}
void render() {}
void update() {}
void clean() {}
EVENT_MANAGER.HPP
#ifndef _EVENT_MANAGER_HPP
#define _EVENT_MANAGER_HPP
#pragma once
#include <SDL/SDL.h>
class EventManager
{
public:
EventManager();
virtual ~EventManager();
virtual void handle_event(SDL_Event *);
// events here
virtual void event_exit();
};
#endif
EVENT_MANAGER.CPP
#include "./event_manager.hpp"
EventManager::EventManager()
{
}
EventManager::~EventManager()
{
}
void EventManager::handle_event(SDL_Event *event)
{
switch (event->type)
{
case SDL_QUIT:
event_exit();
break;
}
}
void on_exit() {}
GAME.HPP
#ifndef _GAME_HPP
#define _GAME_HPP
#include "./engine.hpp"
#include "./entity.hpp"
#include "./graphics.hpp"
class Game : public Engine
{
public:
Game();
bool init();
void render();
void update();
void clean();
private:
Graphics g;
};
#endif
GAME.CPP
#include "./game.hpp"
int main(int argc, char **argv)
{
Engine engine;
return engine.exec();
}
Game::Game() {}
bool Game::init()
{
if (!g.init(800, 600, 32, g.screen_flags()))
{
return false;
}
SDL_WM_SetCaption("Title", NULL);
return true;
}
void Game::update()
{
Engine::update_engine();
}
void Game::clean()
{
SDL_FreeSurface(g.screen_);
SDL_Quit();
}
void Game::render()
{
SDL_Flip(g.screen_);
}
私はこのエラーを取得しています:
engine.cpp: In function ‘void handle_event(SDL_Event*)’:
engine.cpp:40: error: cannot call member function ‘virtual void
EventManager::handle_event(SDL_Event*)’ without object
なぜこの出来事はありますか?私ができた場合、私はEventManager ::を行うことができないはずです
class Engine : public EventManager
???私が得る唯一のエラーです
は、私はそれは単純なものであると確信しています。今私は少しのアドバイスが必要です。エンジン内
void Engine::event_exit()
などの代わりに、イベント処理の
、私はむしろゲームクラスでそれを行うだろう。
class Game : public Engine
void Game::event_exit()
ことは、理にかなって私はエンジンがEventManagerを拡張作っ様子がわかり、そして私のゲームのクラスは、私はこれらの^ 2つのスニペットの上スニペットを呼び出した場合エンジン
class Engine : public EventManager
class Game : public Engine
はそれがうまくいく拡張しませんか?私はそのエラーを取得するため、私はそれをテストすることはできません。
どのように私は私に感謝していないことがわかりませんでした。 – evolon696
私が言ったように、私たちの最高に起こります:)。これらの種類の事柄に対処するためには、**コンパイラエラーメッセージ** - > **の原因となる可能性のある**の内部マッピングを開発する必要がほとんどあります。さもなければ、コード内のこれらの種類のエラーは、視覚的にそれを見ているときには見逃されます。 –