0

我在画布上有一艘宇宙飞船。它有速度,ship.vx并且ship.vy。当它距离画布边界 30 像素时,我设置ship.vx&ship.vy0沿船的相反方向移动背景对象。此刻,船被卡在了一个点上。这都很好。现在,如果我尝试将它向左向右(stuck at top/bottom)或自上而下(stuck at left/right)移动,它不会因为它卡在vx&vy设置为的点0

如果我朝相反的方向加速,则需要 5 秒才能选择它的速度(大约 2),所以它基本上在同一点持续 5 秒。

我试图不设置vy为何0时超出 x 轴,反之亦然,但船在另一个轴上保持缓慢移动。

所以我想要实现的是船在距离边界 30 px 时会卡住,但如果我尝试在其他 3 个方向上移动或加速,它会假装它没有卡住。

你们中有人知道任何机制吗?
谢谢。

function stuckShip(){
    if(
                (ship.x - ship.width < 0)  || 
                (ship.x + ship.width > w)  ||
                (ship.y + ship.height > h) ||
                (ship.y - ship.height < 0))
              {
        ship.vx = 0;
        ship.vy = 0;
     }

}


function againAndAgain(){
    var angle = ship.rotation;

    var x = Math.cos(angle);
    var y = Math.sin(angle);        

    var ax = x*thrust,
        ay = y*thrust;

    ship.vx += ax;
    ship.vy += ay;

            stuckShip();
            ship.draw(context);

}

document.addEventListener('keydown', function(e){
    switch(e.keyCode){
        case 38:
            thrust = 0.35;
        break;
        case 37:
            ship.rotation -= 3;
        break;
        case 39:
            ship.rotation += 3;
        break;


    }
}
4

2 回答 2

0

哈哈,很简单,把船的位置设置为离边界31px,

if(ship.x <= 30){
   ship.x = 30 + 1;
}

它的作用是,当船距离左边 30px 时,它会设置ship.x为 31,所以它永远不会被卡住,只是来回摆动 1px。我不确定这是否是一个完美的解决方案,但它不会在 5 秒内将船拉回。

于 2013-03-25T10:48:21.137 回答
0

根据对象在屏幕上的位置来操纵对象的速度以用于显示目的从来都不是最好的主意。通常您使用基于父容器的系统,因此您有一个主容器,所有对象(包括船)都是该容器的子容器,并且相对于主容器移动。现在您可以更新容器的位置,如果船的全局位置在该 30 像素范围内,则使其“锁定”在屏幕边缘。

于 2013-03-25T08:04:10.177 回答