[java] continuous keyboard input

Pagina: 1
Acties:

  • Johnny
  • Registratie: December 2001
  • Laatst online: 10:00

Johnny

ondergewaardeerde internetguru

Topicstarter
Het lezen van invoer via het toetsenbord lukt me al, maar zodra je een toets ingedrukt houdt dan is er een kleine pauze voordat de toets daadwerkelijkk geregistreerd wordt, maar dat is niet echt handig als je geen tekst invoert.

In JavaScript is er een onkeydown event, zoiets moet ik dus hebben in Java.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public void keyPressed(KeyEvent e) {

          int key = e.getKeyCode(); 
          
          if (key == KeyEvent.VK_LEFT) {  
          }
          else if (key == KeyEvent.VK_RIGHT) {
          }
          else if (key == KeyEvent.VK_UP) {
            movePadVertical(true);

          }
          else if (key == KeyEvent.VK_DOWN) {
            movePadVertical(false);
          }

    }
   
    public void keyReleased(KeyEvent e) {
    }
   
    public void keyTyped( KeyEvent e) {
    }


voorbeeld

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

euh ja, waar denk je dat keyPressed () en keyReleased () voor zijn?
Als je een toets indrukt dan krijg je een keyPressed event. Als je 'm weer loslaat krijg je een keyReleased event. In de tijd die ertussen zit is de toets dus ingedrukt

(Als je een spel maakt waarin je een poppetje kunt besturen met het toetsenbord, dan gebruik je ook keyPressed en keyReleased. Je houdt gewoon een lijst bij van welke toetsen er zijn ingedrukt, en in je gameloop kijk je gewoon naar iets als: is LINKS ingedrukt? Zo ja, loop dan naar links)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Nou dan ben ik wel benieuwd of het mogelijk is in Java om te detecteren dat er MEERDERE keys tegelijk down zijn.

(stel ik heb een vecht spelletje, je moet combo's maken, je check dan of UP en LEFT ingedrukt zijn op het moment dat je op KICK drukt)

ik dacht dat dat in win32 kon met GetAsyncKeyState(). is daar een java alternatief voor?

(btw .oisyn, je loopt nog een uur voor :7 )

[ Voor 8% gewijzigd door Verwijderd op 30-03-2004 22:45 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

iLs: natuurlijk kan dat, als je een toets ingedrukt hebt, en je drukt nog een andere toets in, dan krijg je wederom een keyPressed event voor die laatste toets, zonder dat voor die eerste toets een keyReleased langs is geweest

Overigens ligt het nogal aan je hardware (toetsenbord dus) hoeveel en welke toetsen er in combinatie ingedrukt kunnen worden :)

(En nee, dan zou ik 2 uur voorlopen, maar ik heb die post afgelopen nacht al gedaan. Bovendien is de klok een uur vooruit gegaan, dus ik kon hooguit een uur achter lopen ;))

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09:46

Robtimus

me Robtimus no like you

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static final int UP = 0;
static final int DOWN = 1;
static final int LEFT = 2;
static final int RIGHT = 3; // ik ben een lefty :P

...

boolean []keys = new boolean[4];
for (int i = 0; i < 4; i++)
{
    keys[i] = false;
}

...

if (keys[UP] && keys[LEFT])
{
    // handle left-up
}
In je keyPressed en keyReleased zet je de waarden van je array dan op true/false;

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Check:

(mooi is anders maar het illustreert de werking prima)

edit: aangepast, beter gedrag :)


Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import java.awt.*;
import java.awt.event.*;

class Keystest extends Frame implements KeyListener
{
    public static boolean keys[] = new boolean[5];
    
    public Keystest() 
    {
        addKeyListener(this);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                dispose();
                System.exit(0);
            }
        });
    }
    

    public static void main(String args[]) 
    {
        System.out.println("Starting Keystest...");
        Keystest mainFrame = new Keystest();
        mainFrame.setSize(400, 400);
        mainFrame.setTitle("Keystest");
        mainFrame.setVisible(true);
        keys[4] = false;
        while (keys[4] == false)
        {
            //do game loop
            try {Thread.sleep(10);} catch (Exception e){}
            printKeys();
        }
        mainFrame.dispose();        
    }
    public void keyTyped(KeyEvent e)
    {
    }
    public void keyPressed(KeyEvent e)
    {
        switch (e.getKeyCode())
        {
            case KeyEvent.VK_UP:        keys[0]=true;   break;
            case KeyEvent.VK_DOWN:      keys[1]=true;   break;
            case KeyEvent.VK_LEFT:      keys[2]=true;   break;
            case KeyEvent.VK_RIGHT:     keys[3]=true;   break;
            case KeyEvent.VK_ESCAPE:    keys[4]=true;   break;
        }
    }
    public void keyReleased(KeyEvent e)
    {
        switch (e.getKeyCode())
        {
            case KeyEvent.VK_UP:        keys[0]=false;  break;
            case KeyEvent.VK_DOWN:      keys[1]=false;  break;
            case KeyEvent.VK_LEFT:      keys[2]=false;  break;
            case KeyEvent.VK_RIGHT:     keys[3]=false;  break;
        }
    }
    public static void printKeys()
    {
        if (keys[0]) System.out.print("UP    ");
        if (keys[1]) System.out.print("DOWN  ");
        if (keys[2]) System.out.print("LEFT  ");
        if (keys[3]) System.out.print("RIGHT ");
        for (int i=0; i<4; i++)
        {
            if (keys[i]) {System.out.println();return;}
        }
        
    }
}

[ Voor 15% gewijzigd door Verwijderd op 31-03-2004 00:02 ]


Verwijderd

Maar er is wel een probleem, als je nl een (actie) spel maakt wil je niet dat je moet wachten op de key-repeat timer. In mijn bios staatdie op 500 ms, dus na de eerste keypress duurt het 500 ms voordat de stroom op gang komt. Ik denk dat din ook is wat TS bedoelde.

Dus: kan je het keyboard pollen vanuit java?

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

wat bedoel je met stroom op gang komen?

zolang je je toets niet los laat krijg je geen keyReleased Event.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 30 maart 2004 @ 23:16:
Maar er is wel een probleem, als je nl een (actie) spel maakt wil je niet dat je moet wachten op de key-repeat timer. In mijn bios staatdie op 500 ms, dus na de eerste keypress duurt het 500 ms voordat de stroom op gang komt. Ik denk dat din ook is wat TS bedoelde.

Dus: kan je het keyboard pollen vanuit java?
Die repeat slaat alleen op het ingedrukt houden van een toets. Een keypress krijg je zo goed als direct, een keyrelease ook. Die repeat timer slaat alleen op de volgende keypresses nadat je al eens een keypress hebt gehad, dus daar ben je sowieso niet in geinteresseerd

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Doh! Natuurlijk. Het spel is niet key-event driven :/ (heb maar meteen ff de voorbeeld code boven aangepast)

Ik ga maar es slapen denk ik :)

[ Voor 52% gewijzigd door Verwijderd op 31-03-2004 00:05 ]


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

.oisyn schreef op 30 maart 2004 @ 23:27:
[...]


Die repeat slaat alleen op het ingedrukt houden van een toets. Een keypress krijg je zo goed als direct, een keyrelease ook. Die repeat timer slaat alleen op de volgende keypresses nadat je al eens een keypress hebt gehad, dus daar ben je sowieso niet in geinteresseerd
dat zeg ik ;)
Pagina: 1