Sign in to follow this  
BosseBL

Passing around void(*functions)() in light weight noob engine

Recommended Posts

So I have started working on a light weight "engine" to help me design a game easy and got an idea that I want some guidance with.
To explain my idea, let us take an input manager for example. I would like to be able to store events and functions together in the following way:

class InputManager {

private:
map<int eventID, void(*function)()> eventActions

public:
void bind(int eventID, void(*function)());
void handleEvent();
};

so that I can write the actual game code in the form of a bunch of functions that I can bind to an event. Then all I have to do is call the handleEvent(), and it will detect events and call their corresponding function.

What I don't get is how I would go by and organize the code so that all functions I write has access to all the resources like TextureManager, SoundManager, EntityManager.

Is this possible to do?
Is it a good way of coding games?
Can I do it better differently?

thx for all the answers and sorry for a somewhat misleading title. Edited by BosseBL

Share this post


Link to post
Share on other sites
You should also make the event pass the object which linked to it to the function, so instead of calling a function you can use it to call a member function of an object or something (not sure how it works)

You could use it like .BindEvent(eventID,MyObject,MyObject::MemberFunction) i think.

Share this post


Link to post
Share on other sites
[quote name='BosseBL' timestamp='1339586653' post='4948785']
What I don't get is how I would go by and organize the code so that all functions I write has access to all the resources like TextureManager, SoundManager, EntityManager.
[/quote]

This doesn't sound as a good start. "[i]All functions having access to all resources[/i]".

A strategy to get a good design is to limit access as much as possible. That means that a change will have less impact.

Share this post


Link to post
Share on other sites
Have a look at the [url="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller"]Model-View-Controller[/url] (MVC) pattern.

A basic idea is that there is a model of the game (the objects in it, and how they interact). Then the "View" reads out the state of the Model and presents it to the player. That would be sound and graphics. That way, the Model needs not to know anything about sound and graphics. The Controller takes care of the input, and tells the Model to act accordingly.

Share this post


Link to post
Share on other sites
Instead of storing function pointers consider storing function objects like boost::/std::function. Then events that need external resources can bind them to the function object. Ex: using boost::/std::bind.

Share this post


Link to post
Share on other sites
It looks like you're using C++.

Instead of reinventing what already comes with C++, you could just use it.
[code]
#include <map>
#include <functional>

class TextureManager;
class SoundManager;
class EntityManager;
typedef int EventId;

typedef std::function<void (TextureManager&, SoundManager&, EntityManager&)> EventHandler;
typedef std::map<EventId, EventHandler> EventHandlerMap;
[/code]
Then you can use [font=courier new,courier,monospace]std::bind[/font] to associate free functions, member functions, functors, or whatever to your event IDs, and you can also curry additional parameters as necessary.
[code]
EventHandlerMap eventHandlerMap;
TouchReaction touchReactor;

eventHandlerMap[EVENT_TOUCH_BEGIN] = std::bind(&TouchReaction::begin, touchReactor, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);

//...

EventHandlerMap::iterator it = eventHandlerMap.find(eventId);
if (it != eventHandlerMap.end())
{
it->second(texturemanager, soundManager, entityManager);
}
[/code]
You will need a compiler that adheres to at least this part of the current C++ standard -- most compiler makers have one available.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this