SDL Tastendrücke



  • Hallo!

    Bei dem hier bereits genannten Spiel(anfang) versuche ich jetzt, einzelne Tastendrücke abzufragen und dann die Spieler dementsprechend zu bewegen.

    Die Hauptschleife ist jetzt wie folgt:

    ende=false;
    while (false==ende)
    {     
          while (SDL_PollEvent(&ereigniss))
          {
                if (ereigniss.type==SDL_QUIT){exit(0);}      
                if (ereigniss.type==SDL_KEYDOWN){
                         switch (ereigniss.key.keysym.sym)
                         {
                                case SDLK_ESCAPE :exit(0);
                                case SDLK_DOWN :tasten[1]=1;
                                case SDLK_UP   :tasten[2]=1;
                                case SDLK_LEFT :tasten[3]=1;
                                case SDLK_RIGHT:tasten[4]=1;
                                case SDLK_SPACE:tasten[5]=1;
                                case SDLK_w: tasten[7]=1;
                                case SDLK_s: tasten[8]=1;
                                case SDLK_a: tasten[9]=1;
                                case SDLK_d: tasten[10]=1;
                                case SDLK_f: tasten[11]=1;
                           }
                         } 
                if (ereigniss.type==SDL_KEYUP){
                         switch (ereigniss.key.keysym.sym)
                         {
                                case SDLK_DOWN :tasten[1]=0;
                                case SDLK_UP   :tasten[2]=0;
                                case SDLK_LEFT :tasten[3]=0;
                                case SDLK_RIGHT:tasten[4]=0;
                                case SDLK_SPACE:tasten[5]=0;
                                case SDLK_w: tasten[7]=0;
                                case SDLK_s: tasten[8]=0;
                                case SDLK_a: tasten[9]=0;
                                case SDLK_d: tasten[10]=0;
                                case SDLK_f: tasten[11]=0;
                           }
                } 
          }
          SDL_FillRect(bildschirm, NULL, SDL_MapRGB(bildschirm->format, 1,1,255));                 
    
          if (1==tasten[1]){spieler[0]->ybesch+=1;}     
          if (1==tasten[2]){spieler[0]->ybesch-=1;}  
          if (1==tasten[3]){spieler[0]->xbesch-=1;}     
          if (1==tasten[4]){spieler[0]->xbesch+=1;}     
    
          if (1==tasten[7]) {spieler[1]->ybesch-=1;}     
          if (1==tasten[8]) {spieler[1]->ybesch+=1;}  
          if (1==tasten[9]) {spieler[1]->xbesch-=1;}     
          if (1==tasten[10]){spieler[1]->xbesch+=1;}  
    
          spieler[0]->posberechnen();
          spieler[1]->posberechnen();
    
          spieler[0]->anzeige();
          spieler[1]->anzeige();
    
          SDL_Flip(bildschirm);
          SDL_Delay(20);
          }
    

    Jedoch funktioniert die Bewegung nur sehr schlecht, d.h. nach rechts funktioniert es so gut wie gar nicht, und so etwas. Woran liegt das?



  • Nach jedem case musst du ein break einfügen. Sonst werden die folgenden cases auch abgeklappert.

    ende=false;
    while (false==ende)
    {     
          while (SDL_PollEvent(&ereigniss))
          {
                if (ereigniss.type==SDL_QUIT){exit(0);}      
                if (ereigniss.type==SDL_KEYDOWN){
                         switch (ereigniss.key.keysym.sym)
                         {
                                case SDLK_ESCAPE :exit(0); break;
                                case SDLK_DOWN :tasten[1]=1; break;
                                case SDLK_UP   :tasten[2]=1; break;
                                case SDLK_LEFT :tasten[3]=1; break;
                                case SDLK_RIGHT:tasten[4]=1; break;
                                case SDLK_SPACE:tasten[5]=1; break;
                                case SDLK_w: tasten[7]=1; break;
                                case SDLK_s: tasten[8]=1; break;
                                case SDLK_a: tasten[9]=1; break;
                                case SDLK_d: tasten[10]=1; break;
                                case SDLK_f: tasten[11]=1; break;
                           }
                         } 
                if (ereigniss.type==SDL_KEYUP){
                         switch (ereigniss.key.keysym.sym)
                         {
                                case SDLK_DOWN :tasten[1]=0; break;
                                case SDLK_UP   :tasten[2]=0; break;
                                case SDLK_LEFT :tasten[3]=0; break;
                                case SDLK_RIGHT:tasten[4]=0; break;
                                case SDLK_SPACE:tasten[5]=0; break;
                                case SDLK_w: tasten[7]=0; break;
                                case SDLK_s: tasten[8]=0; break;
                                case SDLK_a: tasten[9]=0; break;
                                case SDLK_d: tasten[10]=0; break;
                                case SDLK_f: tasten[11]=0; break;
                           }
                } 
          }
          SDL_FillRect(bildschirm, NULL, SDL_MapRGB(bildschirm->format, 1,1,255));                 
    
          if (1==tasten[1]){spieler[0]->ybesch+=1;}     
          if (1==tasten[2]){spieler[0]->ybesch-=1;}  
          if (1==tasten[3]){spieler[0]->xbesch-=1;}     
          if (1==tasten[4]){spieler[0]->xbesch+=1;}     
    
          if (1==tasten[7]) {spieler[1]->ybesch-=1;}     
          if (1==tasten[8]) {spieler[1]->ybesch+=1;}  
          if (1==tasten[9]) {spieler[1]->xbesch-=1;}     
          if (1==tasten[10]){spieler[1]->xbesch+=1;}  
    
          spieler[0]->posberechnen();
          spieler[1]->posberechnen();
    
          spieler[0]->anzeige();
          spieler[1]->anzeige();
    
          SDL_Flip(bildschirm);
          SDL_Delay(20);
          }
    


  • Danke, jetzt gehts 🙂


Anmelden zum Antworten