Error FIX: Segmentation Fault in Allegro OOP Classes
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()
sweet, a blog with code!
This code dont compile on my Code::Block
What error are you getting?