17. marts 2001 - 14:29Der er
8 kommentarer og 1 løsning
Multiple taster trykket
Hejsa,
Jeg er i gang med at lave et mindre bil-spil i Java hvor jeg gerne skulle kunne køre frem og dreje samtidigt. Altså, holde to knapper nede og så detektere dette. Dette kan umiddelbart ikke klares gennem KeyEvent\'s - er der en anden måde at spørge systemet om disse to knapper er trykket ned?
Det kunne jeg nu godt, men forestil dig så at jeg gerne vil kunne lægge miner medens jeg drejer - så skal jeg igen kunne registrere to taster på engang.
// programmet lukkes ikke når framen lukkes, // da jeg ikke har sat en system.exit(0) på windowclose listeneren // så bare terminer (CRTL-C) efter endt udførsel
public class keys extends JFrame implements KeyListener { JTextField tf; boolean j = false; //variable der viser om j holdes nede boolean k = false; //variable der viser om (JA!) k holdes nede
keys() //constructor opsætter framen med et textfield { setSize(300,200); this.addKeyListener(this);
Men hvis du holder f.eks. \"a\" nede og i medens trykker på f.eks. \"b\", så vil \"a\" rigtig nok blive registreret - det vil \"b\" også. Ydermere vil \"b\" bliver registreret sluppet, men det vil \"a\" aldrig. Prøv bare selv...
Jeg har prøvet det med ovenstående programstump, og der virker det fint (med tasterne \'j\' & \'k\') uanset hvilken rækkefølge de trykkes og slippes.
Der udløses jo en event for hver tast der trykkes og hver tast der slippes, derfor er rækkefølgen irrelevant, når bare du i dine keylistener metoder tager højde for det, ved at checke hvilken tast, der slippes.
Prøv at compile ovenstående og så teste det med tasterne j & k, som er de eneste taster jeg har taget højde for i mine keylistener-metoder. Det virker!
Undskyld min lange svartid! Men jeg må konstatere at det virker med det du har skrevet. Men prøver jeg at udvide det med bare een sølle tast mere virker det stadig kun med to. Man kan altså ikke holde tre eller flere taster nede.
Nu har jeg prøvet at udvide programmet med tasterne l&i så programmet understøtter tasterne j,k,l,i og jeg har altså stadig ingen problemer. Hvis det ikke virker for dig og computeren \'bibber\' når du holder tasterne nede er det fordi at din keyboardbuffer er fyldt. Her er programstumpen med fire taster:
// programmet lukkes ikke når framen lukkes, // da jeg ikke har sat en system.exit(0) på windowclose listeneren // så bare terminer (CRTL-C) efter endt udførsel
public class keys extends JFrame implements KeyListener { JTextField tf; boolean j = false; //variable der viser om j holdes nede boolean k = false; //variable der viser om k holdes nede boolean l = false; //variable der viser om l holdes nede boolean i = false; //variable der viser om (JA!) i holdes nede
keys() //constructor opsætter framen med et textfield { setSize(300,200); this.addKeyListener(this);
public static void main(String[] args) { new keys ().show (); //kalder constructoren og viser derefter; }
// KeyListener metoder public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) { if (e.getKeyChar() == \'j\') j = true; if (e.getKeyChar() == \'k\') k = true; if (e.getKeyChar() == \'l\') l = true; if (e.getKeyChar() == \'i\') i = true; skriv(); }
public void keyReleased(KeyEvent e) { if (e.getKeyChar() == \'j\') j = false; if (e.getKeyChar() == \'k\') k = false; if (e.getKeyChar() == \'l\') l = false; if (e.getKeyChar() == \'i\') i = false; skriv(); }
// Skriv til tf private void skriv() { String s = \"\"; if (j) s = s + \'J\'; if (k) s = s + \'K\'; if (l) s = s + \'L\'; if (i) s = s + \'I\'; tf.setText(s); }
}
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.