首页 > 解决方案 > ActionScript3:我应该使用什么代码来阻止玩家控制的精灵移动?

问题描述

我对 ActionScript3 非常陌生,正在制作一款小行星类型的游戏。现在,当你松开移动按钮时,船会继续直线漂浮,我希望能够阻止这种情况发生。我正在考虑一个用于制动的专用按钮,例如 b 键,或者如果没有按下这些键来停止运动,以更容易者为准。就像我说的那样,我对 AS3 真的很陌生,所以甚至不确定我的代码的哪一部分使它们保持直线飞行。以下是控制运动的代码供参考:

// register key presses
        public function keyDownFunction(event:KeyboardEvent) {
            if (event.keyCode == 37) {
                    leftArrow = true;
            } else if (event.keyCode == 39) {
                    rightArrow = true;
            } else if (event.keyCode == 38) {
                    upArrow = true;
            //Add event listener for down arrow
            } else if (event.keyCode == 40) {
                    downArrow = true;
                    // show thruster
                    if (gameMode == "play") ship.gotoAndStop(2);
            } else if (event.keyCode == 32) { // space
                    var channel:SoundChannel = shootSound.play();
                    newMissile();
            } else if (event.keyCode == 90) { // z
                    startShield(false);
                    var channel:SoundChannel = shieldSound.play();
            }
        }

        // register key ups
        public function keyUpFunction(event:KeyboardEvent) {
            if (event.keyCode == 37) {
                leftArrow = false;
            } else if (event.keyCode == 39) {
                rightArrow = false;
            } else if (event.keyCode == 38) {
                upArrow = false;
            //Add listener for down arrow
            } else if (event.keyCode == 40) {
                downArrow = false;
                // remove thruster
                if (gameMode == "play") ship.gotoAndStop(1);
            }
        }

        // animate ship
        public function moveShip(timeDiff:uint) {

            // rotate and thrust
            if (leftArrow) {
                ship.rotation -= shipRotationSpeed*timeDiff;
            } else if (rightArrow) {
                ship.rotation += shipRotationSpeed*timeDiff;
            } else if (upArrow) {
                shipMoveX += Math.cos(Math.PI*ship.rotation/180)*thrustPower;
                shipMoveY += Math.sin(Math.PI*ship.rotation/180)*thrustPower;
                //Added down arrow movement to allow player to move backwards
            } else if (downArrow) {
                shipMoveX -= Math.cos(Math.PI*ship.rotation/180)*thrustPower;
                shipMoveY -= Math.sin(Math.PI*ship.rotation/180)*thrustPower;
            }

            // move
            ship.x += shipMoveX;
            ship.y += shipMoveY;

标签: actionscript-3animationflash

解决方案


我同意您的代码中存在一些逻辑问题。你的船将一直移动到审判日,因为负责它运动速度的两个变量 - shipMoveX 和 shipMoveY - 不会随着时间的推移而自动降级。

现在有数以千计的方法可以实现这一点,但让我们保持简单。您正在使用一个名为thrustPower的类变量- 确保将其设置为0.1并且shipMoveXshipMoveY的值都是0。另外添加这些类变量:

private var thrustHorizontal:Number = 0;
private var thrustVertical:Number = 0;
private var speed:Number = 0;
private var maxSpeed:Number = 5;
private var decay:Number = 0.97;

将 moveShip 函数替换为:

public function moveShip(timeDiff:uint):void
{

    thrustHorizontal = Math.sin(Math.PI * ship.rotation / 180);
    thrustVertical = Math.cos(Math.PI * ship.rotation / 180);
    // rotate and thrust
    if (leftArrow)
    {
        ship.rotation -= shipRotationSpeed * timeDiff;
    }
    else if (rightArrow)
    {
        ship.rotation += shipRotationSpeed * timeDiff;
    }
    else if (upArrow)
    {
        shipMoveX += thrustPower * thrustHorizontal;
        shipMoveY += thrustPower * thrustVertical;
    }
    else if (downArrow)
    {
        shipMoveX -= thrustPower * thrustHorizontal;
        shipMoveY -= thrustPower * thrustVertical;
    }
    if (!upArrow && !downArrow)
    {
        shipMoveX *= decay;
        shipMoveY *= decay;
    }

    speed = Math.sqrt((shipMoveX * shipMoveX) + (shipMoveY * shipMoveY));
    if (speed > maxSpeed)
    {
        shipMoveX *= maxSpeed / speed;
        shipMoveY *= maxSpeed / speed;
    }

    ship.x += shipMoveX;
    ship.y -= shipMoveY;
}

如您所见,有这个新的 if 块:

if (!upArrow && !downArrow)
{
shipMoveX *= decay;
shipMoveY *= decay;
}

在这里,我们正在处理这种情况,如果玩家既没有按下也没有按下并将飞船水平/垂直速度乘以衰减。如果您向后滚动一点,您会注意到它的值是0.97。通常可以说,如果将正数 x 乘以 0 < y < 1,x 会变小。

因此,如果您的 spaship 当前以每帧 3 个像素的速度水平移动(shipMoveX=3 ; shipMoveY=0),下一帧它将变为 2.91。下一帧将是 2.8227,然后是 2.738019 ……以此类推,直到它最终在无穷远处达到零。


推荐阅读