简体   繁体   English

HTML5 / Javascript-我的用户触发的画布动画不稳定

[英]HTML5/Javascript - My user-triggered canvas animation choppy

I have a simple concept. 我有一个简单的概念。 When the player presses W, A, S, or D, an image on the canvas moves accordingly. 当播放器按W,A,S或D时,画布上的图像会相应移动。 However, this results in very choppy animation, and I'm not sure why(though I think it has something to do with my event listeners). 但是,这会导致动画非常不稳定,而且我不确定为什么(尽管我认为这与事件监听器有关)。 Below is my code. 下面是我的代码。

var playerXPos = 10;
var playerYPos = 10;
var playerImg = new Image();
playerImg.src = "knight.png";

function mainGameLoop(){
    window.requestAnimationFrame(mainGameLoop);
    c = document.getElementById("gameCanvas").getContext("2d");


    c.clearRect(0,0,1000,500);

    c.drawImage(playerImg,playerXPos,playerYPos);
}
window.requestAnimationFrame(mainGameLoop);


    window.addEventListener("keydown", onKeyDown, false);
    window.addEventListener("keyup", onKeyUp, false);
    window.addEventListener("keypress", onKeyPress, false);

    function onKeyDown(e){
        var keyCode = e.keyCode;
        switch(keyCode){
            case 87: //w
                onKeyW();
            break;
            case 65: //a
                onKeyA();
            break;
            case 83: //s
                onKeyS();
            break;
            case 68: //d
                onKeyD();
            break;
        }



function onKeyW(){
    playerYPos -= 5;
}
function onKeyA(){
    playerXPos -= 5;
}
function onKeyS(){
    playerYPos += 5;
}
function onKeyD(){
    playerXPos += 5;
}

Why is it doing this? 为什么这样做呢? Any help is appreciated! 任何帮助表示赞赏!

EDIT: As a side note, I have done this before using booleans(when the w key is pressed a keyW variable becomes true, and in the mainGameLoop there is if(keyW == true){playerYPos -= 5;} ) 编辑:作为旁注,我在使用布尔值之前就已经做到了这一点(当按下w键时, keyW变量变为true,并且在mainGameLoop中有if(keyW == true){playerYPos -= 5;}

Jsfiddle 的jsfiddle

Here you go: jsFiddle 在这里,您可以去: jsFiddle

You don't want to change the position each key event. 您不想更改每个按键事件的位置。 Also, you need to take into account the time between frames. 另外,您需要考虑帧之间的时间。 Adding any static amount per frame will always be jumpy, since one frame might be 30ms since the last or it might be 60ms, depending on many factors. 每帧添加任何静态量总是很容易的,因为一帧到最后一帧可能是30ms,或者可能是60ms,这取决于许多因素。

var playerXPos = 10;
var playerYPos = 10;
var playerSpeed = 0.3; // this is in pixels per ms

var aPressed = false;
var wPressed = false;
var sPressed = false;
var dPressed = false;
var lastTime = null;
function mainGameLoop(timestamp) {
    var delta = timestamp - (lastTime || timestamp);

    if(aPressed){
        playerXPos -= playerSpeed * delta;
    }
    if(dPressed){
        playerXPos += playerSpeed * delta;
    }
    if(wPressed){
        playerYPos -= playerSpeed * delta;
    }
    if(sPressed){
        playerYPos += playerSpeed * delta;
    }

    window.requestAnimationFrame(mainGameLoop);
    c = document.getElementById("gameCanvas").getContext("2d");

    c.clearRect(0, 0, 1000, 500);
    player();
    lastTime = timestamp;
}
window.requestAnimationFrame(mainGameLoop);

function player() {
    var playerImg = new Image();
    //playerImg.src = "knight.png";
    c.fillRect(playerXPos, playerYPos,100,100);
}

function onKeyW(pressed) {
    wPressed = pressed;
}

function onKeyA(pressed) {
    aPressed = pressed;
}

function onKeyS(pressed) {
    sPressed = pressed;
}

function onKeyD(pressed) {
    dPressed = pressed;
}

window.addEventListener("keydown", onKeyDown, false);

function onKeyDown(e) {
    var keyCode = e.keyCode;
    switch (keyCode) {
        case 87:
            //w
            onKeyW(true);
            console.log("bro");
            break;
        case 65:
            //a
            onKeyA(true);
            break;
        case 83:
            //s
            onKeyS(true);
            break;
        case 68:
            //d
            onKeyD(true);
            break;
    }
}

window.addEventListener("keyup", onKeyUp, false);

function onKeyUp(e) {
    var keyCode = e.keyCode;
    switch (keyCode) {
        case 87:
            //w
            onKeyW(false);
            console.log("bro");
            break;
        case 65:
            //a
            onKeyA(false);
            break;
        case 83:
            //s
            onKeyS(false);
            break;
        case 68:
            //d
            onKeyD(false);
            break;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM