在帆布弹跳球

时间:2014-11-10 20:26:59

标签: javascript html5 canvas

我试图让球在画布内反弹,但它不起作用。球被卡在“墙壁”上,我不明白为什么。有谁知道如何解决这个问题?

var can = document.querySelector("canvas");
var ctx = can.getContext("2d");

var canvasWidth = 500;
var canvasHeight = 400;

var radius = 30;
var pX = 60;
var pY = 50;

function draw() {
    ctx.clearRect(0, 0, canvasWidth, canvasHeight);
    ctx.beginPath();
    ctx.fillStyle = "red";
    ctx.arc(pX, pY, radius, 0, Math.PI * 2, false);
    ctx.fill();
    ctx.closePath();
}


function animate() {

    var vX = 3;
    var vY = 3;

    if (pY >= canvasHeight - radius) {
        vY = -vY;
    }


    if (pX >= canvasWidth - radius) {
        vX = -vX;
    }

    pX += vX;
    pY += vY;

    draw();
    requestAnimationFrame(animate);
}

animate();

1 个答案:

答案 0 :(得分:2)

您的碰撞检测条件仅考虑底壁和右侧墙。您需要为顶壁和左侧墙添加条件。像

这样的东西
if (pY >= canvasHeight - radius || pY <= radius) {
    vY = -vY;
}


if (pX >= canvasWidth - radius || pX <= radius) {
    vX = -vX;
}

您正在看到碰撞检测的奇怪行为,因为vX和vY在本地声明并在动画中初始化。这意味着,每次调用动画时,都会重新初始化。

只需将vX和vY声明移出animate函数即可。

编辑:JsFiddle如果你想看到它的实际效果:http://jsfiddle.net/y45fhko7/