2012-01-13 20 views
0

を実装する助けが必要。それは最高のエンジンではありませんが、私は一度やり直せば再利用できると確信しています。私はコードを要求していないか、または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 

はそれがうまくいく拡張しませんか?私はそのエラーを取得するため、私はそれをテストすることはできません。

答えて

1

私たちの最善を尽くすが、名前空間を指定するのを忘れてしまったと思う。あなたはengine.cppで機能を実装する場合、あなたはEngine::を付加するのを忘れて、そのコードは次のようになります。

void Engine::update_engine() 
{ 
} 

void Engine::handle_event(SDL_Event *event) 
{ 
    EventManager::handle_event(event); 
} 

それは本当にあなたのエラーのルートを語っていないC++エラーメッセージの古典的なケースです。

念の簡単な説明、:

コンパイラは機能void handle_event(SDL_Event *event)をコンパイルしようとした、とEventManager::handle_event(event);メソッドの呼び出しを見ました。コンパイラは、とすぐに実装しますことを指定するようすなわち

someEventManager->handle_event(event); 

、関数はエンジンクラスの一部ではなかった、それはあなたがEventManagerクラスの特定のインスタンスのメソッドを呼び出すことを期待するだろうと思ったので、書いた方法で、クラスEngineに属する、コンパイラは、本質的に推測することです:

void Engine::handle_event(SDL_Event *event) 
{ 
    this->EventManager::handle_event(event); 
} 

を、したがって、幸せです。

+0

どのように私は私に感謝していないことがわかりませんでした。 – evolon696

+0

私が言ったように、私たちの最高に起こります:)。これらの種類の事柄に対処するためには、**コンパイラエラーメッセージ** - > **の原因となる可能性のある**の内部マッピングを開発する必要がほとんどあります。さもなければ、コード内のこれらの種類のエラーは、視覚的にそれを見ているときには見逃されます。 –

関連する問題