# Doppel KeyListener



## Titanpharao (14. Apr 2008)

Hey,

ich habe vor ein Spiel zu entwickeln, wo zwei Spieler gleichzeitig spielen können. Zufolge brauchen sie auch "zwei Keylistener". Wie kann ich sowas realisieren? Denn wenn einer eine Taste gedrückt hält, kann der andere nicht mehr die tasten bedienen. Gibt es da etwas spezielles, oder muss ich mir selber etwas herleiten? Oder hat jemand einen guten Ansatz oder sowas schonmal gemacht?

Danke für Hilfe


----------



## pyr0t0n (14. Apr 2008)

Hallo,

also im Grunde brauchst du keine 2 Keylistener ich habs eben Fix so gelöst


```
public class Main extends Frame implements Runnable, KeyListener {
    
    Boolean spieler1o=false;
    Boolean spieler1l=false;
    Boolean spieler1r=false;
    Boolean spieler1u=false;
    Boolean spieler2o=false;
    Boolean spieler2l=false;
    Boolean spieler2r=false;
    Boolean spieler2u=false;
    
    int x1=60, x2=20, y1=50,y2=100;
    
    public Main()
    {
        setSize(640,480);
        setVisible(true);
        addKeyListener(this);
    }
    
    @Override
    public void paint(Graphics g)
    {
        g.fillOval(x1, y1, 10, 10);
        g.fillOval(x2, y2, 10, 10);
        
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Main h = new Main();
    }

    public void keyTyped(KeyEvent e) {
    }

    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()== e.VK_UP)
        {
            spieler1o=true;
        }
        if(e.getKeyCode()== e.VK_DOWN)
        {
            spieler1u = true;
        }
        if(e.getKeyCode()== e.VK_RIGHT)
        {
            spieler1r=true;
        }
        if(e.getKeyCode()== e.VK_LEFT)
        {
            spieler1l = true;
        }
        if(e.getKeyCode()== e.VK_W)
        {
            spieler2o=true;
        }
        if(e.getKeyCode()== e.VK_S)
        {
            spieler2u = true;
        }
        if(e.getKeyCode()== e.VK_D)
        {
            spieler2r=true;
        }
        if(e.getKeyCode()== e.VK_A)
        {
            spieler2l = true;
        }
        
        
    }

    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode()== e.VK_UP)
        {
            spieler1o=false;
        }
        if(e.getKeyCode()== e.VK_DOWN)
        {
            spieler1u = false;
        }
        if(e.getKeyCode()== e.VK_RIGHT)
        {
            spieler1r=false;
        }
        if(e.getKeyCode()== e.VK_LEFT)
        {
            spieler1l = false;
        }
        if(e.getKeyCode()== e.VK_W)
        {
            spieler2o=false;
        }
        if(e.getKeyCode()== e.VK_S)
        {
            spieler2u = false;
        }
        if(e.getKeyCode()== e.VK_D)
        {
            spieler2r=false;
        }
        if(e.getKeyCode()== e.VK_A)
        {
            spieler2l = false;
        }
    }

    public void run() {
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
        while(true)
        {
            try {
                if (spieler1o) { y1--; }
                if (spieler1u) { y1++; }
                if (spieler1l) { x1--; }
                if (spieler1r) { x1++; }
                if (spieler2o) { y2--; }
                if (spieler2u) { y2++; }
                if (spieler2l) { x2--; }
                if (spieler2r) { x2++; }
                repaint();
                Thread.sleep(10);
            } catch (InterruptedException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
```

Du überprüfst einfach welche Tasten gedrückt worden sind und setzt Diverse Variablen auf True und reagierst dementsprechend. Ich konnte somit beide Kreise gleichzeitig mit Pfeiltasten und WASD bewegen.


----------



## Maeher (14. Apr 2008)

Titanpharao hat gesagt.:
			
		

> Denn wenn einer eine Taste gedrückt hält, kann der andere nicht mehr die tasten bedienen.


Wenn ich dein Vorhaben richtig verstehe, weiß ich nicht wo dein Problem ist. Man kann doch normalerweiße Problemlos mehrere Tasten gleichzeitig bedienen, und sollte das auch entsprechend mit einem KeyListener auslesen können?


----------



## Quaxli (15. Apr 2008)

Aber probier mal 6 Tasten gleichzeitig! Als z. B. beide Spieler in diagonaler Bewegung und dabei noch eine Feuertaste. Ich hatte ein ähnliches Konstrukt wie pyr0t0n im Sinn. Aber mein Testprogramm ist dabei nach der 4. Taste ausgestiegen.


----------



## Maeher (15. Apr 2008)

Ich glaube, dass das nicht an Java liegt. Zum Teil sind die Tastaturen schon Hardwaremäßig nicht mehr in der Lage das zu übertragen. Versuch 's mal in irgendwelchen anderen Programmen (z.B. im Texteditor), du erhälst ab einer bestimmten Menge an gedrückter Tasten nie vernünftige Ergebnisse.


----------



## Quaxli (15. Apr 2008)

Einen ähnlichen Hinweis habe ich eben auch gefunden: hier

Evtl ist das hier auch noch hilfreich.


----------



## pyr0t0n (15. Apr 2008)

Aber gegen mein Konstrukt kannste erstmal nix sagen... und btw bei mir laufen beide Diagonal also mit 4 Tasten scheint also wirklich hardwaremäßig beschränkt zu sein.

EDIT: Habs grade nochmal probiert, selbst wenn ich bei Spieler ein die Tasten HOCH, LINKS und RECHTS drücke (ich weis er läuft dann nur gerade aus hoch) kann ich trotzdem mit dem WASD "Spieler" Diagonal "laufen".


----------



## Quaxli (15. Apr 2008)

Ich sach' ja gar nix. Ich hatte ja auch sowas gebaut. Und wie wir gemerkt hatten, liegt's an der Hardware. Hast halt ein gutes Keyboard. Glücksschlumpf


----------



## pyr0t0n (15. Apr 2008)

Laptop 4TW ^^ aber mal im ernst ne andere methode ist ja auch nicht möglich oder kann ich 2 Keylistener Parallel betreiben denke du kennst dich da bissle mehr aus als ich, bin ja noch anfänger.


----------



## Maeher (15. Apr 2008)

Naja, grundsätzlich kannst du einem Oberflächenelement schon mehrere KeyListener hinzufügen.
Nur frage ich mich, ob dir das überhaupt hilft die Eingaben für die verschiedenen Benutzer außeinanderzuhalten, denn die bekommen ja schließlich beide erst einmal die gleichen Events.


----------



## pyr0t0n (15. Apr 2008)

richtig theoretisch müsstest du dem einen Keylistener dann sagen er darf nur auf WASD was machen und dem anderen auf Oben Unten Links Rechts. Was im endeffekt auch nicht sinnig wäre, weil es ja auch wie oben stehen mit einem KeyListener und andersrum ja eh Hardwareabhängig ist obs funktioniert 

Interessant wäre ja wenn der TE sich mal melden würde und sagen würde obs ihm nun geholfen hat und obs funktioniert ^^


----------



## Titanpharao (17. Apr 2008)

Bei mir funktioniert da gar nichts, wenn ich auf eine der Tasten drück...

Mache ich was falsch^^


----------



## pyr0t0n (17. Apr 2008)

können wir dir ohne code nicht genau sagen vllt postest du mal was.


----------



## Guest (18. Apr 2008)

Nein ich rede von deinem Code. Wenn ich da auf WASD bzw Pfeiltasten herrumdrücke passiert bei mir nichts. Sollte doch ein lauffähiges Programm sein oder?


----------



## tuxedo (18. Apr 2008)

Nach Zeile 34 fehlt ein 


```
new Thread(h).start();
```

Dann läufts.


----------



## Titanpharao (18. Apr 2008)

ok jetzt gehts 

werde ich mir mal anschauen, wenn ichs benötige...wobei bei mir ab der 5ten taste "PIEP" ...denke aber Hardware.


----------



## tuxedo (19. Apr 2008)

Bei mir macht sich der Rechner auch bemerkbar wenn ich mehr als 4 Tasten drücke...  Scheint weitgehend "normal" zu sein dass bei 4 Tasten schluss ist.


----------

