2016-08-09 19 views
-1

Jetzt weiß ich, dass dieses Thema mehrmals angesprochen wurde, hier: Swing's KeyListener and multiple keys pressed at the same time, hier: How do I have multiple key inputs Listened to at the same time und hier: How do I handle simultaneous key presses in Java? zum Beispiel. Ich kann also nicht wirklich erwarten, dass ich anders Hilfe bekomme als in diesen Beispielen. Ich habe auch gelesen, dass die meisten von Ihnen vorschlagen, dass ich KeyBinding s anstelle von KeyListener s für die Situation, in der ich bin (siehe unten), die ich jetzt beschlossen habe, zu tun. Aber ich möchte immer noch wissen, ob ihr eine Ahnung habt, warum mein Code aufgeht.Java - KeyListener Mehrere Keys

Also die Situation, ich mache ein einfaches 2D-Spiel. Ich habe die Tutorials von New Boston verfolgt, um loszulegen und er empfahl KeyListener s. Sie haben bisher gut für mich gearbeitet, als ich auf einen ziemlich merkwürdigen Fehler stieß.

Das Problem ist, dass wenn ich mein Raumschiff nach links lenkt, es nicht schießen wird. Dies passiert nur in dieser bestimmten Richtung (von den acht möglichen) und auch wenn ich bereits schieße, kann ich mein Schiff nicht in die obere linke Ecke lenken.

Unten ist der Code, wo ich weiß, dass das Problem auftritt. Ich sehe wirklich keine gute Erklärung, warum, obwohl. Ich glaube wirklich, dass etwas falsch ist, wo mein Computer den Pfeil nach oben, den Pfeil nach links und die Leertaste nicht gleichzeitig drücken kann. Der ultimative Beweis dafür ist natürlich, dass der Code ohne Probleme läuft, wenn ich beispielsweise den Feuerknopf von der Leertaste auf F ändere.

//Imports 

public class SpaceGame extends Core implements KeyListener{ 
    public static void main (String[] args){ 
     SpaceGame sg = new SpaceGame(); 
     sg.init(); 
     sg.run(); 
    } 

    //Making all variables 
private ScreenManager s; 
private AffineTransform identityTransform; 
private Image bg; 
private Image[] shipImage = new Image[2]; 
private Image[] missileImage = new Image[2]; 
private String shipLocations[] = {/*IMAGE LOCATIONS*/}; 
private String missileLocations[] = {/*IMAGE LOCATIONS*/}; 
private Animation shipAnimation; 
private Animation missileAnimation; 
private Ship ship; 
private ArrayList<Shot> shotList = new ArrayList<Shot>(); 
private boolean shooting; 
private int shots = 0; 

    public void init(){ 
     //Makes image objects, animations and some other stuff. 
    } 

    //This is called from the core class which has a continously running while loop in it. 
    public void update(long timePassed){ 
     if(shooting){ 
      makeShot(); 
     } 
     ship.update(timePassed); 
     for(Shot shot : shotList){ 
      if(shot.getAlive()){ 
      shot.update(timePassed); 
     } 
    } 
} 

public void makeShot(){ 
    //Makes shots 
} 

public synchronized void draw(Graphics2D g, long time) { 
    Window w = s.getFullScreenWindow(); 
    w.setFocusTraversalKeysEnabled(false); 
    w.addKeyListener(this); 
    g.drawImage(bg, 0, 0, null); 
    for(Shot shot : shotList){ 
     if(shot.getAlive()){ 
      g.setTransform(shot.getTransform()); 
      g.drawImage(shot.getImage(), Math.round(shot.getCorsClone()[0]), Math.round(shot.getCorsClone()[1]), null); 
     } 
    } 
    g.setTransform(ship.getTransform()); 
    g.drawImage(ship.getImage(), Math.round(ship.getCorsClone()[0]), Math.round(ship.getCorsClone()[1]), null); 
    g.setTransform(identityTransform); 
} 


//Where the problem occurs 
public void keyPressed(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 
    if(keyCode == KeyEvent.VK_ESCAPE){ 
     stop(); 
    } else if(keyCode == KeyEvent.VK_UP){ 
     ship.setDY(-1); 
     e.consume(); 
    } else if(keyCode == KeyEvent.VK_RIGHT){ 
     ship.setDX(1); 
     e.consume(); 
    } else if(keyCode == KeyEvent.VK_DOWN){ 
     ship.setDY(1); 
     e.consume(); 
    } else if(keyCode == KeyEvent.VK_LEFT){ 
     ship.setDX(-1); 
     e.consume(); 
    } else if(keyCode == KeyEvent.VK_SPACE){ 
     shooting = true; 
     e.consume(); 
    } 
} 

    public void keyReleased(KeyEvent e) { 
     int keyCode = e.getKeyCode(); 
     if(keyCode == KeyEvent.VK_UP){ 
      ship.setDY(0); 
      e.consume(); 
     } else if(keyCode == KeyEvent.VK_RIGHT){ 
      ship.setDX(0); 
      e.consume(); 
     } else if(keyCode == KeyEvent.VK_DOWN){ 
      ship.setDY(0); 
      e.consume(); 
     } else if(keyCode == KeyEvent.VK_LEFT){ 
      ship.setDX(0); 
      e.consume(); 
     } else if(keyCode == KeyEvent.VK_SPACE){ 
      shooting = false; 
      e.consume(); 
     } 
    } 

    public void keyTyped(KeyEvent e) { 
     e.consume(); 
    } 
} 

So zum Schluss ist meine Frage eine vage Art. Gibt es etwas Besonderes mit der Leertaste, von der ich nichts weiß, ob es tatsächlich einen Fehler in meinem Programm gibt oder vielleicht nur, ob etwas mit meiner Tastatur nicht stimmt?

Alle Kommentare, Ideen, Beschwerden über meine Codierung, Beschwerden über mein Englisch, starke Meinungen darüber, ob KeyListener s oder KeyBinding s, Code Sie fühlen, wie Sie brauchen, um etwas zu sehen oder alles nur geben Sie mir einen Ruf und ich Ich werde versuchen, schnell zu reagieren.

Antwort

2

Viele Menschen haben dieses Problem. Es heißt Keyboard Ghosting und bedeutet, dass einige Kombinationen auf billigen Tastaturen einfach nicht funktionieren. Deshalb gibt es hochwertige Gaming-Tastaturen. Also nichts falsch mit Ihrem Code. Keine Optimierung möglich. Sie müssen eine Tastenkombination verwenden, die funktioniert.
Um meine Antwort hier zu überprüfen, sind einige Links für Sie.

+0

Ich muss sagen, das ist das frustrierend noch große Antwort, die ich je bekommen haben zehn hier. Vielen Dank! Als Randnotiz gibt es keine Möglichkeit, dieses Problem zu lösen? Irgendwas basteln an der Tastatur oder so? –

+2

Nein, dies hängt von der internen Tastenmatrix der Tastaturhardware ab. Die einzige Option ist: Holen Sie sich eine Gaming-Tastatur. – mtj