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?
Thanks for searching the forum before you posted, but I am not quite sure what it is you want to accomplish.
No problem? hehe
Well okay.. I got a function in each state of my game that looks something like this:
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.
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.
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)
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.
1 | class Display |
2 | { |
3 | public: |
4 | BITMAP *backBuffer; |
5 | void Flip(); |
6 | static Display *GetDisplay(); |
7 | protected: |
8 | Display(); |
9 | virtual ~Display(); |
10 | }; |
11 | |
12 | Display::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 | |
20 | Display::~Display() |
21 | { |
22 | DEBUG("Display::~Display()"); |
23 | if(backBuffer != NULL) |
24 | destroy_bitmap(backBuffer); |
25 | backBuffer = NULL; |
26 | } |
27 | |
28 | Display *Display::GetDisplay() |
29 | { |
30 | static Display m_Display; |
31 | return &m_Display; |
32 | } |
33 | |
34 | void 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:
1 | class Button |
2 | { |
3 | private: |
4 | Display *display; |
5 | public: |
6 | void Draw(); |
7 | void Button(); |
8 | void ~Button(); |
9 | } |
10 | |
11 | Button::Button() |
12 | { |
13 | display = Display::GetDisplay(); |
14 | } |
15 | |
16 | Button::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.
Ohhhhhh!! That looks good, going to fool around with that for a bit. Thanks a bunch!
Alternative method which may be more of what you are looking for:
1 | class DrawObj |
2 | { |
3 | public: |
4 | void Draw(BITMAP *buffer); |
5 | } |
6 | |
7 | class Button: public DrawObj |
8 | { |
9 | // stuff here |
10 | } |
11 | |
12 | Button::Draw(BITMAP *buffer); |
13 | { |
14 | // draw button to buffer |
15 | } |
16 | |
17 | |
18 | class 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 | |
30 | Display::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 | |
38 | Display::~Display() |
39 | { |
40 | DEBUG("Display::~Display()"); |
41 | if(backBuffer != NULL) |
42 | destroy_bitmap(backBuffer); |
43 | backBuffer = NULL; |
44 | draw_objs.erase(); |
45 | } |
46 | |
47 | void 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 | |
54 | void 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]
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?
I'm currently trying to figure out just that nightmare to lower my memory usage ...
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!