Zurück   Flashforum > Flash > ActionScript > Spielkonzepte und Spieleprogrammierung

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 05-06-2007, 10:51   #1 (permalink)
Neuer User
 
Registriert seit: Dec 2002
Beiträge: 14
Question Mehrere Tasten gleichzeitig benutzen

Hallo, ich habe folgendes Problem:

Für eine Spielsteuerung sollen gleichzeitig zwei Paddels bewegt werden können. Pro Paddel gibt es 2 Tasten (für "hoch" und "runter"). onKeyDown wird der entsprechende Paddel in die entsprechende Richtung bewegt, onKeyUp wird er gestoppt. Das funktioniert auch auf den ersten Blick.
Wenn ich nun aber erst eine Taste gedrückt halte,
dann eine weitere Taste gedrückt halte
und am Ende erst die erste Taste loslasse und dann erst die zweite,
läuft der Paddel für die erste Taste weiter.
D.h. für mich, sobald ich zusätzlich eine zweite Taste drücke, springt der Fokus des Listeners auf diese Taste und ein onKeyUp wird für die erste Taste nicht mehr registriert!

Was kann ich machen, um dieses Problem zu verhindern?

Zu meinem Code:
Ich habe einen Keylistener. (Vielleicht liegt da das Problem? Wüsste aber nicht, wie ich es anders machen soll.)

PHP-Code:
Key.addListener(this);
this.onKeyDown = function() { 
    var 
taste Key.getCode();
    
// Cursor-UP
    
if (taste == 38) {
        
this.paddel_2.up true;
    }
    
// Cursor-DOWN
    
if (taste == 40) {
        
this.paddel_2.down true;
    }
    
// A
    
if (taste == 65) {
        
this.paddel_1.up true;
    }
    
// Y 
    
if (taste == 89) {
        
this.paddel_1.down true;
    }
}
this.onKeyUp = function() { 
    var 
taste Key.getCode();
    
// Cursor-UP
    
if (taste == 38) {
        
this.paddel_2.up false;
    }
    
// Cursor-DOWN
    
if (taste == 40) {
        
this.paddel_2.down false;
    }
    
// A
    
if (taste == 65) {
        
this.paddel_1.up false;
    }
    
// Y
    
if (taste == 89) {
        
this.paddel_1.down false;
    }

onEnterFrame wird die Bewegung ausgeführt. (Hätte ich auch direkt in die Key-Sache reinschreiben können - dann gibt es allerdings am Anfang eine leichte Verzögerung bevor sich der Paddel in Bewegung setzt.)

? Hat jemand eine Idee ?
jotox ist offline   Mit Zitat antworten
Alt 05-06-2007, 11:27   #2 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Ich hab für sowas mal ne Klasse geschrieben, die man als Ersatz für die Key-Klasse verwenden kann.
Diese leitet die Events der Key Klasse einfach weiter, behebt aber das Problem das du beschrieben hast, indem sie für jede Taste, die gedrückt wird, ein Intervall startet, das regelmäßig mit Key.isDown überprüft, ob die Taste noch gedrückt ist, und gegebenenfalls das entsprechende onkeyUp-Event schmeißt.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 05-06-2007, 23:50   #3 (permalink)
Neuer User
 
Registriert seit: Dec 2002
Beiträge: 14
Man, ja, einfach zusätzlich an alle onKeyDown-Abfragen jeweils noch ein else ranhängen! Ich hatte alles mögliche probiert, aber auf das Naheliegendste bin ich nicht gekommen.
Det funzt!!!! Merci!
jotox ist offline   Mit Zitat antworten
Alt 06-06-2007, 08:54   #4 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Das meinte ich zwar nicht, aber wenn es in deinem Fall funktioniert ...

Aber irgendwie verstehe ich nicht, wie dann bei dir gleichzeitig mehrere Tasten abgefragt werden sollen, schließlich macht ja dann jeder neue Tastendruck alle vorherigen wieder platt, oder nicht?
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 07-06-2007, 08:57   #5 (permalink)
Neuer User
 
Registriert seit: Dec 2002
Beiträge: 14
Deshalb auch der Umweg über this.paddel_1.up = true etc. als Schalter. Die eigentliche Bewegung wird an anderer Stelle onEnterFrame ausgeführt.

Klingt nach keiner eleganten Lösung, aber was besseres habe ich nicht hinbekommen. Ein anderer Gedanke war auch der - mehrere separate Tasten erfordern evt. mehrere Listener - und habe einfach mehrere Listener eingebaut . Das hat aber nichts gebracht.
jotox ist offline   Mit Zitat antworten
Alt 07-06-2007, 17:09   #6 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Vielleicht habe ich dich falsch verstanden, wie sieht denn jetzt deine Lösung aus?
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 07-06-2007, 22:27   #7 (permalink)
Neuer User
 
Registriert seit: Dec 2002
Beiträge: 14
Die sieht jetzt so aus:
PHP-Code:
Key.addListener(this);
this.onKeyDown = function() { 
    var 
taste Key.getCode();
    
// Cursor-UP
    
if (taste == 38) {
        
this.paddel_2.up true;
        
this.paddel_2.down false;
    } else {
        
this.paddel_2.up false;
    }
    
// Cursor-DOWN
    
if (taste == 40) {
        
this.paddel_2.down true;
        
this.paddel_2.up false;
    } else {
        
this.paddel_2.down false;
    }
    
// A
    
if (taste == 65) {
        
this.paddel_1.up true;
        
this.paddel_1.down false;
    } else {
        
this.paddel_1.up false;
    }
    
// Y 
    
if (taste == 89) {
        
this.paddel_1.down true;
        
this.paddel_1.up false;
    } else {
        
this.paddel_1.down false;
    }
}
this.onKeyUp = function() { 
    var 
taste Key.getCode();
    
// Cursor-UP
    
if (taste == 38this.paddel_2.up false;
    
// Cursor-DOWN
    
if (taste == 40this.paddel_2.down false;
    
// A
    
if (taste == 65this.paddel_1.up false;
    
// Y
    
if (taste == 89this.paddel_1.down false;
}

this.onEnterFrame = function() {
    
//
    // Paddel bewegen
    //
    
if (this.paddel_1.up && (this.paddel_1._y > -this.paddel_1._height)) {
        
this.paddel_1._y -= paddelSpeed;
    } else if (
this.paddel_1.down && this.paddel_1._y spielfeldHoehe+this.paddel_1._height) {
        
this.paddel_1._y += paddelSpeed;
    }
    if (
this.paddel_2.up && (this.paddel_2._y > -this.paddel_2._height)) {
        
this.paddel_2._y -= paddelSpeed;
    } else if (
this.paddel_2.down && this.paddel_2._y spielfeldHoehe+this.paddel_2._height) {
        
this.paddel_2._y += paddelSpeed;
    }

jotox ist offline   Mit Zitat antworten
Alt 09-06-2007, 15:10   #8 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
OK, gute Lösung. Im Flash-Player 7 wirst du allerdings nimmernoch den Bug haben, dass bei fogender Tastendruck Reihenfolge der erste Tastendruck nie aufgelöst wird:
Code:
A drücken
UP drücken
DOWN drücken
DOWN loslassen
UP loslassen
A loslassen (das hier wird nicht mehr bei dir ankommen)
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 10-06-2007, 09:39   #9 (permalink)
Neuer User
 
Registriert seit: Dec 2002
Beiträge: 14
Da hast du völlig recht - und das nicht erst seit dem letzten Posting! (Frag mich, was ich hier die ganze Zeit mache? Testen kann man das wohl nicht nennen! )
Ich konnte wirklich immer nur eine Taste benutzen.
Habe dann in meiner else-Anweisungen noch Key.isDown bemüht:
PHP-Code:
if (!Key.isDown(38)) this.pong.schlaeger_2.up false
... und jetzt habe ich auch wieder meinen Bug, wie du sagtest.

Habe am Anfang angenommen, dass der Listener sich einfach immer auf den neuen Key "konzentriert" und man ihn daran "erinnern" muss, dass da noch ein anderer war. Das scheint ja auch wirklich so zu sein. Das Problem kommt, wenn der neueste Key losgelassen wurde und man sich für das Erinnern des Listener einen anderen Weg suchen muss.

Ich stehe also wieder ganz am Anfang. Habe mir nochmal dein erstes Posting durchgelesen und werde das jetzt versuchen.

Dank dir für deine Geduld!

Geändert von jotox (10-06-2007 um 10:37 Uhr)
jotox ist offline   Mit Zitat antworten
Alt 10-06-2007, 11:27   #10 (permalink)
Neuer User
 
Registriert seit: Dec 2002
Beiträge: 14
Das mit der Klasse und setInterval habe ich für s erste nicht hinbekommen. Meine Aternativlösung: Ich habe die else-Anweisungen wieder rausgenommen und rufe jetzt onEnterFrame eine Funktion auf, die bei allen 4 Tasten auf !Key.isDown reagiert.

setInterval wäre sicherlich besser gewesen, aber soweit funktionierts jetzt erstmal. Vielleicht kannst du ja deine Lösung auch nochmal posten - für den Lerneffekt.

Dank dir auf jeden Fall!

Geändert von jotox (10-06-2007 um 11:31 Uhr)
jotox ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele