Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

07.12.2009, 22:51

2+ KeyEvents abfangen (Java) [ERLEDIGT]

Hi

ich habe gestern damit begonnen ein kleines Spiel zu schreiben und sitze nun an der Steuerung. Mein Problem ist, dass sich meine Figur zwar bewegt nur nicht diagonal (außer wenn man die zwei Tasten absolut synchron drückt). Mein bisheriger Ansatz funktioniert leider nicht. Ich bitte um Hilfe.

C-/C++-Quelltext

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
final char cmdMoveForward   = KeyEvent.VK_W;
final char cmdMoveBackwards = KeyEvent.VK_S;
final char cmdMoveRight     = KeyEvent.VK_D;
final char cmdMoveLeft      = KeyEvent.VK_A;
    
boolean pressedCmdMoveForward   = false;
boolean pressedCmdMoveBackwards = false;
boolean pressedCmdMoveRight     = false;
boolean pressedCmdMoveLeft      = false;
//[...]

public void keyPressed(KeyEvent event){                     
  int key = event.getKeyCode();
  switch((char)key){    
  case cmdMoveForward:
  if( playerPosY > 5)
    playerPosY -= 5;
    pressedCmdMoveForward = true;
  break;
  case cmdMoveBackwards:
    if( playerPosY < 395)
  playerPosY += 5;
  pressedCmdMoveBackwards = true;
  break;
  case cmdMoveLeft:
  if( playerPosX > 5)
    playerPosX -= 5;
  pressedCmdMoveLeft = true;
  break;
  case cmdMoveRight:
  if( playerPosX < 395)
    playerPosX += 5;
  pressedCmdMoveRight = true;
  break;
  }
  switch((char)key){    
  case cmdMoveForward:
  if( playerPosY > 5 && !pressedCmdMoveForward)
    playerPosY -= 5;
  break;
  case cmdMoveBackwards:
  if( playerPosY < 395 && !pressedCmdMoveBackwards)
    playerPosY += 5;
  break;
  case cmdMoveLeft:
  if( playerPosX > 5 && !pressedCmdMoveLeft)
    playerPosX -= 5;
  break;
  case cmdMoveRight:
  if( playerPosX < 395 && !pressedCmdMoveRight)
    playerPosX += 5;
  break;
  }
  pressedCmdMoveForward   = false;
  pressedCmdMoveBackwards = false;
  pressedCmdMoveLeft      = false;
  pressedCmdMoveRight     = false;
  repaint();
}

iF

Frischling

  • Private Nachricht senden

2

07.12.2009, 22:55

Hallo, ich hab von Java keine Ahnung aber KeyEvent wird hier vlt. nicht das Richtige sein - glaube Du willst ja prüfen ob eine Taste gedrückt ist statt gedrückt wurde. Da gibts bestimmt eine Funktion die wie GetAsyncKeyState prüft ob eine Taste momentan gedrückt ist - wenn KeyEvent dies nicht tut.

Nachtrag: Sehe grad, glaube Deine switch-Struktur steht Dir (auch) im Wege - vlt. liegt es daran. Formuliere doch mal in einfache if's um die nacheinander prüfen statt wie jetzt "else".

3

07.12.2009, 23:09

Hi

Danke für die schnelle Antwort. Ich habe mal ein bisschen gegoogelt aber wie es scheint gibt es kein JavaÄquivalent zu getAsyncKeyState. Wie auch immer, hier der neue Code (ich geb zu, dass mit switch zu lösen war eine dämliche Idee):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public void keyPressed(KeyEvent event){
        int key = event.getKeyCode();
        if( key == cmdMoveForward){
            playerMoveForward();
        }
        if( key == cmdMoveBackwards){
            playerMoveBackwards();
        }
        if( key == cmdMoveLeft){
            playerMoveLeft();
        }
        if( key == cmdMoveRight){
            playerMoveRight();
        }
        repaint();
    }

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

4

08.12.2009, 09:10

Eine möglichkeit wäre, dass du die events abfängst und dann in einer Boolean-variable speicherst.

Wenn dann eine taste gedrückt wird setz die entsprechende variable auf true.
Wenn sie losgelassen wird wieder auf false.

Und wie man das ganze benutzt sollte klar sein ;)

Aja... und ich empfehle Keylistener

flux

Treue Seele

  • Private Nachricht senden

5

08.12.2009, 09:17

Code Example 2 und 3:
http://gpwiki.org/index.php/Java:Tutorials:Key_States#Storing_the_Key_States

6

08.12.2009, 16:42

Hi

danke das hat mir sehr geholfen, es ist jetzt mittlerweile möglich während man geradeaus läuft, auch diagonal zu laufen, bzw wenn man diagonal läuft und eine Taste loslässt, nur noch geradeaus (oder so) zu laufen. Allerdings stoppt die Person bei jedem Richtungswechsel, bevore sie neu losläuft. Kann mir da noch jemand einen Tipp geben?

C-/C++-Quelltext

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
public class gsg9 extends Applet implements ActionListener,KeyListener{
    Player player = new Player(playerName,startPosX,startPosY);
    
    public void init(){
        /* layout */
        this.setLayout(null);   
        this.setSize(width,height);
        this.addKeyListener(this);
    }   
    public void paint(Graphics g){
        /* constant */
        g.drawImage(imgBackground,mapPosX,mapPosY,this);
        
        /* dynamic */
        g.drawImage(imgPlayer,player.getPosX(),player.getPosY(),this);
    }
    public void actionPerformed(ActionEvent evt){
    }
    public void keyPressed(KeyEvent event){
        int key = event.getKeyCode();
        if( key == cmdMoveForward)
            pressedCmdMoveForward = true;       
        if( key == cmdMoveBackwards)
            pressedCmdMoveBackwards = true;
        if( key == cmdMoveLeft)
            pressedCmdMoveLeft = true;
        if( key == cmdMoveRight)
            pressedCmdMoveRight = true;     
        movePlayer();
    }
    public void keyReleased(KeyEvent event){    
        int key = event.getKeyCode();
        if( key == cmdMoveForward)
            pressedCmdMoveForward = false;      
        if( key == cmdMoveBackwards)
            pressedCmdMoveBackwards = false;
        if( key == cmdMoveLeft)
            pressedCmdMoveLeft = false;
        if( key == cmdMoveRight)
            pressedCmdMoveRight = false;
        movePlayer();
    }
    public void keyTyped(KeyEvent event){
    }
    public void movePlayer(){
        int posX = player.getPosX();
        int posY = player.getPosY();
        if( pressedCmdMoveForward ){
            if( posY > 0 )
                player.setPosY(posY-2);
        }
        if( pressedCmdMoveBackwards ){
            if( posY < 400 )
                player.setPosY(posY+2);
        }
        if( pressedCmdMoveLeft ){
            if( posX > 0 )
                player.setPosX(posX-2);
        }
        if( pressedCmdMoveRight ){
            if( posX < 400 )
                player.setPosX(posX+2);
        }
        repaint();
    }
}

(Ich habe bewusst eine Teile weggelassen, damit es nicht zu lang wird, wenn euch etwas fehlt, bitte nachfordern :) )

7

08.12.2009, 18:04

So

ich habe mir in meinem Buch nochmal die Threads angeguckt und es damit gelöst. Funktioniert jetzt super :)

Werbeanzeige