10#define ALLEGRO_UNSTABLE 1
17#include <allegro5/allegro_ttf.h>
19ALLEGRO_DISPLAY *display = NULL ;
25ALLEGRO_BITMAP *scr_buf = NULL ;
27ALLEGRO_TIMER *fps_timer = NULL ;
28ALLEGRO_TIMER *logic_timer = NULL ;
29LIST *active_object = NULL ;
34int main(
int argc,
char *argv[] )
49 n_abort(
"Could not init Allegro.\n");
51 if (!al_install_audio())
53 n_abort(
"Unable to initialize audio addon\n");
55 if (!al_init_acodec_addon())
57 n_abort(
"Unable to initialize acoded addon\n");
59 if (!al_init_image_addon())
61 n_abort(
"Unable to initialize image addon\n");
63 if (!al_init_primitives_addon() )
65 n_abort(
"Unable to initialize primitives addon\n");
67 if( !al_init_font_addon() )
69 n_abort(
"Unable to initialize font addon\n");
71 if( !al_init_ttf_addon() )
73 n_abort(
"Unable to initialize ttf_font addon\n");
75 if( !al_install_keyboard() )
77 n_abort(
"Unable to initialize keyboard handler\n");
79 if( !al_install_mouse())
81 n_abort(
"Unable to initialize mouse handler\n");
83 ALLEGRO_EVENT_QUEUE *event_queue = NULL;
85 event_queue = al_create_event_queue();
88 fprintf(stderr,
"failed to create event_queue!\n");
89 al_destroy_display(display);
93 char ver_str[ 128 ] =
"" ;
94 while( ( getoptret = getopt( argc, argv,
"hvV:L:" ) ) != EOF )
99 n_log(
LOG_NOTICE,
"\n %s -h help -v version -V DEBUGLEVEL (NOLOG,VERBOSE,NOTICE,ERROR,DEBUG)\n", argv[ 0 ] );
102 sprintf( ver_str,
"%s %s", __DATE__, __TIME__ );
106 if( !strncmp(
"NOTICE", optarg, 6 ) )
112 if( !strncmp(
"VERBOSE", optarg, 7 ) )
118 if( !strncmp(
"ERROR", optarg, 5 ) )
124 if( !strncmp(
"DEBUG", optarg, 5 ) )
130 n_log(
LOG_ERR,
"%s is not a valid log level\n", optarg );
148 n_log(
LOG_ERR,
"\nPlease specify a log level after -V. \nAvailable values: NOLOG,VERBOSE,NOTICE,ERROR,DEBUG\n\n" );
151 n_log(
LOG_ERR,
"\nPlease specify a log file after -L\n" );
156 __attribute__ ((fallthrough));
158 n_log(
LOG_ERR,
"\n %s -h help -v version -V DEBUGLEVEL (NOLOG,VERBOSE,NOTICE,ERROR,DEBUG) -L logfile\n", argv[ 0 ] );
163 fps_timer = al_create_timer( 1.0/30.0 );
164 logic_timer = al_create_timer( 1.0/50.0 );
166 al_set_new_display_flags( ALLEGRO_OPENGL|ALLEGRO_WINDOWED );
167 display = al_create_display( WIDTH, HEIGHT );
170 n_abort(
"Unable to create display\n");
172 al_set_window_title( display, argv[ 0 ] );
174 al_set_new_bitmap_flags( ALLEGRO_VIDEO_BITMAP );
183 KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_ESC, KEY_SPACE, KEY_CTRL
185 int key[ 7 ] = {
false,
false,
false,
false,
false,
false,
false};
187 al_register_event_source(event_queue, al_get_display_event_source(display));
189 al_start_timer( fps_timer );
190 al_start_timer( logic_timer );
191 al_register_event_source(event_queue, al_get_timer_event_source(fps_timer));
192 al_register_event_source(event_queue, al_get_timer_event_source(logic_timer));
194 al_register_event_source(event_queue, al_get_keyboard_event_source());
195 al_register_event_source(event_queue, al_get_mouse_event_source());
197 ALLEGRO_BITMAP *scrbuf = al_create_bitmap( WIDTH, HEIGHT );
199 al_hide_mouse_cursor(display);
203 int mx = 0, my = 0, mouse_b1 = 0, mouse_b2 = 0 ;
204 int do_draw = 0, do_logic = 0 ;
206 al_clear_keyboard_state( NULL );
207 al_flush_event_queue( event_queue );
214 al_wait_for_event(event_queue, &ev);
216 if(ev.type == ALLEGRO_EVENT_KEY_DOWN)
218 switch(ev.keyboard.keycode)
223 case ALLEGRO_KEY_DOWN:
226 case ALLEGRO_KEY_LEFT:
229 case ALLEGRO_KEY_RIGHT:
232 case ALLEGRO_KEY_ESCAPE:
235 case ALLEGRO_KEY_SPACE:
238 case ALLEGRO_KEY_LCTRL:
239 case ALLEGRO_KEY_RCTRL:
245 else if(ev.type == ALLEGRO_EVENT_KEY_UP)
247 switch(ev.keyboard.keycode)
252 case ALLEGRO_KEY_DOWN:
255 case ALLEGRO_KEY_LEFT:
258 case ALLEGRO_KEY_RIGHT:
261 case ALLEGRO_KEY_ESCAPE:
264 case ALLEGRO_KEY_SPACE:
267 case ALLEGRO_KEY_LCTRL:
268 case ALLEGRO_KEY_RCTRL:
274 else if( ev.type == ALLEGRO_EVENT_TIMER )
276 if( al_get_timer_event_source( fps_timer ) == ev.any.source )
280 else if( al_get_timer_event_source( logic_timer ) == ev.any.source )
285 else if( ev.type == ALLEGRO_EVENT_MOUSE_AXES )
290 else if( ev.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN )
292 if( ev.mouse.button == 1 )
294 if( ev.mouse.button == 2 )
297 else if( ev.type == ALLEGRO_EVENT_MOUSE_BUTTON_UP )
299 if( ev.mouse.button == 1 )
301 if( ev.mouse.button == 2 )
304 else if( ev.type == ALLEGRO_EVENT_DISPLAY_SWITCH_IN || ev.type == ALLEGRO_EVENT_DISPLAY_SWITCH_OUT )
306 al_clear_keyboard_state( display );
307 al_flush_event_queue( event_queue );
315 while( !al_is_event_queue_empty( event_queue) );
320 int mouse_button = -1 ;
330 if( mouse_button == 1 )
334 for(
int it = 0 ; it < 100 ; it ++ )
344 al_map_rgba( 55 + rand()%200, 55 + rand()%200, 55 + rand()%200, 10 + rand()%245 ), tmp_part );
353 al_acknowledge_resize( display );
354 int w = al_get_display_width( display );
355 int h = al_get_display_height( display );
357 al_set_target_bitmap( scrbuf );
358 al_clear_to_color( al_map_rgba( 0, 0, 0, 255 ) );
363 al_set_target_bitmap( al_get_backbuffer( display ) );
365 al_clear_to_color( al_map_rgba( 0, 0, 0, 255 ) );
366 al_draw_bitmap( scrbuf, 0, 0, 0 );
369 al_draw_line( mx - 5, my, mx + 5, my, al_map_rgb( 255, 0, 0 ), 1 );
370 al_draw_line( mx, my + 5, mx, my - 5, al_map_rgb( 255, 0, 0 ), 1 );
377 while( !key[KEY_ESC] && !DONE );
void n_abort(char const *format,...)
abort program with a text
int list_destroy(LIST **list)
Empty and Free a list container.
LIST * new_generic_list(int max_items)
Initialiaze a generic list container to max_items pointers.
Structure of a generic LIST container.
#define n_log(__LEVEL__,...)
Logging function wrapper to get line and func.
#define LOG_DEBUG
debug-level messages
#define LOG_ERR
error conditions
int set_log_file(char *file)
Set the logging to a file instead of stderr.
void set_log_level(const int log_level)
Set the global log level value ( static int LOG_LEVEL )
#define LOG_NOTICE
normal but significant condition
#define LOG_INFO
informational
#define free_nstr(__ptr)
free a N_STR structure and set the pointer to NULL
#define nstrprintf(__nstr_var,...)
Macro to quickly allocate and sprintf to N_STR
A box including a string and his lenght.
int draw_particle(PARTICLE_SYSTEM *psys, double xpos, double ypos, int w, int h, double range)
draw particles of a particle system
#define PIXEL_PART
pixel particle
int manage_particle(PARTICLE_SYSTEM *psys)
update particles positions usting particle system internal timer
int add_particle(PARTICLE_SYSTEM *psys, int spr, int mode, int lifetime, int size, ALLEGRO_COLOR color, PHYSICS object)
add a particle to a particle system
int init_particle_system(PARTICLE_SYSTEM **psys, int max, double x, double y, double z, int max_sprites)
initialize a particle system
Structure of a particle system.
#define VECTOR3D_SET(VECTOR, X, Y, Z)
helper to set a VECTOR3D position
structure of the physics of an object
Animations graphics and animations parameters.
Common headers and low-level hugly functions & define.
static FILE * log_file
static FILE handling if logging to file is enabled