Event Listener für Gameframework



  • Hallo,
    ich bin dabei mir ein kleines Gameframework zu schreiben und hab auch schon eine Arte Statesystem implementiert wie z.B. bei Java in Slick2D.

    Jetzt wollte ich mich ans Event handling machen weiß aber grad nicht so recht wie ich das hinbekomme.
    Ich benutze SFML das ja auch ein System fürs event handling besitzt aber wie krieg ich das in mein framework integriert.

    Hier ist mal mein State system:

    GameStateManager:

    #pragma once
    
    #include <SFML\Graphics.hpp>
    
    #include "GameState.h"
    
    class GameStateManager
    {
    public:
    	GameStateManager(sf::RenderWindow &window);
    	~GameStateManager();
    
    	void init();
    	void update(sf::RenderWindow &window);
    	void render(sf::RenderWindow &window);
    	void cleanup();
    
    	void addState(GameState* state);
    	void removeState(int ID);
    	void enterState(int ID);
    	void start();
    
    private:
    	std::vector<GameState*> gameStates;
    	sf::RenderWindow &window;
    	GameState* currentState;
    };
    
    #include <iostream>
    
    #include "GameStateManager.h"
    #include "LogoState.h"
    
    GameStateManager::GameStateManager(sf::RenderWindow &window) : window(window)
    {
    }
    
    GameStateManager::~GameStateManager()
    {
    }
    
    void GameStateManager::addState(GameState* state) {
    	gameStates.push_back(state);
    }
    
    void GameStateManager::removeState(int ID) {
    }
    
    void GameStateManager::enterState(int ID) {
    	for (int i = 0; i < gameStates.size(); i++) {
    		GameState tmp = *gameStates[i];
    		if (gameStates[i]->getID() == ID) {
    			currentState = gameStates.at(i);
    
    			std::cout << "State [" << ID << "] loaded!" << std::endl;
    			currentState->init();	// Initialize current GameState
    			return;
    		}
    	}
    
    	std::cout << "State [" << ID << "] not found" << std::endl;
    	std::cout << "Press enter to continue..." << std::endl;
    	std::cin.get();
    	exit(0);
    }
    
    void GameStateManager::start() {
    	init();
    	enterState(1);
    }
    
    void GameStateManager::update(sf::RenderWindow &window) {
    	currentState->update(window, *this);
    }
    
    void GameStateManager::render(sf::RenderWindow &window) {
    	currentState->render(window, *this);
    }
    
    void GameStateManager::init() {
    	addState(new LogoState(1));
    }
    
    void GameStateManager::cleanup() {
    
    }
    

    GameState:

    #pragma once
    #include <SFML\Graphics.hpp>
    #include "ResourceManager.h"
    
    class GameStateManager;
    
    class GameState {
    public:
    	GameState();
    	virtual ~GameState();
    
    	virtual void init();
    	virtual void update(sf::RenderWindow &window, GameStateManager &game);
    	virtual void render(sf::RenderWindow &window, GameStateManager &game);
    	virtual void cleanup();
    
    	int getID();
    
    protected:
    	ResourceManager resourceManager;
    	int ID;
    };
    


  • Ok, und wo ist die Frage oder das Problem?

    (Anmerkung: Rohe Zeiger? Bist du dir da sicher und im Klaren was du willst und machst?)



  • Ja die frage ist wie ich das implementieren könnte, da ich leider nicht weiß wie so ein listener aufgebaut ist.

    Ich kann ja z.B. nicht einfach den Event Loop von SFML in die update funktion packen dann würde der da ja nicht mehr raus kommen oder?

    und wie meinst du das mit rohen pointern?



  • statt das rad neu zu erfinden könntest du auch schauen, was schon gemacht wurde. zb hat die thor bibliothek so ein event system...



  • Ja SFML hat ja auch so ein System und das will ich ja auch benutzen aber ich weiß nicht so ganz wie ich das in mein State System integrieren soll weil wenn ich den while loop in die update funktion von meinem GameState packe dann verzögert das doch die updates oder?

    könnte ich das mit multithreading machen, so das der listener in nem eigenen thread läuft?



  • ne, nix multithreading. und ne, SFML hat kein solches system. event polling != callbacks/actions.

    lies einfach zuerst die SFML tutorials und dann die von thor. dann wirst du merken, dass du so gut wie nichts mehr tun musst, weil es alles schon fertig gibt. es gibt leute, die haben sich um dieses problem schon gedanken gemacht - profitiere doch von diesem wissen, statt dir selbst erneut den kopf zu zerbrechen...



  • Kann ich denn für Thor meine aktuelle version von SFML 2.1 benutzen oder muss ich ne neue laden?



  • steht auf der download-seite...

    The Thor development version is not compatible with SFML 2.0 or SFML 2.1. It always matches the master branch of the SFML Git version. If you need an older Thor version compatible to SFML 2.1, check out the commit f57666d.

    wenn du bei sfml 2.1 bleiben willst, clonest du also diese revision und baust thor wie im tutorial auf der website beschrieben.


Log in to reply