ActionScript3:我应该使用啥代码来阻止玩家控制的精灵移动?

Posted

技术标签:

【中文标题】ActionScript3:我应该使用啥代码来阻止玩家控制的精灵移动?【英文标题】:ActionScript3: What code should I use to stop the player controlled sprite from moving?ActionScript3:我应该使用什么代码来阻止玩家控制的精灵移动? 【发布时间】:2019-07-11 07:22:28 【问题描述】:

我是 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;

【问题讨论】:

如果是你的代码,即使你是 AS3 的新手,你怎么不知道哪个部分做了什么? 好吧,正如您所见,我的运动向下,但我不确定 AS3 中的什么是在放开按键后保持直线运动的原因。我有按键向上和按键向下的事件监听器,所以当没有按下按键时它应该停止。无论如何,感谢您的无用评论。 据我所知,这不是代码:你最终有一个逻辑问题。 “shipMoveX”永远不会被重置;即使释放钥匙,它也会保留它的任何价值,从而保持你的船移动。 【参考方案1】:

我同意您的代码中存在一点逻辑问题。你的船将继续前进直到 审判日,因为这两个变量负责它的运动速度 - 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

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

【讨论】:

作为固定空间的更好方法,使用绝对摩擦:if (Math.abs(shipMoveX)<friction) shipMoveX=0; else if (shipmoveX>0) shipMoveX-=friction; else shipMoveX+=friction;(添加大括号以适应口味)

以上是关于ActionScript3:我应该使用啥代码来阻止玩家控制的精灵移动?的主要内容,如果未能解决你的问题,请参考以下文章

如何知道是啥阻止了 NodeJS 关闭

我缺少啥来阻止 Beep 在我的 Mac 10.5.8 上响起(使用 MonoDevelop 2.8.8.2)?

我应该使用啥工具来分析窗口 7 上的 Python 代码

我应该使用啥设计模式来避免这里的虚拟代码?

Action Script 3. 如何播放一次动画?

我应该在我的代码中使用啥分辨率来测试表格是不是超出页面? [复制]