用键盘移动玩家图像

时间:2016-11-17 16:57:43

标签: javascript

嘿所以我正在制作一个平台游戏,之前,玩家只是一个矩形。现在我已将其更改为图像,但它们的键不会移动它。如何让按键WASD移动玩家图像?我之前做过,但我忘了我是怎么做到的。

(function () {
    var requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
    window.requestAnimationFrame = requestAnimationFrame;
})();

var canvas = document.getElementById("canvas"),
    ctx = canvas.getContext("2d"),
    width = 1000,
    height = 200,
    player = {
        x: width / 2,
        y: height - 15,
        width: 48,
        height: 64,
        speed: 3,
        velX: 0,
        velY: 0,
        jumping: false,
        grounded: false,
        count: 0,
        img: new Image()
    },
    keys = [],
    friction = 0.8,
    gravity = 0.3;
    player.img.src = "img/playersheet.png";
    player.img.onload = draw;

var boxes = [];

// dimensions
boxes.push({
    x: 0,
    y: 0,
    width: 10,
    height: height
});
boxes.push({
    x: 0,
    y: height - 2,
    width: width,
    height: 50
});
boxes.push({
    x: width - 10,
    y: 0,
    width: 50,
    height: height
});

boxes.push({
    x: 120,
    y: 100,
    width: 80,
    height: 80
});
boxes.push({
    x: 250,
    y: 150,
    width: 80,
    height: 80
});
boxes.push({
    x: 400,
    y: 180,
    width: 80,
    height: 80
});
boxes.push({
    x: 270,
    y: 150,
    width: 40,
    height: 40
});

canvas.width = width;
canvas.height = height;
var fps = 3;
var msPerFrame = 1000 / fps;
var startTime;

function draw() {
  if (!startTime) startTime = Date.now();
  var elapsedTime = Date.now() - startTime;
  var spriteIndex = Math.floor(elapsedTime / msPerFrame) % 3;
  requestAnimationFrame(draw);
  document.getElementById('index').innerHTML = spriteIndex;
  sprX = (spriteIndex % 3) * 170;
  sprY = Math.floor(spriteIndex / 3) * 350;
  ctx.drawImage(player.img, sprX, sprY, 170, 350, 150, 20, 48, 48);
}

function update() {
    // check keys
    if (keys[87] || keys[32]) {
        // up arrow or space
        if (!player.jumping && player.grounded) {
            player.jumping = true;
            player.grounded = false;
            player.velY = -player.speed * 2;
        }
    }
    if (keys[68]) {
        // right arrow
        if (player.velX < player.speed) {
            player.velX++;
            //player.img.src = "img/player_r.png";
        }
    }
    if (keys[65]) {
        // left arrow
        if (player.velX > -player.speed) {
            player.velX--;
            //player.img.src = "img/player.png";
        }
    }
     if (keys[83]) {
        // down arrow
            //player.img.src = "img/player_crouch.png";
    }

    player.velX *= friction;
    player.velY += gravity;

    ctx.clearRect(0, 0, width, height);
    ctx.fillStyle = "black";
    ctx.beginPath();
    
    player.grounded = false;
    for (var i = 0; i < boxes.length; i++) {
        ctx.rect(boxes[i].x, boxes[i].y, boxes[i].width, boxes[i].height);
        
        var dir = colCheck(player, boxes[i]);

        if (dir === "l" || dir === "r") {
            player.velX = 0;
            player.jumping = false;

        } else if (dir === "b") {
            player.grounded = true;
            player.jumping = false;
        } else if (dir === "t") {
            player.velY *= -1;
        }

    }
    
    if(player.grounded){
         player.velY = 0;
    }
    
    player.x += player.velX;
    player.y += player.velY;

    ctx.fill();
    draw();
    

    requestAnimationFrame(update);
}



function colCheck(shapeA, shapeB) {
    // get the vectors to check against
    var vX = (shapeA.x + (shapeA.width / 2)) - (shapeB.x + (shapeB.width / 2)),
        vY = (shapeA.y + (shapeA.height / 2)) - (shapeB.y + (shapeB.height / 2)),
        // add the half widths and half heights of the objects
        hWidths = (shapeA.width / 2) + (shapeB.width / 2),
        hHeights = (shapeA.height / 2) + (shapeB.height / 2),
        colDir = null;

    // if the x and y vector are less than the half width or half height, they we must be inside the object, causing a collision
    if (Math.abs(vX) < hWidths && Math.abs(vY) < hHeights) {
        // figures out on which side we are colliding (top, bottom, left, or right)
        var oX = hWidths - Math.abs(vX),
            oY = hHeights - Math.abs(vY);
        if (oX >= oY) {
            if (vY > 0) {
                colDir = "t";
                shapeA.y += oY;
            } else {
                colDir = "b";
                shapeA.y -= oY;
            }
        } else {
            if (vX > 0) {
                colDir = "l";
                shapeA.x += oX;
            } else {
                colDir = "r";
                shapeA.x -= oX;
            }
        }
    }
    return colDir;
}

document.body.addEventListener("keydown", function (e) {
    keys[e.keyCode] = true;
});

document.body.addEventListener("keyup", function (e) {
    keys[e.keyCode] = false;
});


window.addEventListener("load", function () {
    update();
});
<head>
    <title>Platformer Game</title>
</head>
<body>
  <h3>Arrow keys to move, and space to jump</h3>
  <div>
  Sprite #<span id="index"></span>
</div>
    <canvas id="canvas"></canvas>
    <style>
    canvas {
    border:1px solid #d3d3d3;
    background-color: #f1f1f1;
	}
	</style>
</body>

1 个答案:

答案 0 :(得分:0)

drawImage中的第6和第7个参数是常量。改变它:

 ctx.drawImage(player.img, sprX, sprY, 170, 350, player.x, player.y, 48, 48);