Autor Beitrag
~Nemo~
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 28.11.07 14:08 
Und zwar sollen wir in Info ein Projekt machen und wir haben uns dazu entschlossen das PingPong-Spiel zu machen und dabei gibt es folgendes Problem:

Wenn man W oder S bzw. Up oder Down drückt, sollen sich die jeweiligen Schläger nach oben bzw. unten bewgen (ist für 2 Spieler) - und zwar auch gleichzeitig, falls beide Spieler etwas drücken möchten. Zur Zeit würden wir es nur mit Zustandstasten hinkriegen, oder dass man eben nur eine Taste gleichzeitig drücken kann, aber das kann doch nicht alles sein was geht^^

Also wir habens zur Zeit so:

if(e.KeyData==Keys.W)
{
Hier drin steht dann die Bewegung des Schlägers und das erneute malen des Spielfeldes.
}

Aber damit kann man nun wie gesagt immer nur einen Schläger gleichzeitig steuern.

Kann mal jemand sgaen, wie das gehen würde und ein Codebeispiel angeben?

Das wär echt nett, weil dann hätten wir im Prinzip das letzte noch bedeutende Problem in unserem Programm gelöst :D

mfg

Nemo
golgol
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 58

Win XP Prof. / Linux
C# (VS 2005)
BeitragVerfasst: Mi 28.11.07 16:44 
Also so sollte das klappen (hab grade keinen Compiler oder so zur Hand):

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
bool wPressed = false;
bool sPressed = false;
...
this.KeyDown += new KeyEventHandler(myKeyDown);
this.KeyUp += new KeyEventHandler(myKeyUp);
...


Und dann

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
public void myKeyDown(Object sender, KeyEventArgs e) {
  if(e.KeyData == Keys.W) {
    wPressed = true;
  }
  // analog für 'S'
}


sowie

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
public void myKeyUp(Object sender, KeyEventArgs e) {
  if(e.KeyData == Keys.W) {
    wPressed = false;
  }
  // analog für 'S'
}


Bei neu Zeichnen müsstest du dann halt nur die beiden boolschen Variablen abfragen, um zu ermitteln, ob derzeit eine Bewegung erwünscht ist oder nicht. Ist wahrscheinlich nicht die eleganteste Variante aber sollte klappen.
~Nemo~ Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 28.11.07 17:48 
Ok danke erstmal.

Ich meinte mit Up und Down die Pfeiltasten. Ich weiß jetzt nicht ob du das auch so verstanden hast oder nicht, weil ich mit meinen Kenntnissen deine Codebeispiele nicht ganz nachvollziehen kann^^
Aber ich glaub du hast es falsch verstanden.
Und zwar haben wir das alles mit KeyDown gemacht. Wenn man zB W drückt, dann bewegt sich der linke Schläger. Wenn man dann "Hoch" drückt, bewegt sich nur der rechte und der andere nicht mehr.
Aber das soll eben auch gehen, wenn man beide Tasten gedrückt hält.
Deshalb kann ich mir nicht vorstellen, dass man da mit KeyUp arbeiten muss.

bool wPressed = false;
bool sPressed = false;
usw.

Das scheint jedenfalls ne rafinierte Sache zu sein, probier ich mal aus.
Auch wenn ich da nicht den Unterschied zu meinem sehe. Dort werden die Koordinaten direkt verändert und gemalt und bei dem von dir wird erstmal die Information übermittelt, ob die Taste gedrückt wurde oder nicht und dann gemalt.
golgol
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 58

Win XP Prof. / Linux
C# (VS 2005)
BeitragVerfasst: Do 29.11.07 09:37 
Also: Die beiden Variablen müssen Klassenvariablen sein. Die beiden Zuweisungen im ersten Code-Block (also die Delegate mit dem '+=' ) müssen z.B. im Constructor stehen. Das ganze läuft dann so ab:

Sobald du eine Taste drückst wird die Methode myKeyDown aufgerufen, so weit so gut. Das Problem ist nur, dass immer nur die zu letzt gedrückte Taste ermittelt wird. Drückst du beispielsweise das 'e', dann wird dieses so lange bei der Event-Abfrage im KeyEventArgs ausgegeben, bis du eine beliebige andere Taste auch noch gedrückt hältst, denn dann wird nurnoch die neue, also aktuellere Taste ausgegeben: Also genau deine Beobachtung. Die einzige Möglichkeit dieses zu umgehen ist, dass du dir jeweils den Stand der wichtigen Tasten merkst und beim Zeichnen entsprechend überprüfst. Damit das Programm aber mitbekommt, wenn du die Taste wieder losgelassen hast brauchst du zusätzlich die Methode myKeyUp, ansonsten würde der Zustand auf immer beibehalten werden.

Zu den Pfeiltasten: Die werden bei C# prinzipiell wie jede andere Taste behandelt - also anders als z.B. bei OpenGL. Du kannst sie mit 'Keys.Up', 'Keys.Right' usw. abfragen.
~Nemo~ Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 29.11.07 12:25 
Ah vielen Dank jetzt hab ichs verstanden.

Und dann müsste ich dann im Prinzip nur fragen, ob wPressed richtig oder falsch ist und dem entsprechend dann die Koordinatenänderung und die Neuzeichnung machen.

Da klicke ich jetzt mal Frage beantwortet an :)