Frage zu keyPressEvent

Alles rund um die Programmierung mit Qt
Antworten
mgah
Beiträge: 2
Registriert: 17. August 2011 22:10

Frage zu keyPressEvent

Beitrag von mgah »

Hallo,
hab mich extra hier angemeldet, weil ich nirgendwo eine Antwort finden konnte.
Ich programmiere gerade ein "Rennspiel", um mir qt beizubringen. Man sieht die ganze rennstrecke von oben und versucht ein auto durchzulenken ohne von der strecke abzukommen.
Die Geschwindigkeit soll dabei erst mal konstant und vorgegeben sein. Das funktioniert auch alles schon erstaunlich gut. Allerdings soll man auch gegeneinander fahren können, dabei soll der eine fahrer mit den tasten A&D lenken und der andere mit den Pfeiltasten.
Das erste Problem ist jetzt, dass ich nur eine taste gleichzeitig bearbeiten kann. das heisst wenn spieler eins nach links lenkt (Taste A gedrückt hält) kann spieler 2 auf der Tastatur rumdrücken wie er will, er fährt geradeaus.
das zweite Problem ist, dass das auto beim einlenken erst nur ganz wenig und dann verzögert einlenkt (weil erst ein tastendrück registriert wird und dann erst verzögert, dass die taste gedrückt gehalten wird).

Die Funktion keyPressEvent sieht bei mir so aus (richtung und richtung2 sind die ausrichtung der autos im bogenmaß) :

Code: Alles auswählen

void Zeichnen::keyPressEvent(QKeyEvent *event){
	if (event->key() == Qt::Key_Right) {
    	        richtung=richtung+0.07;
	}
	if (event->key() == Qt::Key_Left) {
    	        richtung=richtung-0.07;
	}

	if (event->key() == Qt::Key_D) {
    	        richtung2=richtung2+0.07;
	}
	if (event->key() == Qt::Key_A) {
    	        richtung2=richtung2-0.07;
	}
}
würd mich über tipps die mir helfen die beiden beschriebenen probleme zu lösen sehr freuen :)
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Re: Frage zu keyPressEvent

Beitrag von upsala »

Normalerweise setzt man in einem keyPressEvent ein Flag, daß eine bestimmte Taste gedrückt wurde und in einem keyReleaseEvent löscht man dieses Flag wieder. Außerdem lässt man einen QTimer laufen, in dem diese Flags ausgewertet werden.
mgah
Beiträge: 2
Registriert: 17. August 2011 22:10

Re: Frage zu keyPressEvent

Beitrag von mgah »

so ne einfache und elegante lösung die beide probleme löst hätte ich jetzt nicht erwartet, danke.
ärgerlich, dass ich nicht selber drauf gekommen bin...

ich poste mal meine (deine) lösung falls es jemanden interessiert und weil es so schön ist :) :

Code: Alles auswählen

void Zeichnen::keyPressEvent(QKeyEvent *event){
	if (event->key() == Qt::Key_Right) {
    	rechts2=true;
	}
	if (event->key() == Qt::Key_Left) {
    	links2=true;
	}

	if (event->key() == Qt::Key_D) {
    	rechts=true;
	}
	if (event->key() == Qt::Key_A) {
    	links=true;
	}
}

Code: Alles auswählen

void Zeichnen::keyReleaseEvent(QKeyEvent * event){
	if (event->key() == Qt::Key_Right) {
    	rechts2=false;
	}
	if (event->key() == Qt::Key_Left) {
    	links2=false;
	}

	if (event->key() == Qt::Key_D) {
    	rechts=false;
	}
	if (event->key() == Qt::Key_A) {
    	links=false;
	}
}
im konstruktor:

Code: Alles auswählen

...
timer = new QTimer();
timer->start(35);
QObject::connect(timer, SIGNAL(timeout()), this, SLOT(richtungaender()));
...

Code: Alles auswählen

void Zeichnen::richtungaender(){
	if(links){
		richtung=richtung-0.05;
	}
	if(rechts){
		richtung=richtung+0.05;
	}
	if(links2){
		richtung2=richtung2-0.05;
	}
	if(rechts2){
		richtung2=richtung2+0.05;
	}
}
Antworten