2012-04-12 10 views
1

Ich bin ein Spiel und ich benutze Java Swing. Und im Moment versuche ich, die KeyListeners und Action-Zuhörer zum Arbeiten zu bringen.Keylisteners/Actionlisteners mit Timer funktioniert nicht richtig

Was ich versuche zu tun ist, um mein Objekt zu verschieben, je nachdem, welchen Schlüssel ich drücke. (Links, Rechts, Hoch, Runter), Aber aus irgendeinem Grund passiert nichts, wenn ich eine dieser Tasten drücke, aber wenn ich 3 gleichzeitig drücke. das Objekt befindet sich auf der linken Seite seltsam bewegt ..

Also mein Code hier ist für die Klasse die Runner-Objekt zu erstellen:

import java.awt.*; 


public class Runner{ 
    private int xpos, ypos, base, side; 

    public Runner(int b, int h) { 
     base = b; 
     side = h; 
    } 
    public void setPosition(int x, int y){ 
     xpos = x; 
     ypos = y; 
    } 
    public void view(Graphics g) { 
     int x[] = { xpos, xpos-base/2, xpos + base/2}; 
     int y[] = { ypos, ypos + side, ypos + side }; 
     g.setColor(Color.lightGray); 
     g.fillPolygon(x, y, 3); 
     g.setColor(Color.darkGray); 
     g.drawLine(xpos, ypos, xpos, ypos + side); 
    } 
    public void shoot(Graphics g){ 
     g.setColor(Color.red); 
     g.drawLine(xpos,ypos, xpos, 0); 
    } 
} 

Und hier ist der Code, um das verdammte Ding laufen annehmen thats,:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 


public class RunningGame extends JPanel implements KeyListener, ActionListener{ 
    Runner rs; 
    int x,y; 
    Timer t; 
    boolean shot = false; 
    boolean left = false, right = false, up = false, down = false; 

    public RunningGame() { 
     x = 100; 
     y = 150; 
     rs = new Runner(40,60); 
     rs.setPosition(x,y); 
     this.addKeyListener(this); 
     this.setBackground(Color.black); 
     t = new Timer(40, this); 
     t.start(); 
    } 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     rs.view(g); 
     if(shot) rs.shoot(g); 
    } 
    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == 37) {left = true;} 
     if (e.getKeyCode() == 39) {right = true;} 
     if (e.getKeyCode() == 38) {up = true;} 
     if (e.getKeyCode() == 40) {down = true;} 
     if (e.getKeyCode() == 32) {shot = true;} 

     rs.setPosition(x,y); 
     this.repaint(); 
} 
    public void keyReleased(KeyEvent e){ 
     if (e.getKeyCode() == 37) left = false; 
     if (e.getKeyCode() == 39) right = false; 
     if (e.getKeyCode() == 38) up = false; 
     if (e.getKeyCode() == 40) down = false; 
     if (e.getKeyCode() == 32) shot = false; 
     this.repaint(); 
    } 
public void keyTyped(KeyEvent e){} 
    public void actionPerformed(ActionEvent e) { 
     if (left) { 
      if(right){ 
       right = false; 
       x = x - 10; shot = false; 
      } 
     } 
     if (right) { 
      if(left){ 
      left = false; 
      x = x + 10; shot = false; 
      } 
     } 
     if (up) { 
      if(down){ 
       down = false; 
       y = y - 10; shot = false; 
      } 
     } 
     if (down) { 
      if(up){ 
       up = false; 
       y = y + 10; shot = false; 
      } 
     } 
     rs.setPosition(x,y); 
     this.repaint(); 
} 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(300, 300); f.setLocation(100,100); 
     f.setTitle("Running"); 
     RunningGame p = new RunningGame(); 
     f.add(p); f.setVisible(true); 
     p.requestFocus(); 

    } 
} 

(Dies ist nicht der endgültige Code es ist nur ein Beispiel mit einem Raumschiff schiff~~POS=HEADCOMP mit, später werde ich ein anderes Objekt verwenden, will einfach nur testen sie die KeyListener und Action so dass es, bevor sie fortfahren funktioniert.)

Wie kann mir jemand helfen, das Raumschiff reibungslos zu bewegen? und ohne alle Schlüssel loslassen zu müssen, um einen anderen zu aktivieren? Wenn ich nach links halte, möchte ich, dass es einen anderen Knopf drücken kann. Wenn ich also nach rechts drücke, wird sich das Raumschiff stattdessen in diese Richtung bewegen.

// MrElephants

+1

Wenn Sie nur vier Schlüssel verwenden, dann müssen Sie [KeyBinding] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) statt KeyListeners –

+0

Ich werde Ich schlage vor, dass Sie sich [meine Antwort auf eine ähnliche Frage] ansehen (http://stackoverflow.com/a/10077580/544963). Wenn das nicht genug ist, lass es mich wissen und ich werde dir helfen. :) – fireshadow52

Antwort

2

In den Blöcken, wie folgt aussehen:

if (left) { 
    if(right){ 
     right = false; 
     x = x - 10; shot = false; 
    } 
} 

ich glaube, Sie x = x - 10; außerhalb des zweiten if haben sollte:

if (left) { 
    if(right){ 
     right = false; 
     shot = false; 
    } 
    x = x - 10; 
} 

obwohl ich bin nicht wirklich sicher Was für das Innere if ist, vielleicht sollten Sie es vollständig entfernen (aber behalten Sie die x - = 10 usw.). Dies sollte ausreichen, um die Bewegung natürlich erscheinen zu lassen.

+1

+1, scheint wie das, was Sie vorgeschlagen haben, muss funktionieren :-) –

+0

Oh danke! :) Ich habe gerade getan was du gesagt hast und es hat perfekt funktioniert! Und jetzt, wo du es erwähnt hast, hat es vollkommen Sinn gemacht, so muss es sein. – MrElephants

+0

Oh, und das innere 'if' sollte so sein, dass, wenn ich den entgegengesetzten Knopf zu dem halte, den ich halte (zum Beispiel Links und Rechts), das Schiff nicht einfach anhalten würde, sondern anfangen würde, in das andere zu gehen Weise stattdessen. Aber wenn du einen besseren Weg weißt, würde ich mich freuen, es zu hören :) weil ich darüber nachgedacht habe, wie man das richtig macht! – MrElephants