JS: Tastatureingabe hängt & mehrere Tasten gleichzeitig

sentropie

Grünschnabel
Hallo,

ich habe zwei Probleme im Zusammenhang mit JavaScript und der korrekten Verarbeitung von Tastatureingaben.

Zum einen "hakt"/hängt das Ganze, wenn man eine Taste gedrückt hält: Ich drücke also die linke Pfeiltaste und halte sie gedrückt, der Spielstein bewegt sich kurz, hält an und bewegt sich erst nach diesem kurzen Hänger ununterbrochen weiter.
Das zweite Problem ist, dass man nicht mehrere Tasten gleichzeitig abfragen kann. 100%ig gleichzeitig geht es nicht, das ist mir schon klar, aber irgendwie muss das doch gehen, dass es zumindest fast danach aussieht. ;) Also das sich der Spielstein diagonal bewegen kann, wenn man Pfeiltaste links und oben drückt, zum Beispiel.
Was ich bisher schon erfolglos probiert habe: verschiedene Events ausprobiert (onkeypress, -up, -down); gleichzeitiges Abfragen (aber der event.keyCode ist ja leider kein Array o.ä.).

Hier der Quellcode:
Code:
	function Init()
	{
        ctx = document.getElementById("canvas").getContext("2d");    
            
		xBall = 160;
		yBall = 400;
		speed = 4;
            
		keyLeft = 37;
		keyUp = 38;
		keyRight = 39;
		keyDown = 40;            		
    }
        
    function Draw()
	{                                    
		//the gamefield
		ctx.fillStyle = "rgba(0, 0, 0, 1)";
		ctx.fillRect(10, 10, 300, 500);
	}
        
	function Move(event)
	{
		if (!event)
			event = window.event;                        
            
		ctx.fillStyle = "black";
		ctx.fillRect(xBall, yBall, 30, 20);          
            
		switch (event.keyCode)
		{
			case keyLeft: 
				xBall -= speed; break;
			case keyRight:
				xBall += speed; break;
			case keyUp:
				yBall -= speed; break; 
			case keyDown:
				yBall += speed; break;                       
		}
                                                    
		ctx.fillStyle = "white";
		ctx.fillRect(xBall, yBall, 30, 20);
	}

Der Aufruf erfolgt so: <body onload="javascript:Init(); Draw(); Move(event);" onkeypress="javascript:Move(event);">

Abrufbar unter: http://www.php-xhtml.de/pub/html5/arkanoid.html

Ich freue mich auf Ideen und Ratschläge! :)
 
Deine beiden Probleme liegen an falschem Design. Das Problem mit dem "ruckeln" ist ganz einfach. Geh mal oben in die Adressleiste und halte irgendeinen Buchstaben gedrückt. Er erscheint sofort und nach kurzer Pause kommen ganze viele weitere. Ohne die Pause würde man beim schreiben ständig doppelte und dreifache Buchstaben tippen, wenn man die Finger nicht sehr schnell wieder von der Tastatur hebt. Die Verzögerung und die anschließende "Schnelligkeit" der weiteren Buchstaben lässt sich auf Betriebssystem-Ebene einstellen. Deine Bewegungsgeschwindigkeit hängt also von äußeren Faktoren ab.

Das Problem mit der Verzögerung und das mit den mehreren Tasten lässt sich durch ein besseres Design lösen.

Erstmal brauchst du einen Main-Loop. Da es in JavaScript kein "sleep" gibt, nimmst du dafür z.B. setIntervall oder besser setTimeout (denn je nach dauer der Berechnungen sind nicht alle Schritte gleich lang voneinander entfernt).
Des weiteren reagierst du anstatt auf keypress ab sofort auf keydown und keyup. Jetzt kannst du nämlich selbst eine Liste aller gedrückten Tasten führen.
 
Zurück