Allegro - im spiel was schreiben und wieder löschen ... wie ???



  • Hallo;)
    ich schreibe gerade an ein spiel und will folgendes machen:

    wenn man im spiel auf C drückt (weils anders nicht machbar ist)
    soll man in einer "gemalten" konsole was eingeben können.
    das tuts auch soweit aber wenn man "c" drückt steht in der konsole" befehl: c" und ich kann das eingegebende nicht mit
    backspace löschen - drück ich backspace ist alles aufenmal schwartz

    weil das irgentwie mit screen aus void eingabe und buffer aus void start_game zusammen hängt

    wenn man alles in start_game schreiben würde und über if(..key_c) macht dann tuts das wohl aber wenn man dann c drückt kackt das programm ab WARUM ???

    meine frage:

    - wie kann ich das trotzdem löschen ohne das alles verschwindet??
    - warum tuts meine text abfrage nicht ???

    - hier der code:

    #define ALLEGRO_USE_CONSOLE 1  // hab ich nach stunden ergoogelt für sprinf...
    #include <allegro.h>
    #include <winalleg.h>
    #include <stdio.h>
    
    bool main_is_running = false;
    bool title_is_running = false;
    bool game_is_running = false;
    
    int space_select = 0;
    int game_ini = 0;
    
    int ship_x = 400;
    int ship_y = 300;
    
    void load_cache();
    void start_title();
    void start_game();
    void Eingabe (FONT*,char*,int,int,int,int,char*);
    
    BITMAP *back1;
    BITMAP *title1;
    BITMAP *title2;
    BITMAP *ship;
    BITMAP *ship_off;
    BITMAP *inventar;
    BITMAP *buffer;
    
    int main() 
    {
     allegro_init();
     set_color_depth(32);
     set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);
    
     install_timer();
     install_keyboard();
     install_mouse();
     buffer = create_bitmap(800,600);
    
     load_cache();
     start_title();
    
     // FAIL XD //
     while(!main_is_running)
     {
      if(key[KEY_ESC])
      {
       main_is_running = true;
      }
    
     // FAIL XD ///
    
     }
     return 0;
    }
    END_OF_MAIN();
    
    void load_cache()
    {
     title1 = load_bitmap("bmp\\titel1.bmp",NULL); 
     title2 = load_bitmap("bmp\\titel2.bmp",NULL); 
     ship = load_bitmap("bmp\\ship.bmp",NULL); 
     ship_off = load_bitmap("bmp\\ship_off.bmp",NULL); 
     back1 = load_bitmap("bmp\\back1.bmp",NULL); 
     inventar = load_bitmap("bmp\\inventar.bmp",NULL); 
    }
    
    void start_title()
    {
     draw_sprite(screen,title1,0,0);
     Sleep(5000);
     clear_bitmap(screen);
     Sleep(2000);
     draw_sprite(screen,title2,0,0);
    
     while(!title_is_running)
     {
      if(key[KEY_SPACE])
      {
       space_select = 1;                 
      }
    
      if(space_select == 1)
      {
       space_select == 0;               
       clear_bitmap(screen);
       Sleep(2000); 
       start_game();
       title_is_running = true;      
      }                
     }
    }
    
    void start_game()
    {
     char Name[15];
    
     while(!key[KEY_ESC])
     {   
      clear(buffer);
    
      draw_sprite(buffer,back1,0,0);
      draw_sprite(buffer,inventar,0,0);
    
      draw_sprite(buffer,ship_off,ship_x,ship_y);
    
      blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
    
      if(key[KEY_C])
      {
        Eingabe(font,"Befehl:",0,0, makecol(0, 0, 255), -1, Name);
      }
    
      if (Name == "test")
      {
       Beep(600,300);        
      }
     /*
    
      if(key[KEY_UP])
      {
       ship_y --;
      }                   
    
      if(key[KEY_DOWN])
      {
       ship_y ++;
      }
    
      if(key[KEY_LEFT])
      {
       ship_x --;
      }
    
      if(key[KEY_RIGHT])
      {
       ship_x ++;
      }
     */
    
    }
    }
    
    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);
    }
    

    und alles mal wieder in allegro 4.2.2 , weil ich mit dev c++ arbeite und allgro 5.0 nicht downloadbar ist in der upgrade liste (..ist nen anderes thema)

    were trotzdem dankbar für hilfe



  • @all !!!

    die text eingabe hab ich von c-programmieren.com aber viele samples funktionieren aufgrund falscher header,grosskleinschreibfehler und libs nicht
    genau wie mit der sprint geschichte -.-



  • Hallo,

    also hab nur mal kurz rüber geguckt, schau dir mal Zeile 166 an.

    clear_bitmap(screen);

    Also sieht sehr verdächtig aus und deshalb wird der Screen schwarz, da er gelöscht wird 😃

    Gruß Christopher



  • ja und bei buffer passirt nichts weil nur die start_game dopple buffer hat



  • habs hinbekommen !!!
    so gehts 😉

    void start_game()
    {
    
     string edittext;
     string::iterator iter = edittext.begin(); // string iterator
    
     int     caret  = 0;                       // tracks the text caret
     int     print_me = 0;
     bool    insert = true;                    // true if text should be inserted
    
     while(!key[KEY_ESC])
     {   
      clear(buffer);
    
      draw_sprite(buffer,back1,0,0);
      draw_sprite(buffer,inventar,0,0);
    
      draw_sprite(buffer,ship_off,ship_x,ship_y);
    
      ///////////////////////////////////////////////////////
      if(key[KEY_C])
      {
       print_me = 1;             
      }  
    
      if(print_me == 1)
      {
       while(keypressed())
        {
        int  newkey   = readkey();
        char ASCII    = newkey & 0xff;
        char scancode = newkey >> 8;
    
        if(ASCII >= 32 && ASCII <= 126)
        {
         if(insert || iter == edittext.end())
         iter = edittext.insert(iter, ASCII);
         else
         edittext.replace(caret,1,1, ASCII);
         caret++;
         iter++;
        }
    
        else
        switch(scancode)
        {
        case KEY_DEL:
        if(iter != edittext.end()) iter = edittext.erase(iter);
        break;
    
        case KEY_BACKSPACE:
        if(iter != edittext.begin())
        {
        caret--;
        iter--;
        iter = edittext.erase(iter);
        }
    
        break;      
        case KEY_INSERT:
        insert = !insert;
        break;
    
        default:
        break;
       }
      }
    
      textout(buffer, font,edittext.c_str(),575,530, WHITE);
    
      }
    
      blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
     /////////////////////////////////////////////////////////
    
     }
    }
    


  • upps ... es fehlt noch: [cpp]#include <string>[cpp] 🕶



  • jetzt muss ich nur noch wissen wie die ausgabe mit enter wieder beendet und
    das was man geschrieben hat abfragt

    so in etwa

    if (eingeben == "test")
    {
     Beep(600,300);
    }
    

    kann mir jemand helfen ??? 😃


Anmelden zum Antworten