Allegro: EingabeText Hintergund ändern... WIE???



  • Hallo
    Ich bin seit heute wieder angefangen mit Allegro[4.2.2] für DEV C++ zu arbeiten

    ich bin nun bei der Texteingabe und benutze dabei gleichzeitig diese seite:

    http://www.c-programmieren.com/Allegro-Tutorial.html

    dort steht folgender Code bei der Texteingabe:

    #include <allegro.h>
    #include <string.h>
    
    void Eingabe(FONT* myfont, char *Schreib1, int x, int y, int Schriftfarbe, int Hintergrund, char *Ausgabe)
    
    {
     int val, i, anz;
     char Eingabestring[1024]={""};
     char Schreib[1024];
    
     sprintf(Schreib,"%s",Schreib1);
    
     while( !key[KEY_ENTER])
     {
      textout_ex(screen, myfont, Schreib, x, y, Schriftfarbe, Hintergrund);
      val = readkey();
      if ((val >> 8) != KEY_ENTER && (val >> 8) != KEY_ESC)
      {
       anz=strlen(Eingabestring);
       if ((val >> 8) == KEY_BACKSPACE)
       {
        Eingabestring[anz-1]='\0';
        clear_bitmap(screen);
       }
       else if ((val >> 8) == KEY_TAB)
      {
      for(i=0;i<9;i++) Eingabestring[anz+i]=' ';
      Eingabestring[anz+i]='\0';
      }
      else
      {
      Eingabestring[anz]=(char)(val & 0xff);
      Eingabestring[anz+1]='\0';
      }
     }
      textout_ex(screen, myfont, Eingabestring, x+text_length(myfont,Schreib), y,  
      Schriftfarbe, Hintergrund);
      }
      sprintf(Ausgabe,"%s",Eingabestring);
    }
    
    int main(void){
        char Name[900];
    
        allegro_init();
        install_keyboard();
        set_color_depth(16);
        set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0);
    
        Eingabe(font,"Bitte geben Sie Ihren Namen ein: ",0,0, makecol(0, 0, 255), -1, Name);
    
        clear_bitmap(screen);
        while( !key[KEY_ESC])
        {
           textprintf_ex(screen, font, 0, 0, makecol(0, 0, 255), -1,"Ihr Name lautet: ");
           textprintf_ex(screen, font, text_length(font,"Ihr Name lautet: "), 0, makecol(0, 0, 255), -1, Name);
        }
    
     return 0;
    }
    END_OF_MAIN();
    

    mein code soll aber so arbeiten:

    -> zeichne buffer
    -> zeichne bild1
    -> zeichne bild2
    -> texteingabe

    aber mein programm arbeitet so 😞

    -> schwarzer hintergund und texteingabe
    -> dannach folgt alles andere

    Was mache ich falsch ????

    mein code:

    #include <allegro.h>
    #include <string.h>
    
    BITMAP *Bild1;
    BITMAP *Bild2;
    BITMAP *Bild3;
    BITMAP *Bild4;
    BITMAP *Bild5;
    BITMAP *Bild6;
    BITMAP *Bild7;
    BITMAP *Bild8;
    BITMAP *Bild9;
    
    BITMAP* buffer;
    
    void Eingabe(FONT* myfont, char *Schreib1, int x, int y, int Schriftfarbe, int Hintergrund, char *Ausgabe)
    {
      int val, i, anz;
      char Eingabestring[1024]={""};
      char Schreib[1024];
    
      sprintf(Schreib,"%s",Schreib1);
    
      while( !key[KEY_ENTER])
      {
        textout_ex(buffer, myfont, Schreib, x, y, Schriftfarbe, Hintergrund);
        val = readkey();
        if ((val >> 8) != KEY_ENTER && (val >> 8) != KEY_ESC)
        {
            anz=strlen(Eingabestring);
            if ((val >> 8) == KEY_BACKSPACE)
            {
                Eingabestring[anz-1]='\0';
                clear_bitmap(buffer);
            }
            else if ((val >> 8) == KEY_TAB)
            {
                 for(i=0;i<9;i++) Eingabestring[anz+i]=' ';
                 Eingabestring[anz+i]='\0';
            }
            else
            {
                 Eingabestring[anz]=(char)(val & 0xff);
                 Eingabestring[anz+1]='\0';
            }
        }
        textout_ex(buffer, myfont, Eingabestring, x+text_length(myfont,Schreib), y, Schriftfarbe, Hintergrund);
      }
      sprintf(Ausgabe,"%s",Eingabestring);
    }
    
    int main()
    {
     allegro_init();
       char Name[900];
     install_keyboard();
     install_mouse(); 
    
     set_color_depth(32);
     set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
     set_window_title("Zierpflanzenbau"); 
     show_os_cursor(MOUSE_CURSOR_ARROW); 
    
     buffer=create_bitmap(640, 480); 
     Bild1=load_bitmap("bmps//Background.bmp", NULL);
     Bild2=load_bitmap("bmps//begonie1.bmp", NULL);
    
     int x = 1;
     int y = 1;
    
     Eingabe(font,"Bitte geben Sie Ihren Namen ein: ",0,0, makecol(0, 0, 255), -1, Name);
    
     while( !key[KEY_ESC])
     {
      draw_sprite(screen, buffer, 0,0);
      draw_sprite(buffer, Bild1, 0,0);
      textprintf_ex(buffer, font, 330, 80, makecol(0, 0, 0), makecol(51, 204, 204), "Deutsch:");
      textprintf_ex(buffer, font, 330, 150, makecol(0, 0, 0), makecol(51, 204, 204), "Botanisch:");
      //////////////////////////////////////////////////////////////////////////////////////////////
    
      draw_sprite(buffer, Bild2, 34,27);   
      textprintf_ex(buffer, font, 405, 80, makecol(0, 0, 0), makecol(51, 204, 204), "Eisbegonie");
     }
    
     destroy_bitmap(Bild1);
     destroy_bitmap(Bild2);
     //destroy_bitmap(Bild3);
     //destroy_bitmap(Bild4);
     destroy_bitmap(buffer);
     return 0;
    }
    END_OF_MAIN();
    


  • Hey!

    Der Beitrag ist zwar schon n halbes Jahr alt, aber vielleicht kann ich dir die Lösung hierzu dennoch eben erklären 😉 Vielleicht brauchste sie ja immer noch 😃

    Bitte zuerst einmal keine char arrays die einen Wert von 900 besitzen!
    Reine Speicherverschwendung, nimm entweder einen festgelegten niedrigeren Wert, frage den User nach dem exakten Wert oder bestimme den Wert dynamisch, während das Programm läuft.

    So nun zu den anderen Dingen.
    Der Bildschirm bleibt schwarz, weil du dein erstelltes Buffer Bitmap nicht auf den Bildschirm zeichnest. Das wird durch folgende Funktion erreicht:

    blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);

    Diese Funktion wird ganz zum Schluss der while Schleife eingefügt, wo dem PC vermittelt wird auf den Bildschirm zu zeichnen.

    Weiterhin ist das Statement in Zeile 79: draw_sprite(screen, buffer, 0,0); überflüssig, schmeiß es raus.

    Zweitens ist das Problem, dass die Readkey() Funktion auf eine Eingabe wartet, ähnlich dem Prinzip von scanf in C oder cin in C++. Dadurch hält der PC an und wartet auf eine Eingabe.

    Die Lösung ist eine bool Abfrage zu machen, ob die Eingabe in der while Schleife bereits stattgefunden hat.

    Hier eine Verbesserung deines Codes:

    int main()
    {
     allegro_init();
       char Name[900];
     install_keyboard();
     install_mouse();
    
     set_color_depth(32);
     set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
     set_window_title("Zierpflanzenbau");
     show_os_cursor(MOUSE_CURSOR_ARROW);
    
     buffer=create_bitmap(640, 480);
     Bild1=load_bitmap("bmps//Background.bmp", NULL);
     Bild2=load_bitmap("bmps//begonie1.bmp", NULL);
    
     int x = 1;
     int y = 1;
    
     while( !key[KEY_ESC])
     {
      draw_sprite(buffer, Bild1, 0,0);
      textprintf_ex(buffer, font, 330, 80, makecol(0, 0, 0), makecol(51, 204, 204), "Deutsch:");
      textprintf_ex(buffer, font, 330, 150, makecol(0, 0, 0), makecol(51, 204, 204), "Botanisch:");
      //////////////////////////////////////////////////////////////////////////////////////////////
    
      draw_sprite(buffer, Bild2, 34,27);  
    
      // Hier wird die Funktion aufgerufen und mit if abgefragt ob diese bereits  ausgeführt wurde, wenn nicht führe sie aus.
      if (!fertig)
        {
        Eingabe(font,"Bitte geben Sie Ihren Namen ein: ",0,0, makecol(0, 0, 255),  -1, Name);
        // Variable wird auf wahr gesetzt, sodass es nicht wieder ausgeführt wird beim erneuten Durchlauf der while Schleife  ;) 
        done = true;
        }
    
      textprintf_ex(buffer, font, 405, 80, makecol(0, 0, 0), makecol(51, 204, 204), "Eisbegonie");
    
    // Blit Funktion zum Zeichnen auf den Bildschirm
       blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
     }
    
     destroy_bitmap(Bild1);
     destroy_bitmap(Bild2);
     //destroy_bitmap(Bild3);
     //destroy_bitmap(Bild4);
     destroy_bitmap(buffer);
     return 0;
    }
    END_OF_MAIN();
    


  • Hatte die bool Variable vergessen anzufügen, hier ist die richtige Version: 🙄

    #include <allegro.h>
    #include <string.h>
    
    BITMAP *Bild1;
    BITMAP *Bild2;
    BITMAP *Bild3;
    BITMAP *Bild4;
    BITMAP *Bild5;
    BITMAP *Bild6;
    BITMAP *Bild7;
    BITMAP *Bild8;
    BITMAP *Bild9;
    
    BITMAP* buffer;
    
    int main()
    {
     allegro_init();
       char Name[900];
     install_keyboard();
     install_mouse();
    
     set_color_depth(32);
     set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
     set_window_title("Zierpflanzenbau");
     show_os_cursor(MOUSE_CURSOR_ARROW);
    
     buffer=create_bitmap(640, 480);
     Bild1=load_bitmap("bmps//Background.bmp", NULL);
     Bild2=load_bitmap("bmps//begonie1.bmp", NULL);
    
     // bool Variable, die die Ausführung der Funktion prüft!
     bool fertig = false;
    
     int x = 1;
     int y = 1;
    
     while( !key[KEY_ESC])
     {
      draw_sprite(buffer, Bild1, 0,0);
      textprintf_ex(buffer, font, 330, 80, makecol(0, 0, 0), makecol(51, 204, 204), "Deutsch:");
      textprintf_ex(buffer, font, 330, 150, makecol(0, 0, 0), makecol(51, 204, 204), "Botanisch:");
      //////////////////////////////////////////////////////////////////////////////////////////////
    
      draw_sprite(buffer, Bild2, 34,27);  
    
      // Hier wird die Funktion aufgerufen und mit if abgefragt ob diese bereits  ausgeführt wurde, wenn nicht führe sie aus.
      if (!fertig)
        {
        Eingabe(font,"Bitte geben Sie Ihren Namen ein: ",0,0, makecol(0, 0, 255),  -1, Name);
        // Variable wird auf wahr gesetzt, sodass es nicht wieder ausgeführt wird beim erneuten Durchlauf der while Schleife  ;)
        done = true;
        }
    
      textprintf_ex(buffer, font, 405, 80, makecol(0, 0, 0), makecol(51, 204, 204), "Eisbegonie");
    
    // Blit Funktion zum Zeichnen auf den Bildschirm
       blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
     }
    
     destroy_bitmap(Bild1);
     destroy_bitmap(Bild2);
     //destroy_bitmap(Bild3);
     //destroy_bitmap(Bild4);
     destroy_bitmap(buffer);
     return 0;
    }
    END_OF_MAIN();
    

Anmelden zum Antworten