|
Problem with ALLEGRO_FULLSCREEN_WINDOW and multi monitor |
Edgar Reynaldo
Major Reynaldo
May 2007
|
The following code works. When changing it to use ALLEGRO_FULLSCREEN_WINDOW however it does not. src + BG.png here : https://www.allegro.cc/files/attachment/611139 1#include "allegro5/allegro.h"
2#include "allegro5/allegro_font.h"
3#include "allegro5/allegro_ttf.h"
4#include "allegro5/allegro_image.h"
5#include "allegro5/allegro_primitives.h"
6
7
8
9void DrawLightB(int x , int y , int r , float fr , float fg , float fb);
10void DrawLightB(int x , int y , int r , float fr , float fg , float fb) {
11 al_draw_filled_circle(x,y,r,al_map_rgb_f(fr,fg,fb));
12}
13void DrawLightA(int x , int y , int r , float fr , float fg , float fb);
14void DrawLightA(int x , int y , int r , float fr , float fg , float fb) {
15 int rad = r;
16 float l = 1. / ((float) r);
17 while (rad > 0) {
18 al_draw_filled_circle(x , y , rad , al_map_rgb_f(fr*l,fg*l,fb*l));
19 rad -= 1;
20 }
21}
22void DrawLightC(int x , int y , int r , float fr , float fg , float fb);
23void DrawLightC(int x , int y , int r , float fr , float fg , float fb) {
24 int rad = r;
25 while (rad > 0) {
26 float l = (r-rad)/(float)(r*10.0);///1. / ((float) r);
27 al_draw_filled_circle(x , y , rad , al_map_rgb_f(fr*l,fg*l,fb*l));
28 rad -= 10;
29 }
30}
31
32
33
34///#include "allegro5/allegro_direct3d.h"
35
36
37
38int main(int argc , char** argv) {
39
40 (void)argc;
41 (void)argv;
42
43
44 if (!al_init()) {
45 return 1;
46 }
47 if (!al_init_image_addon()) {return 2;}
48 if (!al_init_font_addon()) {return 3;}
49 if (!al_init_ttf_addon()) {return 4;}
50 if (!al_init_primitives_addon()) {return 5;}
51
52 al_install_keyboard();
53 al_install_mouse();
54
55 al_set_new_display_flags(ALLEGRO_FULLSCREEN | ALLEGRO_OPENGL);
56/// al_set_new_display_flags(ALLEGRO_FULLSCREEN_WINDOW | ALLEGRO_OPENGL);
57 ALLEGRO_DISPLAY* d = al_create_display(1920,1080);
58
59 ALLEGRO_TIMER* t = al_create_timer(1.0/60.0);
60
61 ALLEGRO_EVENT_QUEUE* q = al_create_event_queue();
62
63 al_register_event_source(q , al_get_timer_event_source(t));
64 al_register_event_source(q , al_get_display_event_source(d));
65 al_register_event_source(q , al_get_keyboard_event_source());
66 al_register_event_source(q , al_get_mouse_event_source());
67
68 ALLEGRO_BITMAP* lmap = al_create_bitmap(1920,1080);
69 ALLEGRO_BITMAP* bg = al_load_bitmap("BG.png");
70
71 if (!bg || !lmap) {return 7;}
72
73 int mx = 0;
74 int my = 0;
75
76
77
78 ALLEGRO_BITMAP* lmap2 = al_create_bitmap(2048,2048);
79
80 /// draw our light map
81 al_set_target_bitmap(lmap2);
82 al_clear_to_color(al_map_rgb(0,0,0));
83
84 mx = 1024;
85 my = 1024;
86
87 // Additive blending
88 al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_ONE);
89/// DrawLight(0 , 0 , 200);
90/// DrawLight(mx , my , 200 , 1.0 , 1.0 , 1.0);
91 DrawLightA(mx - 100 , my - 100 , 400 , 1.0 , 0.0 , 0.0);
92 DrawLightA(mx + 100 , my - 100 , 400 , 0.0 , 1.0 , 0.0);
93 DrawLightA(mx , my + 73 , 400 , 0.0 , 0.0 , 1.0);
94
95 al_start_timer(t);
96
97 bool run = true;
98 bool draw = true;
99 while (run) {
100 if (draw) {
101 /// draw our light map
102 al_set_target_bitmap(lmap);
103 al_clear_to_color(al_map_rgb(0,0,0));
104
105 // Additive blending
106 al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_ONE);
107
108 al_draw_bitmap(lmap2 , mx - 1024 , my - 1024 , 0);
109
110/// DrawLight(0 , 0 , 200);
111/// DrawLight(mx , my , 200 , 1.0 , 1.0 , 1.0);
112/**
113
114 DrawLightA(mx - 100 , my - 100 , 400 , 1.0 , 0.0 , 0.0);
115 DrawLightA(mx + 100 , my - 100 , 400 , 0.0 , 1.0 , 0.0);
116 DrawLightA(mx , my + 73 , 400 , 0.0 , 0.0 , 1.0);
117
118 DrawLightB(mx - 100 , my - 100 , 300 , 1.0 , 0.0 , 0.0);
119 DrawLightB(mx + 100 , my - 100 , 300 , 0.0 , 1.0 , 0.0);
120 DrawLightB(mx , my + 73 , 300 , 0.0 , 0.0 , 1.0);
121
122 DrawLightC(mx - 100 , my - 100 , 400 , 1.0 , 0.0 , 0.0);
123 DrawLightC(mx + 100 , my - 100 , 400 , 0.0 , 1.0 , 0.0);
124 DrawLightC(mx , my + 73 , 400 , 0.0 , 0.0 , 1.0);
125*/
126
127 al_set_target_backbuffer(d);
128 al_clear_to_color(al_map_rgb_f(1,1,1));
129
130 // Default blending (premult alpha)
131 al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA);
132 al_draw_bitmap(bg , (1920 - al_get_bitmap_width(bg))/2 , (1080 - al_get_bitmap_height(bg))/2 , 0);
133
134 // Mult source & dest blending
135 al_set_blender(ALLEGRO_ADD, ALLEGRO_DEST_COLOR, ALLEGRO_ZERO);
136 al_draw_bitmap(lmap , 0 , 0 , 0);
137 al_flip_display();
138 draw = false;
139 }
140
141 do {
142 ALLEGRO_EVENT ev;
143 al_wait_for_event(q , &ev);
144 if (ev.type == ALLEGRO_EVENT_MOUSE_AXES) {
145 mx = ev.mouse.x;
146 my = ev.mouse.y;
147 draw = true;
148 }
149 if (ev.type == ALLEGRO_EVENT_KEY_DOWN && ev.keyboard.keycode == ALLEGRO_KEY_ESCAPE) {
150 run = false;
151 }
152 if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
153 run = false;
154 }
155 if (ev.type == ALLEGRO_EVENT_TIMER) {
156 draw = true;
157 }
158 } while (!al_is_event_queue_empty(q));
159
160 }
161 return 0;
162}
If you change line 55 to use ALLEGRO_FULLSCREEN_WINDOW, it goes crazy and can't display itself properly. I have to unplug the second monitor before it becomes responsive again using a dual monitor setup where the second display is cloned from the first. This is on Windows 10 with MinGW-W64 Gcc 7.1 and Allegro 5.2.3. It should look like this : 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 |
|