Error FIX: Segmentation Fault in Allegro OOP Classes

Comments 3 Standard

Okay so I’ve been setting up the skeleton of my code for this game. What I’m trying to do is setup one class that will manage all the resources of all other classes in the game. That way I can call one function to pause the game, start the game, launch menus, play sounds, and so forth and so on. To do this I’m making all the sub classes of the game write to a buffer in the manging class which I call the game engine. The game engine will then call other subclasses as the game is being played so the appropriate information is written to the buffer at different parts of the game. Everything was going great until I tried to allocate the bitmap in the game engine class using the create_bitmap(int width, int height) function.

Problematic Code

Game Engine .h File

#include <allegro.h> 
#include <linalleg.h> 

class gameegine { 

public: 
gameengine(); //default constructor 
BITMAP *getBuffer(); //returns the gameengine buffer 

private: 
BITMAP *buffer; 

};

Game Engine .cpp File

#include "gameengine.h" 

gameengine::gameengine() 
{ 

buffer; //this will work just fine 

buffer = create_bitmap(SCREENWIDTH, SCREENHEIGHT); //this crashes and burns 
clear(buffer); //this crashes and burns because buffer wasn't allocated 

}

Main .cpp File

#include <allegro.h> 
#include <linalleg.h> 
#include "gameengine.h" 

int main() 
{ 

init_alleg(); //start allegro 

gameengine *plex = new gameengine(); //start the game engine 

plex->loading(); //show the loading screen until everything is setup to start 

while (!key[KEY_ESC]) //play the game until ESC key is pressed 
{ 

scare_mouse(); //hide the mouse 

plex->draw(); //all the game stuff goes on in here 

vsync(); //remove flicker 
acquire_screen(); ///lock the screen for drawing 
show_mouse(plex->getBuffer()); //draw the mouse to the buffer 
blit(plex->getBuffer(), screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H); //draw the buffer to the screen 
release_screen(); //unlock the screen 
unscare_mouse(); //show the mouse before 

} //the game is done 

if (plex->mode() == BUILDMODE) //they are in the online game 
plex->disconnect(); //disconnect from the database 

deinit(); //release all allocated resources 

} END_OF_MAIN()

What I found is that Allegro will let you declare bitmaps in classes but it can’t allocate them. When I try to allocate the bitmap I get a shared resources of threads when compiling (on my Linux box). After several days of tearing my hair out I finally found a way to get this working. Instead of allocating the bitmap I’m going to pass it into the class constructor. That way the allocation is done outside of the class itself. The same will have to be done with the graphics class which deals with loading and drawing the graphics of the game to the game engine buffer. Not exactly the optimal solution but I’m not ready to give up on using classes in this project yet. I would have to change a lot of the program’s skeleton structure if I converted it all over to c and quite frankly I don’t have the time for that. I have a lot to get done in only a few weeks!

Working Solution

Game Engine .h File

#include <allegro.h> 
#include <linalleg.h> 

class gameegine { 

public: 
gameengine(BITMAP *newbuffer); //default constructor 
BITMAP *getBuffer(); //returns the gameengine buffer 

private: 
BITMAP *buffer; 

};

Game Engine .cpp File

#include "gameengine.h" 

gameengine::gameengine(BITMAP *newbuffer) 
{ 

buffer = newbuffer; //now this all works 
clear(buffer);  

}

Main .cpp File

#include <allegro.h> 
#include <linalleg.h> 
#include "gameengine.h" 

int main() 
{ 

init_alleg(); //start allegro 
BITMAP *buffer = create_bitmap(SCREEN_W, SCREEN_H); 

gameengine *plex = new gameengine(buffer); //start the game engine 

plex->loading(); //show the loading screen until everything is setup to start 

while (!key[KEY_ESC]) //play the game until ESC key is pressed 
{ 

scare_mouse(); //hide the mouse 

plex->draw(); //all the game stuff goes on in here 

vsync(); //remove flicker 
acquire_screen(); ///lock the screen for drawing 
show_mouse(plex->getBuffer()); //draw the mouse to the buffer 
blit(plex->getBuffer(), screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H); //draw the buffer to the screen 
release_screen(); //unlock the screen 
unscare_mouse(); //show the mouse before 

} //the game is done 

if (plex->mode() == BUILDMODE) //they are in the online game 
plex->disconnect(); //disconnect from the database 

deinit(); //release all allocated resources 

} END_OF_MAIN()
Advertisements

3 thoughts on “Error FIX: Segmentation Fault in Allegro OOP Classes

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s