有没有办法可以检查主游戏循环中的按键情况?

问题描述 投票:0回答:1

我有一个应该具有重力的 JavaScript 代码,但是当我尝试输入按键时,它完全停止工作。

我尝试将其从 if 语句更改为 switch 函数,但是,它仍然不起作用,并且它们没有任何错误。

这是我的代码:

const stage = document.getElementById("stage"); //Gets the canvas
const ctx = stage.getContext("2d"); //Context

const PX = 16;
const S = 25;

stage.width = (PX * S);
stage.height = (PX * S);

const playerimg = new Image(); //Player Image
const floorimg = new Image(); //Floor Image

var playerx = 0; //Player X
var playery = 0; //PLayer Y
var floorx = 0; //Floor X
var floory = (stage.height-16); //Floor Y


const imageLoader = new Set([playerimg, floorimg]);

imageLoader.forEach(img => {
  img.addEventListener("load", () => {
    imageLoader.delete(img);

    if (imageLoader.size === 0) main();
  });
});

function main() {
    const LEFT = 37, UP = 38, RIGHT = 39;
    
    window.addEventListener("keydown", e => {
    if (e.isComposing) return;
    e.preventDefault();
    
    
    let dx = 0, dy = 0;
    if (e.keycode == LEFT) {
        dx = -PX;
    } else if (e.keycode == UP) {
        if (playery != (floory-16)) {
            dy = PX;
        } else {
            dy = -PX;
        }
    } else if (e.keycode == RIGHT) {
        dx = PX;
    }
    
    playerx += dx;
    playery += dy;
    
    draw();
    });
    
    draw();
    setTimeout(main, 50);
}   

function draw() {
   // Clear everything
  ctx.clearRect(0, 0, stage.width, stage.height);
  
  // Draw a quick grid for debugging
  for (let c = 0; c < S; c += 1) {
    for (let r = 0; r < S; r += 1) {
      ctx.fillStyle = (c + (r % 2)) % 2 ? "#efefef" : "white"
      ctx.fillRect(c * PX, r * PX, PX, PX);
    }
  }

  // Draw player
  ctx.drawImage(playerimg, playerx, playery);
  
  floorx = 0;
  for (let c = 0; c < S; c += 1) {
    ctx.drawImage(floorimg, floorx, floory);
    floorx += 16;
   }
    
}



floorimg.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAB5JREFUOE9j/M/A8J+BAsA4agDDaBgwjIYBw7AIAwCl1B/xy1zUvwAAAABJRU5ErkJggg=="

playerimg.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAB5JREFUOE9jZPjP8J+BAsA4agDDaBgwjIYBw7AIAwCV5B/xAsMbygAAAABJRU5ErkJggg==";

HTML:

<html>
    <head>
        <title>BlockWork - Page 1</title>
    </head>
    <body>
        <h1>BlockWork Page</h1>

        <div class="stage">
            <canvas id="stage" width="400" height="400" style="border:1px solid #000000;"></canvas>
        </div>
        
        <a href="index.html">Previous</a>
    </body>
    <script type="text/javascript" src="../SCRIPT/scriptp1.js"></script>
</html>

有人有什么想法吗?非常需要,谢谢,我对 javascript 不太有经验。

javascript canvas
1个回答
0
投票

因为 JavaScript 区分大小写,所以您必须使用

e.keyCode
而不是
e.keycode
。这是固定代码:

const stage = document.getElementById("stage"); //Gets the canvas
const ctx = stage.getContext("2d"); //Context

const PX = 16;
const S = 25;

stage.width = (PX * S);
stage.height = (PX * S);

const playerimg = new Image(); //Player Image
const floorimg = new Image(); //Floor Image

var playerx = 0; //Player X
var playery = 0; //PLayer Y
var floorx = 0; //Floor X
var floory = (stage.height-16); //Floor Y


const imageLoader = new Set([playerimg, floorimg]);

imageLoader.forEach(img => {
  img.addEventListener("load", () => {
    imageLoader.delete(img);

    if (imageLoader.size === 0) main();
  });
});

function main() {
    const LEFT = 37, UP = 38, RIGHT = 39;
    
    window.addEventListener("keydown", e => {
    if (e.isComposing) return;
    e.preventDefault();
    
    
    let dx = 0, dy = 0;
    // Changed e.keycode to e.keyCode
    if (e.keyCode == LEFT) {
        dx = -PX;
    } else if (e.keyCode == UP) {
        if (playery != (floory-16)) {
            dy = PX;
        } else {
            dy = -PX;
        }
    } else if (e.keyCode == RIGHT) {
        dx = PX;
    }
    
    playerx += dx;
    playery += dy;
    
    draw();
    });
    
    draw();
    setTimeout(main, 50);
}   

function draw() {
   // Clear everything
  ctx.clearRect(0, 0, stage.width, stage.height);
  
  // Draw a quick grid for debugging
  for (let c = 0; c < S; c += 1) {
    for (let r = 0; r < S; r += 1) {
      ctx.fillStyle = (c + (r % 2)) % 2 ? "#efefef" : "white"
      ctx.fillRect(c * PX, r * PX, PX, PX);
    }
  }

  // Draw player
  ctx.drawImage(playerimg, playerx, playery);
  
  floorx = 0;
  for (let c = 0; c < S; c += 1) {
    ctx.drawImage(floorimg, floorx, floory);
    floorx += 16;
   }
    
}



floorimg.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAB5JREFUOE9j/M/A8J+BAsA4agDDaBgwjIYBw7AIAwCl1B/xy1zUvwAAAABJRU5ErkJggg=="

playerimg.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAB5JREFUOE9jZPjP8J+BAsA4agDDaBgwjIYBw7AIAwCV5B/xAsMbygAAAABJRU5ErkJggg==";
© www.soinside.com 2019 - 2024. All rights reserved.