![]() |
|
images flickering |
shadyvillian
Member #12,426
December 2010
|
When ever an event happens my images flicker except the background and the images that are primitives. I feel like I've had this problem before, but I'm not checking mouse events in a random place only if an axes event happens. I think it could be Buttons[i].IsMouseOver(Event.mouse.x, Event.mouse.y);. Would putting that in parameters produce weird things? I still don't think that would cause it because if it was a weird value over would just stay false and it would draw the up state of the button. Heres some snippets of the code if(Event.type == ALLEGRO_EVENT_MOUSE_AXES) { for(int i = 0; i < (int)Buttons.size(); i++) { Buttons[i].IsMouseOver(Event.mouse.x, Event.mouse.y); }
if(Event.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN) { if(Buttons[SEARCH].IsMouseOver() == true) { //search } the code below is part of a class thats separate to the program that I use for other programs too. 1void IsMouseOver(int MouseX, int MouseY)
2 {
3 if((MouseX >= x1) && (MouseX <= x2) && (MouseY >= y1) && (MouseY <= y2))
4 {
5 Over = true;
6 }
7
8 else
9 {
10 Over = false;
11 }
12 }
13
14 bool IsMouseOver()
15 {
16 return Over;
17 }
18
19 void Draw()
20 {
21 if(UnClickable == true)
22 {
23 al_draw_bitmap(GreyedImage, x1, y1, 0);
24 }
25
26
27 else if(Over == true)
28 {
29 al_draw_bitmap(OverImage, x1, y1, 0);
30 }
31
32 else
33 {
34 al_draw_bitmap(UpImage, x1, y1, 0);
35 }
36 }
Software Engineer by day, hacker by night. |
Edgar Reynaldo
Major Reynaldo
May 2007
![]() |
Let's see your redraw block when you draw your screen. It should only flicker if you are drawing something, showing it, and then draw something else and show it. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
shadyvillian
Member #12,426
December 2010
|
Do you mean this? 1while(Program.Exit == false)
2 {
3 Program.DrawUI();
4
5 al_wait_for_event(Program.EventQueue, &Program.Event);
6
7 Program.SearchBox.GetInput(Program.Event);
8
9 if(Program.Event.type == ALLEGRO_EVENT_TIMER)
10 {
11 Program.Click = false;
12 al_stop_timer(Program.ClickTimer);
13 }
14
15 Program.GetMouseMovement();
16 Program.GetMouseClicks();
17 Program.GetKeyboardInput();
18
19 if(Program.Event.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
20 {
21 int Choice = al_show_native_message_box(Program.Screen, "Warning", NULL, "Are you sure you want to quit?", NULL, ALLEGRO_MESSAGEBOX_YES_NO);
22
23 if(Choice == YES)
24 {
25 Program.Exit = true;
26 }
27 }
28 }
Software Engineer by day, hacker by night. |
Edgar Reynaldo
Major Reynaldo
May 2007
![]() |
It's a little odd that you draw once for every event that you receive, although that would just cause lag as the drawing caught up with the mouse events. My only guess is that they flicker because you are behind in your drawing. Try processing all events in the queue at once, and then if you have received one or more timer events, then draw. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
shadyvillian
Member #12,426
December 2010
|
I Changed it to this: 1Program.DrawUI();
2 al_start_timer(Program.ReDrawTimer);
3
4 while(Program.Exit == false)
5 {
6 al_wait_for_event(Program.EventQueue, &Program.Event);
7
8 Program.SearchBox.GetInput(Program.Event);
9
10 if(Program.Event.type == ALLEGRO_EVENT_TIMER)
11 {
12 if(Program.Event.timer.source == Program.ClickTimer)
13 {
14 Program.Click = false;
15 al_stop_timer(Program.ClickTimer);
16 }
17
18 if(Program.Event.timer.source == Program.ReDrawTimer)
19 {
20 Program.ReDraw = true;
21 }
22 }
23
24 Program.GetMouseMovement();
25 Program.GetMouseClicks();
26 Program.GetKeyboardInput();
27
28 if(Program.Event.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
29 {
30 Program.ExitPrompt();
31 }
32
33 if((Program.ReDraw == true) && (al_is_event_queue_empty(Program.EventQueue) == true))
34 {
35 Program.DrawUI();
36 Program.ReDraw = false;
37 }
38 }
It seems it has reduced the number of flickers but it hasn't completely gotten rid of it. Software Engineer by day, hacker by night. |
Edgar Reynaldo
Major Reynaldo
May 2007
![]() |
I don't understand why it is flickering at all. The hover state of your buttons should not be changing back and forth rapidly, and that is the only thing that would cause your buttons to flicker. What specifically is flickering, and between what two states? Are you altering your 'Over' (hover) variable anywhere else except inside IsMouseOver(int,int)? My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
shadyvillian
Member #12,426
December 2010
|
Well its not just the buttons that are flickering. When I mean flicker all the images disappear then reappear type of thing. But the over states couldn't be changed because there private. Could it be becuase the images are transparent? I made them in a separate program then loaded them in but there 50% transparent. Software Engineer by day, hacker by night. |
Edgar Reynaldo
Major Reynaldo
May 2007
![]() |
Post the code for Program.DrawUI(). It has nothing to do with being transparent. You must be rapidly changing states somehow, because there shouldn't be any flickering at all with a double buffered or page flipping drawing setup like Allegro provides. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
shadyvillian
Member #12,426
December 2010
|
1void DrawUI()
2 {
3 if(Help == false)
4 {
5 Backgrounds[BgCounter].Draw();
6
7 al_draw_text(Font, al_map_rgb(255, 255, 255), 1015, 395, 0, "Minimum cards:");
8
9 SearchBox.Draw();
10
11 Pb_DeckSize.Draw(DRAW);
12
13 for(int i = 0; i < (int)UiBoxes.size(); i++)
14 {
15 UiBoxes[i].Draw(); //size is 4
16 }
17
18 if(IsCardSelected == true)
19 {
20 SelectedCard.Draw();
21 }
22
23 for(int i = 0; i < (int)Buttons.size(); i++)
24 {
25 Buttons[i].Draw(); //size is 2
26 }
27
28 for(int i = 0; i < (int)CardListHeaders.size(); i++)
29 {
30 CardListHeaders[i].Draw(); //size is 13
31 }
32
33 for(int i = 0; i < (int)SetSelectorButtons.size(); i++)
34 {
35 SetSelectorButtons[i].Draw(); //size is 6
36 }
37
38 if(SetSelected != NO_SET)
39 {
40 switch(SetSelected) //this draws a text probably 60 ish times in total
41 {
42 case ZEN:
43 DrawCsText(ZendikarCards); //this function passes a vector of a class that contains 8 variables with a size of anywhere from 150 to 270 in size.
44//I'm passing it by const reference though so it shouldnt make it slow.
45 break;
46
47 case WWK:
48 DrawCsText(WorldwakeCards);
49 break;
50
51 case ROE:
52 DrawCsText(RiseOfEldraziCards);
53 break;
54
55 case M11:
56 DrawCsText(Magic2011Cards);
57 break;
58
59 case SOM:
60 DrawCsText(ScarsOfMirrodinCards);
61 break;
62
63 case MBS:
64 DrawCsText(MirrodinBesiegedCards);
65 break;
66 }
67 }
68
69 if(ShowSearchedCards == true)
70 {
71 DrawCsText(SearchList);
72 }
73
74 if(Deck.size() != 0)
75 {
76 DrawDeckListCards(); //any where from 8 to over a hundred or so different al_draw_text calls in this.
77//note i've had old versions of this program that draw the same way and it didnt flicker
78 }
79
80 Menu.Draw();
81
82 if((Menu.IsMouseOverItem(SAVE) == true) && (Menu.GetSelectedState() == true))
83 {
84 SaveInputBox.ChangeActiveState(true);
85 SaveInputBox.Draw();
86 }
87
88 else
89 {
90 SaveInputBox.ChangeActiveState(false);
91 }
92
93 if((Menu.IsMouseOverItem(LOAD) == true) && (Menu.GetSelectedState() == true))
94 {
95 LoadInputBox.ChangeActiveState(true);
96 LoadInputBox.Draw();
97 }
98
99 else
100 {
101 LoadInputBox.ChangeActiveState(false);
102 }
103
104 if(Menu.GetSelectedState() == false)
105 {
106
107 }
108 }
109
110 if(Help == true)
111 {
112 HelpScreen.Draw();
113 }
114
115 al_flip_display();
116 }
I'm not drawing that many images. I've got a tile based game that draws over 1000 images and it has no problems. Software Engineer by day, hacker by night. |
Edgar Reynaldo
Major Reynaldo
May 2007
![]() |
The number of images that you draw is not the problem. It's how you're drawing the images. Something must be changing state back and forth, because that's the only thing that explains why images are being drawn on one frame and not on another. It almost sounds like you're drawing directly to the screen, but I don't think that is even possible with Allegro 5. Edit My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
shadyvillian
Member #12,426
December 2010
|
Your right. I found an extra al_flip_display some where else in the code. After removing it all the flickering is gone. Software Engineer by day, hacker by night. |
Edgar Reynaldo
Major Reynaldo
May 2007
![]() |
Well, easy enough to make that mistake with A5 now I guess. Glad it's working now. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
|