Buffering class for datafiles.
julian_boolean

I seen this thread http://www.allegro.cc/forums/thread/590302 for a buffering class someone made and was wondering if there is any floating around that work with datafiles instead?

CGamesPlay

Thanks for searching the forum before you posted, but I am not quite sure what it is you want to accomplish.

julian_boolean

No problem? hehe

Well okay.. I got a function in each state of my game that looks something like this:

menu::menu()
{
  continue_button = new button((BITMAP*)gui[button_down].dat, (BITMAP*)gui[button_off].dat);

  exit_button = new button((BITMAP*)gui[button_down].dat, (BITMAP*)gui[button_off].dat);

void draw(BITMAP *buffer)
{
  continue_button->draw(buffer)
  exit_button->draw(buffer)
}

I want to try to find a way to remove this function all together and just put a buffer through the class?.. If that makes sense.

Steve Terry

I just hope you realize first off that the class you are referring to is severely broken and as far as I can tell does nothing than blit the image to location x, y and push the pointer into a vector which serves no purpose.

julian_boolean

Nm about the whole thing, I'll find a way to do it myself since I'm having trouble explaining what I want.

The code I posted was just a very, very small example.. Not even my actual code.

(edit)

Oh you mean that guy's code?

Well I want to find a way to put all the objects I create into a vector and buffer them, without actually having to say yknow.. button_instance_name->draw(buffer)

Steve Terry

Yes that guys code. What do you want in a buffering class? If you mean the ability to switch between buffered modes (i.e. double, triple, page flipping) then there are plenty of examples in the forums. If on the other hand you want some kind of class which all widgets draw to you can create a simple class that creates a buffer and has a draw method which blits it to the screen. You can create a singleton instance of this class which means there is only one copy of it and each widget can get the instance and blit to it.

1class Display
2{
3 public:
4 BITMAP *backBuffer;
5 void Flip();
6 static Display *GetDisplay();
7 protected:
8 Display();
9 virtual ~Display();
10};
11 
12Display::Display()
13{
14 DEBUG("Display::Display()");
15 backBuffer = create_bitmap(SCREEN_W, SCREEN_H);
16 if(!backBuffer)
17 throw Exception("Error: Display - Unable to create backbuffer");
18}
19 
20Display::~Display()
21{
22 DEBUG("Display::~Display()");
23 if(backBuffer != NULL)
24 destroy_bitmap(backBuffer);
25 backBuffer = NULL;
26}
27 
28Display *Display::GetDisplay()
29{
30 static Display m_Display;
31 return &m_Display;
32}
33 
34void Display::Flip()
35{
36 masked_blit(mouse_sprite, backBuffer, 0, 0, mouse_x, mouse_y, mouse_sprite->w, mouse_sprite->h);
37 blit(backBuffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
38}

In your class you simply do this:

1class Button
2{
3 private:
4 Display *display;
5 public:
6 void Draw();
7 void Button();
8 void ~Button();
9}
10 
11Button::Button()
12{
13 display = Display::GetDisplay();
14}
15 
16Button::Draw()
17{
18 blit(blah, display->backbuffer, 0, 0, 0, 0, blah->w, blah->h);
19}

Also you can have in the singleton display class a vector of pointers to base objects that have a draw method and upon flip you can simply iterate through those classes and have them draw to its buffer. That would work as well. A vector of bitmaps like the other guys class wouldn't work for what you want.

julian_boolean

Ohhhhhh!! That looks good, going to fool around with that for a bit. Thanks a bunch!

Steve Terry

Alternative method which may be more of what you are looking for:

1class DrawObj
2{
3 public:
4 void Draw(BITMAP *buffer);
5}
6 
7class Button: public DrawObj
8{
9 // stuff here
10}
11 
12Button::Draw(BITMAP *buffer);
13{
14 // draw button to buffer
15}
16 
17 
18class Display
19{
20 private:
21 BITMAP *backBuffer;
22 std::vector<DrawObj *> draw_objs;
23 public:
24 Display();
25 virtual ~Display();
26 void Flip();
27 void Add(DrawObj *obj);
28};
29 
30Display::Display()
31{
32 DEBUG("Display::Display()");
33 backBuffer = create_bitmap(SCREEN_W, SCREEN_H);
34 if(!backBuffer)
35 throw Exception("Error: Display - Unable to create backbuffer");
36}
37 
38Display::~Display()
39{
40 DEBUG("Display::~Display()");
41 if(backBuffer != NULL)
42 destroy_bitmap(backBuffer);
43 backBuffer = NULL;
44 draw_objs.erase();
45}
46 
47void Display::Flip()
48{
49 for(i = 0; i < draw_objs.size(); ++i)
50 draw_objs<i>->Draw(backBuffer);
51 blit(backBuffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
52}
53 
54void Display::Add(DrawObj *obj)
55{
56 draw_objs.push_back(obj);
57}

So you create somewhere a Display object and add your widgets to it, then in a main draw function you call display->flip(). Easy enough?

[edit]
A third alternative is to use the Display singleton and a new class that contains a vector to your objects which simply blits them all to your singleton Display, whichever method seems best for your needs.
[/edit]

Dustin Dettmer

Damn, I was hoping this thread would be about adding a buffer for the datafile system to allow partial loading / unloading of datafiles.

I'm currently trying to figure out just that nightmare to lower my memory usage :(...

But being on topic, I have a class that just does this. It is not particularly clean as I wrote it years ago (and I had horrible style then). The class works very well though, if you would like it I can post its source maybe?

Thomas Fjellstrom
Quote:

I'm currently trying to figure out just that nightmare to lower my memory usage :(...

load_datafile_object

julian_boolean

I would like to see it if you want to post it. Going to try out everyone's code/ideas to see what works best for me. Thanks! :)

Thread #590718. Printed from Allegro.cc