Seite 1 von 1

Allegro: Maus-position auswerten.

Verfasst: Sa Mai 28, 2011 10:13 pm
von canlot
Hallo.
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;
}

Was noch wichtig wäre.
Wie kann ich die Hauptschleife anhalten solange ich nichts mache, wegen der Leistung?

Re: Allegro: Maus-position auswerten.

Verfasst: Sa Mai 28, 2011 10:17 pm
von cloidnerux
Was gibt den al_get_mouse_cursor_position zurück, wenn nicht die Position des Coursors im Fenster?

Zu deinem 2 Problem: Threads.

Re: Allegro: Maus-position auswerten.

Verfasst: Sa Mai 28, 2011 10:21 pm
von canlot
Eine Position aus den ganzen Bildschirm.

Re: Allegro: Maus-position auswerten.

Verfasst: Sa Mai 28, 2011 10:24 pm
von Xin
Dann kannst Du mit der Fensterposition doch die Position des Maus-Zeigers im Fenster berechnen?!
Kannst Du Dein Display fragen, wo es sich auf dem Bildschirm befindet?

Re: Allegro: Maus-position auswerten.

Verfasst: Sa Mai 28, 2011 10:30 pm
von canlot
Xin hat geschrieben:Dann kannst Du mit der Fensterposition doch die Position des Maus-Zeigers im Fenster berechnen?!
Kannst Du Dein Display fragen, wo es sich auf dem Bildschirm befindet?
Nö das ist es ja grade :oops:
Habe auch schon in der Manual nachgeschaut.
Was ist fand:
al_get_new_window_position()
und
al_get_window_position()

Die erste funktion gibt was mit 21 tausend aus und die zweite -1
auch an meinen Unwissen mit den Zeigern kanns nicht liegen denn ich habe alles ausprobiert: * &

Re: Allegro: Maus-position auswerten.

Verfasst: Sa Mai 28, 2011 10:44 pm
von Kerli
Bevor du etwas verwendest solltest du im Manual nachschauen was dazu steht. Bei al_get_mouse_cursor_position steht zum Beispiel
http://www.allegro.cc/manual/5/al_get_mouse_cursor_position hat geschrieben:On platforms where this information is available, this function returns the global location of the mouse cursor, relative to the desktop. You should not normally use this function, as the information is not useful except for special scenarios as moving a window.
Das bedeutet du sollst diese Funktion wohl eher nicht verwenden ;) Ich habe zwar noch nie mit Allegro gearbeitet, aber in ihrem Wiki ist eh scheinbar alles schön erklärt. Für dein Mausproblem also zb. http://wiki.allegro.cc/index.php?title= ... se_Example

Wenn du wie dort gezeigt mit Events arbeitest hast du auch nicht mehr das Problem dass dein Programm weiter läuft wenn keine Events mehr vorhanden sind.