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

shadowstrike

Frischling

  • »shadowstrike« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Wiesbaden

Beruf: Schüler

  • Private Nachricht senden

1

29.12.2010, 17:52

Java mehrere Tastendrücke gleichzeitig

Hi,

ich habe eine Frage zu Java:
Ist es mit der normalen Java-API möglich zu testen, ob und wenn ja welche Tasten gleichzeitig gedrückt werden? Der KeyListener speichert ja immer nur die letzte gedrückte Taste. Da ich mich entschlossen habe, einige Minigames mit Processing zu entwickeln (nicht zuletzt aufgrund des Contests, die Sprache fand ich für kleinere Projekte eigentlich ziemlich praktisch wegen der enormen Entwicklungsgeschwindigkeit, die mit Processing möglich ist und ich denke für kleine Spiele wie Tetris, Brickbreaker, Solitär usw. sollte die Performance von Processingprogrammen durchaus in Ordnung sein) und die mitgelieferten Tastaturabfrage-Funktionen immer nur einen Tastendruck gleichzeitig bearbeiten können, muss ich wohl oder übel einige Funktionen schreiben, die mehrere gedrückte Tasten unterstützen. Da ich aber mit Google und meiner "kleinen" Programmierbuchbibliothek noch nicht sehr weit gekommen bin, muss ich wohl auf eure Unterstützung warten. Danke schonmal im Voraus für alle eure Ideen und Vorschläge.

Mfg,
Shadowstrike
Evil Industries - Kaufen Sie jetzt, bereuen Sie später.

B.Tobi

Frischling

Beiträge: 4

Wohnort: Dortmund

Beruf: Schüler

  • Private Nachricht senden

2

29.12.2010, 21:12

Hallo,

mit etwas Kreativität kriegt man das mit dem KeyListener hin.
Ich habe das mal für zwei gleichzeitig gedrückte Tasten gemacht:

Quellcode

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
import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

/**
 * File KeyListenerFrame.java
 * @author Tobias B.
 */
public class KeyListenerFrame extends JFrame implements KeyListener {
    private JTextArea output;

    // Konstruktor
    public KeyListenerFrame() {
        super("KeyListener");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        setFocusable(true);
        addKeyListener(this);

        output = new JTextArea();
        output.setEditable(false);
        add(BorderLayout.CENTER, new JScrollPane(output));

        setSize(200, 200);
        setVisible(true);
    }

    boolean keyIsPressed = false;
    char currKey = ' ';

    // KeyListener Methoden
    public void keyTyped(KeyEvent ke) {}

    public void keyPressed(KeyEvent ke) {
        if(currKey == ' ') {
            keyIsPressed = true;
            currKey = ke.getKeyChar();
        } else
            output.append(String.valueOf(currKey + " und " + ke.getKeyChar() + "\n"));
    }

    public void keyReleased(KeyEvent ke) {
        if(ke.getKeyChar() == currKey) {
            currKey = ' ';
            keyIsPressed = false;
        }
    }

    // Einstiegsmethode
    public static void main(String[] args) {
        new KeyListenerFrame();
    }
}



(Link)

shadowstrike

Frischling

  • »shadowstrike« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Wiesbaden

Beruf: Schüler

  • Private Nachricht senden

3

29.12.2010, 21:26

danke :D ich denk mit n bissel experimentieren krieg ichs evt sogar hin alle gleichzeitig zu bearbeiten xD

EDIT:

bin dann soweit fertig (habs in Processing direkt gelöst)... und mit den meisten tasten funzts auch aber bei der speziellen kombination UP, LEFT und RIGHT macht der iwas komisches xD schauts euch mal an und sagt mir bitte, wenn ihr nen fehler erkennen könnt:

Quellcode

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
class InputManager
{
  //Listen der momentan gedrückten Tasten
  private char m_cKeyPressedChars[] = new char[0];
  private int m_cKeyPressedCodes[] = new int[0];
  
  //setKeyPressed()-Methode, fügt den Listen der gedrückten Tasten
  //eine neue Taste hinzu
  public void setKeyPressed(char Char, int Code)
  {
    boolean isActive = false;
    //Falls die Taste schon in den Listen steht, wird kein neuer Eintrag erzeugt
    for(int i = 0; i < m_cKeyPressedChars.length; i++)
    {
      if(m_cKeyPressedCodes[i] == Code)
      {
        isActive = true;
      }
    } 
    if(!isActive)
    {
      m_cKeyPressedChars = (char[]) append(m_cKeyPressedChars, Char);
      m_cKeyPressedCodes = (int[]) append(m_cKeyPressedCodes, Code); 
    }
  }
  
  //setKeyReleased()-Methode, löscht die losgelassene Taste aus den Listen
  public void setKeyReleased(char Char, int Code)
  { 
    //Ist mehr als eine Taste gedrückt, muss vor dem kürzen der Liste das
    //zu löschende Element mit dem letzten Element getauscht werden
    if(m_cKeyPressedCodes.length > 1)
    {
      int i = 0;
      boolean finished = false;
      while(i < m_cKeyPressedCodes.length && finished == false)
      {
        if(m_cKeyPressedCodes[i] == Code)
        {
          int iTmp = m_cKeyPressedCodes[i];
          m_cKeyPressedCodes[i] = m_cKeyPressedCodes[m_cKeyPressedCodes.length-1];
          m_cKeyPressedCodes[m_cKeyPressedCodes.length-1] = iTmp;
          char cTmp = m_cKeyPressedChars[i];
          m_cKeyPressedChars[i] = m_cKeyPressedChars[m_cKeyPressedChars.length-1];
          m_cKeyPressedChars[m_cKeyPressedChars.length-1] = cTmp;
          finished = true;
        } 
        i++;       
      }
    }
    //Liste kürzen
    m_cKeyPressedCodes = (int[]) shorten(m_cKeyPressedCodes);
    m_cKeyPressedChars = (char[]) shorten(m_cKeyPressedChars);
  }
  
  //Rückgabefunktionen, ob eine bestimmte Taste gedrückt wurde
  boolean isKeyPressed(int code)
  {
    for(int i = 0; i < m_cKeyPressedCodes.length; i++)
    {
      if(m_cKeyPressedCodes[i] == code)
      {
        return true;
      }
    }
    return false;
  }
  
  boolean isKeyPressed(char code)
  {
    for(int i = 0; i < m_cKeyPressedChars.length; i++)
    {
      if(m_cKeyPressedChars[i] == code)
      {
        return true;
      }
    }
    return false;
  }
}

InputManager n = new InputManager();

void keyPressed()
{
  n.setKeyPressed(key, keyCode);
}

void keyReleased()
{
  n.setKeyReleased(key, keyCode);
}

void setup()
{
  size(640, 480);
  smooth();
}

void draw()
{
  background(0);
  if(n.isKeyPressed(UP))
  {
    stroke(255, 0, 0);
    fill(0, 0, 0);
    ellipseMode(RADIUS);
    ellipse(160, 240, 50, 50);
  }
  if(n.isKeyPressed(LEFT))
  {
    stroke(0, 255, 0);
    fill(0, 0, 0);
    ellipseMode(RADIUS);
    ellipse(320, 240, 50, 50);
  }
  if(n.isKeyPressed(RIGHT))
  {
    stroke(0, 0, 255);
    fill(0, 0, 0);
    ellipseMode(RADIUS);
    ellipse(480, 240, 50, 50);
  }
}
Evil Industries - Kaufen Sie jetzt, bereuen Sie später.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »shadowstrike« (30.12.2010, 02:14)


4

30.12.2010, 13:40

ohne den code ausprobiert zu haben... gleichzeitiges drücken von bestimmten tastenkombinationen ist i.d.r. nicht möglich.
http://de.wikipedia.org/wiki/Tastatur#Key_Rollover

shadowstrike

Frischling

  • »shadowstrike« ist der Autor dieses Themas

Beiträge: 24

Wohnort: Wiesbaden

Beruf: Schüler

  • Private Nachricht senden

5

30.12.2010, 21:47

naja... so direkt vlt nich aber mit den meisten Graphik/GUI-APIs isses ja doch relativ gut gelöst vermutlich ähnlich wie bei mir da oben (nur evt etwas eleganter^^)... also dass die einzelnen tastendrücke mitgezeichnet werden^^ ich finds allerdings grad recht verwirrend, dass das mit den pfeiltasten nich ordentlich funzt
Evil Industries - Kaufen Sie jetzt, bereuen Sie später.

Developer_X

Treue Seele

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

6

06.01.2011, 09:12

Also ich mache das immer so, dass ich bei keyPressed, einfach ein Boolean true werden lasse, und bei keyReleased en Boolean false werden lasse, z.B. so:

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
boolean up = false; 
boolean down = false; 
boolean right = false; 
boolean left = false; 
JPanel mainPanel = new JPanel(); 
//... 
mainPanel.addKeyListener(new KeyListener() 
{ 
public void keyPressed(KeyEvent e) 
{ 
if(e.getKeyCode()==KeyEvent.VK_UP) 
{ 
up = true; 
} 
// das dementsprechend für alle anderen machen 
} 
public void keyReleased(KeyEvent e) 
{ 
if(e.getKeyCode()==KeyEvent.VK_UP) 
{ 
up = false; 
} 
} 
});


Verstehst du?

Was hälst du davon?
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Werbeanzeige