Sie müssen die Bewegungslogik aus dem Ereignis-Listener entfernen. Lassen Sie das Schlüsselereignis nur den aktuellen Status jedes Schlüssels protokollieren (nach oben oder unten), dann überprüfen Sie in der Hauptschleife den Status und verschieben Sie das Spiel nach Bedarf.
Da ich mir nicht sicher bin, ob die Bewegung konstant sein soll oder nur beim Drücken, habe ich die Option zur Änderung des Verhaltens mit der Konstantenflagge MOVE_ONLY_ON_PRESS
wenn echte Bewegung nur wenn eine Presse zuerst erkannt wird. Damit keine Tastenanschläge verpasst werden, lösche ich das Schlüsselflag in der Hauptschleife.
Im Folgenden finden Sie ein Beispiel für die Verwendung der Tastatur für ein Spiel.
// global key log;
var keyState = [];
const KEY_UP = 38;
const KEY_DOWN = 40;
const KEY_LEFT = 37;
const KEY_RIGHT = 39;
// Player
var player = {};
player.x = 100;
player.y = 100;
const MOVE_SPEED = 2;
const MOVE_ONLY_ON_PRESS = false; // This will toggle constant movement or only on press
// from your code
window.onkeydown = window.onkeyup = function (e) {
if (MOVE_ONLY_ON_PRESS) {
if (e.type === 'keydown') {
keyState[e.keyCode] = true;
}
} else {
keyState[e.keyCode] = e.type == 'keydown';
}
}
// in the main loop;
function update(timer) {
// you dont need to test for the combinations (ie up left) when its just simple movement
if (keyState[KEY_UP]) {
player.y -= MOVE_SPEED;
if (MOVE_ONLY_ON_PRESS) { keyState[KEY_UP] = false; }
}
if (keyState[KEY_DOWN]) {
player.y += MOVE_SPEED;
if (MOVE_ONLY_ON_PRESS) { keyState[KEY_DOWN] = false; }
}
if (keyState[KEY_LEFT]) {
player.x -= MOVE_SPEED;
if (MOVE_ONLY_ON_PRESS) { keyState[KEY_LEFT] = false; }
}
if (keyState[KEY_RIGHT]) {
player.x += MOVE_SPEED;
if (MOVE_ONLY_ON_PRESS) { keyState[KEY_RIGHT] = false; }
}
requestAnimationFrame(update);
}
requestAnimationFrame(update);
Bitfelder.
Eine andere Möglichkeit, die Pfeiltasten zu vereinfachen, besteht darin, die ersten 4 Bits einer Zahl entsprechend einer Taste zu setzen, ein Bit pro Taste, dann ist es einfach, Kombinationen von Tasten als jede der 16 möglichen Kombinationen zu testen hat eine eindeutige Nummer. Sie könnten auf diese Weise viele weitere Schlüssel zuordnen, aber es wird ein wenig unpraktisch, wenn Sie zu weit gehen. sie
var arrowBits = 0; // the value to hold the bits
const KEY_BITS = [4,1,8,2]; // left up right down
const KEY_MASKS = [0b1011,0b1110,0b0111,0b1101]; // left up right down
window.onkeydown = window.onkeyup = function (e) {
if(e.keyCode >= 37 && e.keyCode <41){
if(e.type === "keydown"){
arrowKeys |= KEY_BITS[e.keyCode - 37];
}else{
arrowKeys &= KEY_MASKS[e.keyCode - 37];
}
}
}
Dies sind 8 der 16 möglichen Kombinationen
So setzen
// postfix U,D,L,R for Up down left right
const KEY_U = 1;
const KEY_D = 2;
const KEY_L = 4;
const KEY_R = 8;
const KEY_UL = KEY_U + KEY_L; // up left
const KEY_UR = KEY_U + KEY_R; // up Right
const KEY_DL = KEY_D + KEY_L; //
const KEY_DR = KEY_D + KEY_R; //
Dies ist, wie Sie dann testen
if ((arrowBits & KEY_UL) === KEY_UL) { // is UP and LEFT only down
if (arrowBits & KEY_UL) { // is Up left down (down and right may also be down)
if ((arrowBits & KEY_U) === KEY_U) { // is Up only down
if (arrowBits & KEY_U) { // is Up down (any other key may be down)
if (!(arrowBits & KEY_U)) { // is Up up (any other key may be down)
if (!arrowBits) { // no keys are down
if (arrowBits) { // any one or more keys are down
Schöne Perspektive. In meiner Situation muss ich jedoch nach Kombinationen suchen. Dies liegt daran, dass ich ändern muss, welcher Teil des Sprite-Blatts verwendet wird, wenn jede Richtung gedrückt wird. Wenn ich jedoch nur vier verschiedene Richtungen verwende, wäre das in Ordnung. Ich kann wahrscheinlich einfach eine if-Anweisung hinzufügen, die auf den reziproken Wert prüft, ob mehrere keystates gleichzeitig gedrückt werden, und dann einen else-Block verwenden, der das ausführt, was Sie geschrieben haben. – Streamer
@Azurasky Normalerweise mache ich die Pfeiltasten zu einem einzigen Wert Einstellung zuordnen die Einstellung der Bits 0-3 nach oben, unten, links, rechts. Dann kann ich nach einer von 16 möglichen Kombinationen suchen oder einfach ein bisschen maskieren, um zu sehen, ob die Taste gedrückt ist. ZB Up Bit 0 zum Setzen von 'keyMap | = 1' zum Löschen von' keyMap & = 0b1110' und wenn ich nach UP, LEFT (Bits 0,2) 'if (keyMap === 0b0101) {'oder if (keyMap === 5) '(0b ist das binäre Zahlenpräfix und 0x ist das hexadezimale Präfix, das für das Arbeiten mit Bitfeldern praktisch ist) – Blindman67
Oh Mann, dieses Zeug ist schwer zu verdauen. Ich schaue mir etwas Dokumentation über Bitfelder an (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators) und habe gerade erfahren, dass .toString (2) auf eine Zahl gibt ihre binäre Darstellung zurück. Deine Antwort ging von gut zu großartig nach deinem Schnitt! Ich lerne so viel. – Streamer