Abbrechender Input bei mehreren Tasten

Orthak

Mitglied
Hallo Javafreunde!
Ich arbeite aktuell an einem kleinen Space-Sidescroller in Java. Mein Problem ist folgendes:

Bewege ich das Schiff und feuere gleichzeitig werden die Schüsse kassiert wenn ich angefangen habe zu feuern bevor ich das Schiff bewege. Fange ich erst an nachdem ich mit der Bewegung begonnen habe funktioniert alles. Die Bewegung selbst wird immer korrekt ausgeführt.

Ich arbeite mit keyPressed / keyReleased und boolean Schaltern für die jeweiligen Tasten. Im Mainloop werden alle Werte dann einmal abgefragt.

Bin für jeden Tip dankbar!
 
Hi,
Bewege ich das Schiff und feuere gleichzeitig werden die Schüsse kassiert wenn ich angefangen habe zu feuern bevor ich das Schiff bewege.
Hui, ein Paradoxon, ich liebe diese Dinger :p
Sorry, ich versteh nur nicht ganz, was genau nicht funktioniert und vor allem was dieser Satz bedeutet :)
 
Ich habe schon befürchtet das dieser Satz das Problem nicht wirklich klar macht :).

Bewege Ich das Objekt mit den Preiltasten und halte vorher Space gedrückt (schießen), werden die Schüsse nicht ausgelöst. Dies gilt auch wenn ich im Anschluss stehenbleibe.

Beispiel 1
- Schiff steht still
- Ich drücke Space und lasse die Taste gedrückt => Dauerfeuer (richtig)
- ich bewege das Schiff mit den Pfeiltasten und lasse Space dabei immer noch gedrückt => Kein Feuer (falsch)
- Ich höre auf das Schiff zu bewegen und halte immer noch Space gedrückt => weiterhin kein Feuer (falsch)

Beispiel 2
- Schiff steht still
- ich bewege das Schiff mit den Pfeiltasten
- Ich drücke Space und lasse es gedrückt wärend ich das Schiff weiter bewege => Dauerfeuer (richtig)
- Ich höre auf das Schiff zu bewegen und halte immer noch Space gedrückt => weiterhin Dauerfeuer (richtig)

Folgend noch einige Codeausschnitte:

Start des Mainloops in void Main. Aufruf der Methode zur Tastaturauswertung.
Code:
while(true) {
        ...
        evalInput();
}

Ausschnitt aus evalInput.
Code:
private void evalInput() {
        ...
        if(BSystem.bmoveUp) {
            if(Starship.getPosY() > 22)
                Starship.setPosY(Starship.getPosY()-2);
        }
        ...
        if(BSystem.bSpace) {

            // Nur abfeuern bei >500ms vergangen
            if(actSecs <= (prevSecs+500)) { }
            else {
                prevSecs = actSecs;
                GameSound.playSfx("laser");
                Schuss = new PrimaerWaffe("Beam"+Geschosse.size(), "laser_beam.gif",
                                          Starship.getPosX()+87,Starship.getPosY()+80,59,4,1,1);
                Geschosse.add(Schuss);
                GameWindow.AddEntity((iEntity)Schuss);
                BSystem.bSpace = false;
            }
        }
}

Ausschnitt aus keyPressed. keyReleased sieht entsprechend aus. bmoveUp ist einer der vielen boolean Werte.
Code:
public void keyPressed( KeyEvent e ) {
        ...
        if (e.getKeyCode() == KeyEvent.VK_UP) {
            bmoveUp = true;
        }
        ...
}
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück