2017-06-06 6 views
0

Ich benutze die Tastendruck-Event-Listener in vielen Animationen in der Verarbeitung js und hier ist ein Problem, das mich konsequent plagt. In diesem Beispiel habe ich gemacht, wenn ich den "d" Knopf drücke, bewegt sich ein Ball nach rechts. Tatsächlich ist der Ball stationär und der Boden bewegt sich nach links. Das Problem ist folgendes: Wenn ich 'd' drücke, wird der Ball fast augenblicklich mit der richtigen Geschwindigkeit geschleudert, hält dann aber einen Moment an, dann erreicht er die richtige Geschwindigkeit und fährt dann mit dieser Geschwindigkeit so lange fort wie ich 'd' halte. Ich weiß nicht, warum der Ball diese Geschwindigkeit nicht erreicht und dort bleibt, aber genau das würde ich gerne tun.Tastendruck Event Listener inkonsistente Bewegung in processing.js produzieren

Hier ist eine Geige, die zeigen kann, was ich meine:

https://jsfiddle.net/4s14wq4d/

Das Verfahren ist ganz einfach:

hill.prototype.moveRight = function() { 
    this.x -= 5; 
}; 

Und hier ist der Ereignis-Listener in Aktion:

var myCanvas = document.getElementById("myCanvas"); 
myCanvas.addEventListener("keypress", functionMove); 
function functionMove(e) { 
    if (e.keyCode == "100") { 
    for (var i = 0; i < hillArray.length; i++) { 
     hillArray[i].moveRight(); 
    } 
    } 
}; 
+0

Vielleicht möchten Sie mit keyup arbeiten und stattdessen werfen Sie einen Blick auf diese keyDown: https://stackoverflow.com/questions/14448981/remove-keydown-delay-in-javascript https://stackoverflow.com/questions/39952551/javascript-motion-on-key-hold – Cynigo

+0

Ich bin mir nicht sicher, warum die Verwendung von 'keyup' und 'keydown' dieses Ding nicht reagiert – Jozurcrunch

Antwort

1

Zunächst sollten Sie keine eigenen Ereignis-Listener hinzufügen. Die Verarbeitung gibt Ihnen Funktionen wie keyPressed() und keyReleased(). Benutze diese stattdessen.

Zweitens wollen Sie wahrscheinlich Variablen erstellen, die verfolgen, ob eine Taste gedrückt wird oder nicht. Etwas wie folgt aus:

var wPressed = false; 
var sPressed = false; 
var aPressed = false; 
var dPressed = false; 

Dann in der keyPressed() Funktion, würden Sie die entsprechende Variable auf true gesetzt und in der keyReleased() Funktion, würden Sie es auf false gesetzt.

Schließlich, in der draw() Funktion, würden Sie jede Variable überprüfen und das Richtige tun. Etwas wie folgt aus:

if(dPressed){ 
    for (var i = 0; i < hillArray.length; i++) { 
    hillArray[i].moveRight(); 
    } 
} 

(Randbemerkung: Wenn Sie alle Elemente um den gleichen Abstand zu bewegen, möchten Sie vielleicht nur eine einzige xOffset Variable oder etwas verwenden, die Sie verwenden, so Sie don‘ t müssen über jedes Einzelteil Schleife sein, um es einzeln zu bewegen.)

Shameless Selbstförderung: Ich schrieb ein Tutorium auf Benutzereingabe (einschließlich den oben genannten Ansatz) verfügbar here. Es ist für die regelmäßige Verarbeitung gedacht, aber alle Ideen sind in Processing.js identisch.

+0

Ich werde in Funktionen schauen, die Sie erwähnt haben und versuchen zu verstehen, was Funktionalität, auf die ich bisher verzichtet habe. Was die Nebenbemerkung anbelangt, nehme ich an, die Hügel zu schleifen, um sie zu bewegen, verlangsamt sie die Animation? Oder ist es (auch) eine ästhetische Sache? Meine Grundlagen sind lückenhaft, und je mehr Inhalt ich untersuchen kann, desto besser. Ich werde den von Ihnen bereitgestellten Link überprüfen. – Jozurcrunch

+0

Wenn Sie nicht von Tausenden einzelner Objekte sprechen, werden Sie wahrscheinlich keinen Unterschied in der Animationsgeschwindigkeit bemerken. Schließlich müssen Sie alle Objekte durchlaufen, um sie trotzdem zu zeichnen. Es ist eher ein "Mach nicht Arbeit, du musst nicht tun" -Prinzip. Sie haben alle denselben Offset, daher ist es einfacher, eine Nummer anstelle von 100 zu ändern.Aber ehrlich, du solltest mit allem gehen, was in deinem Gehirn Sinn macht. –

+0

Ich versuchte die boolesche Variable keyPressed in einer if-Anweisung und es scheint nicht zu funktionieren. In einem früheren Beitrag haben Sie angerufen, was ich im "Instanzmodus" verwendet habe. Soweit ich das beurteilen kann, schreibe ich meine Animationen in Javascript und sie werden in die Bearbeitung übersetzt. Ist das richtig? Jedenfalls, als ich versuchte, die gleiche Codezeile zu schreiben 'if (keyPressed && key ==' d ') {move something}' in einem Stück Code, das ich bei der Verarbeitung geschrieben habe, funktionierte es ganz gut. Ein Teil des Grundes, warum ich meine eigenen Event-Listener verwendet habe, war, dass ich kein Sthing wie key/mousePressed bekommen konnte. – Jozurcrunch