Seit kurzem probiere ich einige Spiele Frameworks.
Was mir gut gefallen hat, ist Allegro die aktuelle Version 5.
Was allerdings schlecht ist, das es relativ neu ist und es keine Tutorials zu der Version 5 gibt, außer die in der Wiki, und selbst die ist kurz.
Nun zu meinen Problem:
Ich will eine simple GUI in Allegro programmieren und wenn ich auf ein Fenster klicke und nicht loslasse dass ich dann das Fenster bewegen kann.
Meine Frage -> wie mache ich das.
Ich kann die maus Position des Bildschirms zwar ermittel: al_get_mouse_cursor_position(*int x, *int y) aber die Funktion ermittelt nicht die Position der Maus im Fenster.
Hier mein Code:
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <allegro5/allegro.h>
#include "allegro5/allegro_image.h"
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_ttf.h>
const float FPS = 30;
const int SCREEN_W = 800;
const int SCREEN_H = 600;
enum MYKEYS {
KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT
};
int create_bmp_objekt(ALLEGRO_BITMAP **bmp_objekt, int bmp_w, int bmp_h)
{
*bmp_objekt = al_create_bitmap(bmp_w, bmp_h);
if(!bmp_objekt)
{
printf(stderr, "failed to create bitmap!\n");
return -1;
}
printf("Created BMP Objekt\n");
}
int dyeing_objekt(ALLEGRO_BITMAP **objekt, ALLEGRO_DISPLAY **display, int red, int green, int blue)
{
al_set_target_bitmap(*objekt);
al_clear_to_color(al_map_rgb(red, green, blue));
al_set_target_bitmap(al_get_backbuffer(*display));
printf("BITMAP Objekt dyed with colors red: %i green: %i blue: %i\n", red, green, blue);
}
int main(int argc, char **argv)
{
if(!al_init()) {
printf(stderr, "failed to initialize allegro!\n");
return -1;
}
printf("Allegro installed\n");
al_init_image_addon();
al_init_font_addon();
al_init_ttf_addon();
system("color 0a");
ALLEGRO_FONT *font = al_load_ttf_font("Blox2.ttf", 16, 20);
char *text = NULL;
ALLEGRO_DISPLAY *display = NULL;
ALLEGRO_EVENT_QUEUE *event_queue = NULL;
ALLEGRO_TIMER *timer = NULL;
ALLEGRO_BITMAP *window_top = al_load_bitmap("window_top.bmp");
ALLEGRO_BITMAP *window_side = al_load_bitmap("window_side.bmp");
ALLEGRO_BITMAP *window_bottom = al_load_bitmap("window_bottom.bmp");
ALLEGRO_BITMAP *full = NULL;
int *mouse_x = NULL;
int *mouse_y = NULL;
int *window_x = NULL;
int *window_y = NULL;
if(!font)
{
printf("could not load font\n");
}
printf("Font loaded\n");
bool key[4] = { false, false, false, false };
bool redraw = true;
bool doexit = false;
al_install_mouse();
if(!al_install_keyboard()) {
printf(stderr, "failed to initialize the keyboard!\n");
return -1;
}
printf("Keyboard installed\n");
timer = al_create_timer(1.0 / FPS);
if(!timer) {
printf(stderr, "failed to create timer!\n");
return -1;
}
printf("Timer created\n");
display = al_create_display(SCREEN_W, SCREEN_H);
if(!display) {
printf(stderr, "failed to create display!\n");
al_destroy_timer(timer);
return -1;
}
printf("Display created\n");
create_bmp_objekt(&full, 290, 300);
dyeing_objekt(&full, &display, 72, 209, 204);
event_queue = al_create_event_queue();
if(!event_queue) {
fprintf(stderr, "failed to create event_queue!\n");
al_destroy_display(display);
al_destroy_timer(timer);
return -1;
}
printf("Event queue created\n");
al_register_event_source(event_queue , al_get_mouse_event_source());
al_register_event_source(event_queue, al_get_display_event_source(display));
al_register_event_source(event_queue, al_get_timer_event_source(timer));
al_register_event_source(event_queue, al_get_keyboard_event_source());
al_clear_to_color(al_map_rgb(0,0,0));
al_flip_display();
al_start_timer(timer);
al_set_window_title(display,"Hallo Allegro");
printf("Title created\n");
while(!doexit)
{
ALLEGRO_EVENT ev;
al_wait_for_event(event_queue, &ev);
al_get_mouse_cursor_position(&mouse_x, &mouse_y);
printf("Mouse x: %d y: %d\n", mouse_x, mouse_y);
if(mouse_x == 0 && mouse_y == 0)
dyeing_objekt(&full ,&display , 150, 24, 58);
if(ev.type == ALLEGRO_EVENT_TIMER) {
if(key[KEY_UP]) {
printf("UP Key pressed\n");
text = "UP AROW";
}
if(key[KEY_DOWN]) {
printf("DOWN Key pressed\n");
text = "DOWN AROW";
}
if(key[KEY_LEFT]) {
printf("LEFT Key pressed\n");
text = "LEFT ARROW";
}
if(key[KEY_RIGHT]) {
printf("RIGHT Key pressed\n");
text = "RIGHT ARROW";
}
redraw = true;
}
else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
break;
}
else if(ev.type == ALLEGRO_EVENT_KEY_DOWN) {
switch(ev.keyboard.keycode) {
case ALLEGRO_KEY_UP:
key[KEY_UP] = true;
break;
case ALLEGRO_KEY_DOWN:
key[KEY_DOWN] = true;
break;
case ALLEGRO_KEY_LEFT:
key[KEY_LEFT] = true;
break;
case ALLEGRO_KEY_RIGHT:
key[KEY_RIGHT] = true;
break;
}
}
else if(ev.type == ALLEGRO_EVENT_KEY_UP) {
switch(ev.keyboard.keycode) {
case ALLEGRO_KEY_UP:
key[KEY_UP] = false;
break;
case ALLEGRO_KEY_DOWN:
key[KEY_DOWN] = false;
break;
case ALLEGRO_KEY_LEFT:
key[KEY_LEFT] = false;
break;
case ALLEGRO_KEY_RIGHT:
key[KEY_RIGHT] = false;
break;
case ALLEGRO_KEY_ESCAPE:
doexit = true;
break;
}
}
if(redraw && al_is_event_queue_empty(event_queue)) {
redraw = false;
al_clear_to_color(al_map_rgb(0,0,0));
al_draw_bitmap(full, 205, 120, 0);
al_draw_bitmap(window_top, 200, 100, 0);
al_draw_bitmap(window_side,200, 120, 0);
al_draw_bitmap(window_side, 496, 119, 0);
al_draw_bitmap(window_bottom, 200, 420, 0);
al_draw_text(font,
al_map_rgb(250,205,170),
210, 102,
ALLEGRO_ALIGN_LEFT,
text);
al_flip_display();
}
}
al_destroy_timer(timer);
al_destroy_display(display);
al_destroy_event_queue(event_queue);
return 0;
}
Wie kann ich die Hauptschleife anhalten solange ich nichts mache, wegen der Leistung?