[SDL] 2 Events gleichzeitig abfangen



  • Hallo,
    ich bin gerade dabei, einen Pong-Clone mit SDL zu schreiben. Nun habe ich mir gedacht, dass Spieler 1 [w] zum hochfahren des Balkens und [s] zum runterfahren des Balkens benutzt. Spieler 2 das Gleiche mit [Pfeil nach oben] und [Pfeil nach unten].
    Nun, da beide Spieler ihre Balken auch gleichzeitig bewegen müssen gibt es ein Problemchen. Wenn sagen wir Spieler 1 [w] gedrückt hält um nach oben zu sausen muss Spieler 2 auch gleichzeitig mit z.B. [Pfeil nach unten] nach unten fahren können. Nur wenn beide die Tasten drücken und halten wird der "Erste Drücker" blockiert durch den "Zweiten Drücker" und dessen Balken wird dann bewegt...

    Nur ist jetzt die Frage, wie kann ich dieses Problem lösen?
    Das einzige was mir gerade einfällt, sind Threads, aber da habe ich gar keinen Plan von, wie ich das mit dem Abfangen von Events verbinden soll...
    Hoffe ihr habt ein paar (andere) Ideen 🙂

    Gruß Speedy_92



  • Hi, warum machst das nicht so?
    Bevor du das ganze auf den screen schickst wird doch erst alles durchlaufen. Ich hatte bei meinem 2Player Pong so keine Probleme gehabt. Klappt alles wunderbar.

    if ( event.type == SDL_KEYDOWN )
    {
    	if ( event.key.keysym.sym == SDLK_w )
    	{
    		Spieler1.move();
    	}
    	if ( event.key.keysym.sym == SDLK_UP )
    	{
    		Spieler2.move();
    	}
    }
    


  • Danke, aber so mache ich das auch, jedenfalls so ähnlich 🙂

    //symbol ist halt die Taste
    //Dann noch abfragen, damit man nicht über den Rand hinaus geht
    //Dann wird auch der Wert gesetzt, bevor es gezeichnet wird
    switch(symbol)
    	{
    	case SDLK_w:
    		{
    			if(panel1.GetUp() - 1 >= 0)
    			{
    				panel1.SetUp(panel1.GetUp() - 1);
    				panel1.SetDown(panel1.GetDown() - 1);
    			}
    			break;
    		}
    
    	case SDLK_s:
    		{
    			if(panel1.GetDown() + 1 <= 600)
    			{
    				panel1.SetUp(panel1.GetUp() + 1);
    				panel1.SetDown(panel1.GetDown() + 1);
    			}
    			break;
    		}
    
    	case SDLK_UP:
    		{
    			if(panel2.GetUp() - 1 >= 0)
    			{
    				panel2.SetUp(panel2.GetUp() - 1);
    				panel2.SetDown(panel2.GetDown() - 1);
    			}
    			break;
    		}
    
    	case SDLK_DOWN:
    		{
    			if(panel2.GetDown() + 1 <= 600)
    			{
    				panel2.SetUp(panel2.GetUp() + 1);
    				panel2.SetDown(panel2.GetDown() + 1);
    			}
    			break;
    		}
    	}
    


  • Niemand eine Idee?



  • Klingt nach einem Problem durch's KeyRepeat. Naeheres hier.



  • hellihjb schrieb:

    Klingt nach einem Problem durch's KeyRepeat. Naeheres hier.

    Vielen Dank.
    Aber das dumme ist, dass ich KeyRepeat eigentlich brauche... Oder gibt es eine Möglichkeit, die Tasten ohne KeyRepeat zu wiederholen? Weil ich kann es dem Benutzer ja nicht zumuten, immer wieder auf die Tasten zu hauen 😉
    Da hat man doch nach spätestens einer Runde keine Lust mehr 😃



  • Du solltest lediglich das "SDL_KEYDOWN" registrieren und nimmst die Taste dann so lange als gedrueckt an bis ein "SDL_KEYUP" kommt.



  • hellihjb schrieb:

    Du solltest lediglich das "SDL_KEYDOWN" registrieren und nimmst die Taste dann so lange als gedrueckt an bis ein "SDL_KEYUP" kommt.

    Das klingt sehr gut. Ich werde mich mal ranmachen 🙂
    Soll ich das mit dem "gedrückt halten bis SDL_KEYUP" so machen, dass ich so lange Nachrichten des Typs "SDL_KEYDOWN" an mein Programm sende, bis "SDL_KEYUP" gesendet wird?
    Aber was meinst du mit "registrieren"?



  • Soll ich das mit dem "gedrückt halten bis SDL_KEYUP" so machen, dass ich so lange Nachrichten des Typs "SDL_KEYDOWN" an mein Programm sende, bis "SDL_KEYUP" gesendet wird?

    Das wuerde ueberhaupt keinen Sinn machen weil Du ja schon weisst, dass die Taste gedrueckt wurde. Setze im Event-Handler einfach ein Flag, pruefe dann pro Frame ob die Taste gedrueckt ist und bewege die Spielfigur entsprechend der vergangenen Zeit weiter.
    Die Steuerung wird dabei heikel wenn die Framerate extrem sinkt (bei Pong nicht zu erwarten).



  • hellihjb schrieb:

    Soll ich das mit dem "gedrückt halten bis SDL_KEYUP" so machen, dass ich so lange Nachrichten des Typs "SDL_KEYDOWN" an mein Programm sende, bis "SDL_KEYUP" gesendet wird?

    Das wuerde ueberhaupt keinen Sinn machen weil Du ja schon weisst, dass die Taste gedrueckt wurde. Setze im Event-Handler einfach ein Flag, pruefe dann pro Frame ob die Taste gedrueckt ist und bewege die Spielfigur entsprechend der vergangenen Zeit weiter.
    Die Steuerung wird dabei heikel wenn die Framerate extrem sinkt (bei Pong nicht zu erwarten).

    Ok... das wäre eine Möglichkeit. Aber weißt du zufällig, wie es andere Spiele machen? Mittels Threads?
    Weil bei Spielen wie WOW würde die Steuerung dann doch nicht mehr so konstant funktionieren.


Anmelden zum Antworten