SDL Events passen nicht zu SDLK_*



  • Hi ich hab folgendes Problem: Bei mir scheint das Event.type bei gedrückter Taste nicht mit dem SDLK_* davon zu übereinstimmen. Und das gilt für jede Taste.

    Erst schien das SDL_KEYUP der Eventtyp für jede Pfeiltaste zu sein, heißt wenn ich nach rechts, links oder unten(oder manchmal gar keine Taste) gedrückt hab, erkannte das Spiel jedes Mal die nach-oben-Taste.

    Jetzt hab ich mir mal das Event.type bei gedrückter rechts-Tase und SDLK_RIGHT ausgeben lassen und festgestellt dass sie nicht übereinstimmen.

    Ich prog auf WIN XP und Dev-CPP (5.2.0.3). Die Tastatur ist in Ordnung und hat nie Probleme gemacht.

    Der Tastenabfragcode(auch wenn aus meiner Sicht unnötig):

    if(SDL_PollEvent(&event)){
    switch (event.type){
    case SDL_QUIT:ende=1;break;
    case SDLK_RIGHT:player_move_right();break;
    case SDLK_LEFT:player_move_left();break;
    case SDLK_UP:player_move_up();break;
    case SDLK_DOWN:player_move_down();break;
    }

    [Ganz am Anfang steht noch SDL_Event event;]



  • Ohne mich mit SDL auszukennen...der event.type ist doch wohl eher ein Event-Typ und keine Taste.
    Okay, gerade gegoogelt. Anscheinend doch.

    Edit2: Nein, quatsch, war doch richtig. Das event ist z.B. SDL_KEYDOWN und dann musst du anschliessend die Taste abfragen.



  • Oh stimmt ich dachte SDL_KEYUP und SDL_KEYDOWN wär dasselbe wie SDLK_UP und SDLK_DOWN.

    Aber ich habs auch mit SDLK_DOWN und SDLK_UP probiert außerdem noch mit dem Rest der Pfeiltasten und den Buchstaben. Das alles scheint nicht mit dem jeweiligen event.type zu übereinstimmen. Dasselbe mit dem key.keysym.sym.



  • Hier mal ein wenig Skelett Code wie es funktioniert:

    bool left, right, up, down = false; //Wichtig, dass dürfen keine localen variablen sein, so dass sie bestehen bleiben bis du wieder zu dieser switch abfrage kommst
    
    //...
    
    switch( event.type )
    {
    	case SDL_KEYDOWN:
    	{
    		switch(event.key.keysym)
    		{
    			case SDLK_LEFT: left=true; break;
    			case SDLK_RIGHT: right=true; break;
    			case SDLK_UP: up=true; break;
    			case SDLK_DOWN: down=true; break;
    		}
    	case SDL_KEYUP:
    	{
    		switch(event.key.keysym)
    		{
    			case SDLK_LEFT: left=false; break;
    			case SDLK_RIGHT: right=false; break;
    			case SDLK_UP: up=false; break;
    			case SDLK_DOWN: down=false; break;
    		}
    	}
    }
    
    if (left) player_move_left();
    if (right) player_move_right();
    if (up) player_move_up();
    if (down) player_move_down();
    

    Wenn du nur einen "Zug" machen möchtest wenn die Taste einmal gedrückt wird muss etwas anders gemacht werden als in meinem Beispiel. Bin mir aber nicht sicher was genau passieren soll in deinem Programm.



  • CTMN, dir ist scheinbar nicht ganz klar das event.type und SDLK_* zwei VÖLLIG unterschiedliche Dinge sind, die eigentlich nichts miteinander zu tun haben und höchstens zufällig Überschneidungen aufweisen?
    Ein event.type == SDLK_irgendwas ist immer falsch.

    SDLK_UP identifiziert z.B. die nach-oben-Taste. SDL_KEYUP heißt hingegen eine (beliebige!) Taste hat sich nach oben bewegt, d.h. losgelassen. SDL_KEYDOWN heißt, eine Taste hat sich nach unten bewegt, d.h. wurde gedrückt.

    Es ist der Unterschied zwischen "eine Taste wurde nach unten gedrückt" und "die nach-unten-Taste"

    Mal Osbios code noch etwas erklären:

    switch( event.type ) //schauen welches event kommt
    {
        case SDL_KEYDOWN: //wenn das event ist, das eine Taste gedrückt wurde....
        {
            switch(event.key.keysym) //schau nach welche Taste es war, und setze einen Wert entsprechend
            {
                case SDLK_LEFT: left=true; break;
                case SDLK_RIGHT: right=true; break;
                case SDLK_UP: up=true; break;
                case SDLK_DOWN: down=true; break;
            }
        case SDL_KEYUP: //wenn eine Taste losgelassen wurde...
        {
            switch(event.key.keysym) //schau nach welche es war, und setze den Wert wieder auf false
            {
                case SDLK_LEFT: left=false; break;
                case SDLK_RIGHT: right=false; break;
                case SDLK_UP: up=false; break;
                case SDLK_DOWN: down=false; break;
            }
        }
    }
    

    Zu erwähnen bleibt, dass Osbios hier nur einen keystate nachbaut, das gibt's auch schon mit SDL_GetKeyState



  • Ich geb zu ich hab event.type und key.keysym.sym verwechselt.

    Aber ich habs auch so versucht wie ihr geschrieben habt und es hat immer noch net geklappt!

    Ich versuch jetzt mal einiges zu updaten, vielleicht wird es dann gehen.



  • So hab jetzt die SDL.dll geupdated. Es hat mit der alten dll nicht gestimmt, weil die alte viel kleiner war. Wahrscheinlich weil ich bisher immer mitm USB-Stick gearbeitet hab. Scheint abgenutzt zu sein(immer wenn ich was mit CHKDSK prüfe, zeigt es irgendeinne Datenverlust an). Ich hol mir jetzt ne externe Festplatte und arbeite damit.

    Problem gelöst; Thread kann geschlossen werden.


Log in to reply