2009-07-15 7 views
1

Ich lehre mich selbst, aus Online-Tutorials, wie man Spiele in Java schreibt. Ich verwende Java Applets, um ein Pong-Spiel zu erstellen. Jedes Paddel wird von verschiedenen Tasten für 1v1 Wettbewerb gesteuert. Dies funktioniert, wenn beide Benutzer die Tasten zu unterschiedlichen Zeiten drücken. Wenn jedoch eine Taste gedrückt gehalten wird und dann eine andere Taste gedrückt gehalten wird (zB: Halten Sie die Pfeiltaste gedrückt, dann hält Benutzer 2 die Taste "S" gedrückt), die zweite Taste überschreibt die erste und die erste Taste stoppt die Bewegung. Ich vermute, dass ich Threads verwenden muss, aber ich weiß nicht viel über sie und ich habe Probleme zu verstehen, wie man sie benutzt/implementiert. Wie würde ich den Fall behandeln, wenn zwei (oder mehr) Schlüssel gedrückt werden?Wie verarbeite ich mehrere Tastendrücke in einem Java Applet?

Bonus: Wie ich schon sagte, weiß ich nicht viel über Threads - ich nehme an, ich brauche auch einen für den Ball/Puck, der sich bewegt, während alles andere vor sich geht. Ist das richtig und wenn ja, wie lege ich einen Thread auf etwas, das keine Eingabe benötigt?

Dank für das Ihnen helfen, DJ

Antwort

3

Was Sie normalerweise tun, ist den Zustand jedes Tastendrucks zu erinnern.

Sie behalten ein Array Ihrer Aktionen (oder ein Array aller Schlüssel, wenn Sie möchten). Ein keyDown-Ereignis führt z.B.

boolean actions[12];... 
... 

public boolean keyDown(Event e, int key) { 
if (key == 'a') { 
    actions[ACTION_LEFT] = true; 
    } 
.. 
} 

Und Sie müssen das keyup-Ereignis abfangen und die Aktionen auf false setzen, wenn die Schlüssel losgelassen werden.

In der Bewegung Logik können Sie überprüfen, nur die Zustände der Tastenanschläge

if(actions[ACTION_LEFT] == true) 
    moveLeft(); 
if(actions[ACTION_RIGTH] == true) 
    moveRight(); 
+1

Kombinieren Sie dies mit Lou Francos Antwort über eine Spieleschleife. Das Überprüfen der Zustände der Tasten drückt sich in dieser Schleife ab. – Ricket

+0

Danke! Diese Lösung hat für mich funktioniert. – Daniel

3

Regel statt Threads verwenden, um Spiele etwas das Spiel Schleife (Google es) genannt.

http://en.wikipedia.org/wiki/Game_programming

Die Grundidee ist

Loop 
    Get all inputs 
    Get game clock 
    Update state based on clock and inputs 
    Update Display 
    Limit frame rate if you need to 

Wie dem auch sei - statt Tastatur-Ereignisse zu bekommen - Sie den Zustand an bestimmten Punkten der Tastatur überprüfen. Dieser Code scheint es für Java zu tun

http://www.gamedev.net/reference/articles/article2439.asp

Es verwendet, um Ereignisse Variablen setzen Sie in Ihrer Schleife zu sehen.

+0

Vielen Dank für Ihre Eingabe. Ich hatte noch nie von der "Game Loop" gehört. Dieser zweite Link ist großartig. Danke noch einmal! – Daniel

+0

diese Antwort kombiniert mit Nein hat mir nur eine Menge Kopfschmerzen und Zeit gespart. Vielen Dank!!! – svarog

0

Wenn ich mich nicht irre, stehen Ihnen die Methoden keyUp() und keyDown() mit Applet zur Verfügung. Haben Sie versucht, ein Flag auf keyDown zu setzen und es dann auf keyUp zu deaktivieren? Zum Beispiel:

public boolean keyDown(Event e, int key) 
    { 
     if (key == 'a') { 
     player1.go("left") 
     } 
    } 

    public boolean keyUp(Event e, int key) 
    { 
     if (key == 'a') { 
     player1.stop("left") 
     } 
    } 

Nur eine Idee. Ich bin mir sicher, dass es einen normalen Weg gibt, damit umzugehen.

0

Sie Swing Timer regelmäßig Bewegungsereignisse zwischen einem keydown/keyup Ereignis ausgelöst nutzen könnten, um.

+0

Danke für Ihre Eingabe. – Daniel

1

Nur für den Fall, dass jemand sehen wollte, wie ich diese Frage beantwortet habe. Mein keyDown() und keyUp() -Methode wie folgt:

public boolean keyDown(Event e, int key) 
{ 
     message = key + "pressed"; 

     //right paddle 
     if(key == 1005) 
     { 
      rpaddle_up = true; 
     } 
     if(key == 1004) 
     { 
      rpaddle_down = true; 
     } 

     //left paddle 
     if(key == 115) 
     { 
      lpaddle_up= true; 
     } 
     if(key == 119) 
     { 
      lpaddle_down=true; 
     } 

     //x key = exit 
     if(key == 'x') 
      System.exit(0); 
     return true;   
    } 

public boolean keyUp(Event e, int key) 
    { 
     //right paddle 
     if(key == 1005) 
     { 
      rpaddle_up = false; 
     } 
     if(key == 1004) 
     { 
      rpaddle_down = false; 
     } 

     //left paddle 
     if(key == 115) 
     { 
      lpaddle_up= false; 
     } 
     if(key == 119) 
     { 
      lpaddle_down=false; 
     } 
     return true; 
    } 

Hoffentlich, wenn jemand das gleiche Problem hat diese ihnen helfen. Und danke allen für Ihre Anregungen und Hilfe.