Wohoo!
10 lines of code changed = splitscreen :) (Up to 4 cameras will be supported by the engine)
Monday, January 23, 2012
New arrivals!
Today the new books I ordered got delivered!
Including:
Including:
- Mathematics for 3D Game Programming and Computer Graphics
- Best of Game Programming Gems
- Der C++ Programmierer (a very up to date german book about professional c++ programming)
Unfortunately my exams are starting tomorrow. I guess I'll have to wait until my exams are over until I can start reading these books, altough I couldn't stop me to take a quick glance at the C++ book ;).
In addition, I hope the math book is good. I'm slightly starting to get to the boundries of my mathematical knowledge :-/.
Saturday, January 21, 2012
Generic 2D collision system.
Today I want to explain the system I use in my engine for collision detection.
I tried to keep the collision system as generic as possible.
My engine provides a class called "CollisionComponent". You can add one or more components to a game objects to make them collidable. (Collision detection is done via collision rectangles).
To make the collision handling as generic as possible I decided to realize the handling "response" (the point where it'll get decided what to do with the collided objects) with function pointers.
You can "subscribe" gameobjects via typename (String) or a specific id (int) and with a pointer to a function that receives two pointer to game objects(first is the object that did "the impact" and the second is the object that got hit) and returns void.
Here's a little code snippet to make it more clear how that works:
The difference between subscription via type and id is that multiple game object can have the same type (for very generic collision handling like "bullet hits player" or "weapon hits enemy").If you want to make more specific collision handling you can use the subscribe function that uses ids because the ids of the objects are unique.
The only problem is that each tick each game object gets checked with every other game object.
That's not very performant, but I don't know how to do it better, yet.
I tried to keep the collision system as generic as possible.
My engine provides a class called "CollisionComponent". You can add one or more components to a game objects to make them collidable. (Collision detection is done via collision rectangles).
To make the collision handling as generic as possible I decided to realize the handling "response" (the point where it'll get decided what to do with the collided objects) with function pointers.
You can "subscribe" gameobjects via typename (String) or a specific id (int) and with a pointer to a function that receives two pointer to game objects(first is the object that did "the impact" and the second is the object that got hit) and returns void.
Here's a little code snippet to make it more clear how that works:
void collision_handler(GameObject *object1,GameObject *object2) {//...Do fancy stuff here} int main() { GameObject object1("Type1"); GameObject object2("Type2");//... //...CollisionComponent *collComp = new CollisionComponent(); CollisionComponent *collComp2 = new CollisionComponent(); object1.addComponent(collComp); object2.addComponent(collComp2);//.. //subscription with typeCollisionManager::subscribe(object1.getType(),object2.getType(),collision_handler);//.. //subscription with idCollisionManager::subscribe(object1.getID(),object2.getID(),collision_handler);//..}
The difference between subscription via type and id is that multiple game object can have the same type (for very generic collision handling like "bullet hits player" or "weapon hits enemy").If you want to make more specific collision handling you can use the subscribe function that uses ids because the ids of the objects are unique.
The only problem is that each tick each game object gets checked with every other game object.
That's not very performant, but I don't know how to do it better, yet.
Sunday, January 15, 2012
Use DoxyGen to automatize the documentation of your projects.
I just want to point out tool I discovered after reading one of my new programming books.
The tool is called DoxyGen and you can download it from here.
DoxyGen is a tool which will surf through your source code and look for certain marks.
Consider you have a function like
If you want to document this function, you need to enter the DoxyGen documenting marks like this
When you start DoxyGen it'll find these marks (@param etc.) and create a html documentation based on the informations you write behind those marks.
After DoxyGen is finished, the result will eventually look like this (Its a screenshot of the documentation from my engine on which I work currently):
The tool is called DoxyGen and you can download it from here.
DoxyGen is a tool which will surf through your source code and look for certain marks.
Consider you have a function like
bool doSomething(int x);
If you want to document this function, you need to enter the DoxyGen documenting marks like this
/** * This method does something * @param x - amount of bla * @return bool - true if successful or false if not. */bool doSomething(int x);
When you start DoxyGen it'll find these marks (@param etc.) and create a html documentation based on the informations you write behind those marks.
After DoxyGen is finished, the result will eventually look like this (Its a screenshot of the documentation from my engine on which I work currently):
Monday, January 9, 2012
Type conversion using template functions
Yesterday I came up with a new way to make type conversions prettier.
I want to explain you how that works in this post.
As you might know, I work with a component based object model in my engine (see here).
In this kind of object model, you sometimes need to modify the component of certain objects after you added them.
To do that I implement a getComponent() function, which - in the past - returned a object of the type of the component interface (called IComponent). Type conversions needed to be made afterwards to work with the desired implementation. That used to look like this:
I found that code pretty ugly and unnecessary complicated, so I thought of another idea to do that user friendlier. The first step I did was to change the getComponent() function to a template function.
The function looked like this:
With template support it now looks like this:
As you can see, the user determines the return type via the template type ( So there's no ugly conversion needed afterwards.)
The result is (in my opinion) much nicer source code.
The following is the above example reused with the new getComponent() template function:
Compared with a macro like:
The example could even get more improved to look like this:
I want to explain you how that works in this post.
As you might know, I work with a component based object model in my engine (see here).
In this kind of object model, you sometimes need to modify the component of certain objects after you added them.
To do that I implement a getComponent() function, which - in the past - returned a object of the type of the component interface (called IComponent). Type conversions needed to be made afterwards to work with the desired implementation. That used to look like this:
GameObject gameobject; RenderableComponent *renderableComponent = new RenderableComponent("graphic.png"); gameobject.addComponent(renderableComponent);//Somewhere else in the code in another function.IComponent *component = gameobject.getComponent("RenderableComponent"); RenderableComponent *renderableComponent = static_cast<RenderableComponent*>(component);//.. do stuff with renderablecomponent.
I found that code pretty ugly and unnecessary complicated, so I thought of another idea to do that user friendlier. The first step I did was to change the getComponent() function to a template function.
The function looked like this:
IComponent *GameObject::getComponent(const String &componentName){
for(std::list<IComponent*>::iterator i = this->m_components.begin();i != this->m_components.end();i++){
if((*i)->getType() == componentName){
return (*i);
}
}
return NULL;
}
With template support it now looks like this:
template<class T>
T *getComponent(const String &componentName){
for(std::list<IComponent*>::iterator i = m_components.begin();i != m_components.end();i++){
if((*i)->getType() == componentName){
return static_cast<T*>((*i));
}
}
return NULL;
}
(Hint: If you don't know nothing about template functions, check here)As you can see, the user determines the return type via the template type ( So there's no ugly conversion needed afterwards.)
The result is (in my opinion) much nicer source code.
The following is the above example reused with the new getComponent() template function:
I don't know what about you, but I find it much nicer ;) .GameObject gameobject; RenderableComponent *renderableComponent = new RenderableComponent("graphic.png"); gameobject.addComponent(renderableComponent);//Somewhere else in the code in another function. //IComponent *component = gameobject.getComponent("RenderableComponent"); //RenderableComponent *renderableComponent = static_cast<RenderableComponent*>(component);RenderableComponent *renderableComponent = gameobject.getComponent<RenderableComponent>("RenderableComponent");//.. do stuff with renderablecomponent.
Compared with a macro like:
#define GET_COMPONENT(type)(getComponent<type>(#type))
The example could even get more improved to look like this:
GameObject gameobject; RenderableComponent *renderableComponent = new RenderableComponent("graphic.png"); gameobject.addComponent(renderableComponent);//Somewhere else in the code in another function. //IComponent *component = gameobject.getComponent("RenderableComponent"); //RenderableComponent *renderableComponent = static_cast<RenderableComponent*>(component);RenderableComponent *renderableComponent = gameobject.GET_COMPONENT(RenderableComponent);//.. do stuff with renderablecomponent.
Monday, December 5, 2011
Make your Engine more dynamic!
When I started to program my Engine, I wanted to create a somewhat portable Engine.
I wanted to support different libraries like OpenGL, OpenAL or DirectX to make my Engine run under Windows and other platforms.
My first attempt was to differentiate with the Preprocessor variables given by the OS
(For example _WIN32 under Windows).
That worked, but was somewhat ugly...
It was indeed so ugly that I decided to give it another try.
So I split everything into separate dynamic libraries.
At the end I had one library for every replaceable feature of my engine.
Here are some of them:
K15_GraphicModule.dll / K15_GraphicModule.so
K15_SoundModule.dll / K15_SoundModule.so
K15_InputQueueModule.dll / K15_InputQueueModule.so
They were implement as subsystems.
I'll try to explain the idea behind the subsystems by the example of the GraphicModule.
The GraphicModule is, for example, a subsystem of the Engine's GraphicManager.
The GraphicManager will try to find a "K15_GraphicModule.dll" or "K15_GraphicModule.so" (depends on the OS) in it's initialize function. When it finds the dynamic library, it loads it and tries to perform the function "createGraphicModule()" within the library.
The function createGraphicModule will return an implementation of a GraphicModule interface that is declared inside the Engine's library file.
Here's some code to clarify my example.
GraphicManager::GraphicManager
{
typedef createGraphicModule IGraphicManagerModule* (*createGraphicModule)(void);
DynLib graphicLib("K15_GraphicModule") // load library (without extension...Determined by the current OS)
if(graphicLib.loadedSuccessful()){ //Check if library has been loaded.
createGraphicModule func = (createGraphicModule)graphiclib.getFuction("createGraphicModule");
if(func != NULL){ // function loaded?
this->m_subsystem = func(); //get Subsystem from dynamic library.
}
}
}
This system allows me to switch between OpenGL and DirectX just by replacing the dynamic library files...Or to switch from Windows File Manager to some Unix File Manager just by replacing the library file.
I just implemented this system about a few days ago, so I don't know how well that will work in an actual game...But it's only a matter of time 'till I know it ;-)
Friday, November 25, 2011
Doom 3 source code released!
Hey guys,
the source code of Doom 3 got released.
You can download it here.
I downloaded it yesterday but haven't had time to take a look into it,yet.
Hint:
For everyone who's using Visual Studio: There's a Visual Studio Solution File (*.sol) in the \neo\ folder.
the source code of Doom 3 got released.
You can download it here.
I downloaded it yesterday but haven't had time to take a look into it,yet.
Hint:
For everyone who's using Visual Studio: There's a Visual Studio Solution File (*.sol) in the \neo\ folder.
Subscribe to:
Comments (Atom)


