Allegro: Maus-position auswerten.

z.B. wxWidgets, GTK+, Qt, OpenGL, DirectX
Antworten
canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Allegro: Maus-position auswerten.

Beitrag von canlot » Sa Mai 28, 2011 10:13 pm

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?
Unwissenheit ist ein Segen

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Allegro: Maus-position auswerten.

Beitrag von cloidnerux » Sa Mai 28, 2011 10:17 pm

Was gibt den al_get_mouse_cursor_position zurück, wenn nicht die Position des Coursors im Fenster?

Zu deinem 2 Problem: Threads.
Redundanz macht wiederholen unnötig.
quod erat expectandum

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Allegro: Maus-position auswerten.

Beitrag von canlot » Sa Mai 28, 2011 10:21 pm

Eine Position aus den ganzen Bildschirm.
Unwissenheit ist ein Segen

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Allegro: Maus-position auswerten.

Beitrag von Xin » Sa Mai 28, 2011 10:24 pm

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?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Allegro: Maus-position auswerten.

Beitrag von canlot » Sa Mai 28, 2011 10:30 pm

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: * &
Unwissenheit ist ein Segen

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Allegro: Maus-position auswerten.

Beitrag von Kerli » Sa Mai 28, 2011 10:44 pm

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.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Antworten