as3 - 玩家在物体中移动

时间:2015-11-03 13:12:05

标签: actionscript-3

所以我在玩家触摸物体时进行碰撞检测。当它碰到物体时,你会在碰撞时移动和停止,但是,例如,如果我按下D键向右移动,然后我按下A键放开,然后玩家开始在物体中移动。

这是我的播放器移动代码。

public function onKeyDown(event: KeyboardEvent): void
{
    if (event.keyCode == Keyboard.D)
    {
        isRight = true;
    }
    if (event.keyCode == Keyboard.A)
    {
        isLeft = true;
    }
    if (event.keyCode == Keyboard.W)
    {
        isUp = true;
    }
    if (event.keyCode == Keyboard.S)
    {
        isDown = true;
    }
}

private function onKeyUp(event: KeyboardEvent): void
    {
        if (event.keyCode == Keyboard.A || event.keyCode == Keyboard.D)
        {
            vx = 0;
        }
        else if (event.keyCode == Keyboard.S || event.keyCode == Keyboard.W)
        {
            vy = 0;
        }
    }

public function onEnterFrame(event: Event): void
{
    if (isRight)
    {
        vx = 5;
        x += vx;
    }
    if (isLeft)
    {
        vx = 5;
        x -= vy;
    }
    if (isUp)
    {
        vx = 5;
        y -= vy;
    }
    if (isDown)
    {
        vx = 5;
        y += vy;
    }

    //collision detection
        if (player.collisionArea.hitTestObject(wall0))
        {
            player.x -= vx;
            player.y -= vy;
        }
}

1 个答案:

答案 0 :(得分:0)

您的问题是,vx始终是5。因此,您从5中减去x的一个方向,即添加它的另一个方向。

然而,在你的碰撞if语句中,你总是从玩家的x中减去它(如果向左移动,将继续向左移动玩家,直到它超过它碰撞的对象)。

此外,在isLeft检查中,您正在减去vy值,但我想您实际上要减去vx值。同样,在isUp / isDown项检查中,您将vx var设置为5,但您似乎应该设置vy

由于不清楚xy在播放器的上下文中会有什么影响,因此很难给出一个确切的代码示例。

最有可能的是,你只需要将玩家移动到墙边缘,然后根据玩家的方向选择侧面:

    //collision detection
    if (player.collisionArea.hitTestObject(wall0))
    {

        //if the player x is colliding
        if(player.x + player.width > wall0.x && player.x < wall0.x + wall0.width){
            player.x = isRight ? wall0.x - player.width : wall0.x + wall0.width;
        }else if(player.y + player.height > wall0.y && player.y < wall0.y + wall0.height){
            player.y = isDown ? wall0.y - player.height : wall0.y + wall0.height;
        }
    }