ActionScript3: Какой код следует использовать, чтобы остановить перемещение спрайта, управляемого игроком? - PullRequest
0 голосов
/ 18 февраля 2019

Я очень новичок в 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;

1 Ответ

0 голосов
/ 19 февраля 2019

Я согласен, что в вашем коде есть небольшая логическая проблема.Ваш корабль будет двигаться в день суда, потому что две переменные, отвечающие за скорость его движения - shipMoveX и shipMoveY - не ухудшаются автоматически с течением времени.

Теперь есть буквально тысячи способов, как это могло бы произойтибыть достигнутым, но давайте будем простыми.Вы используете переменную класса с именем thrustPower - убедитесь, что для нее установлено значение 0.1 , а значение обоих shipMoveX & shipMoveY равно 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;
}

Здесь мы рассматриваем случай, если игрок не нажал ни вверх, ни вниз и умножил горизонтальную / вертикальную скорость космических кораблей на decay .Если вы прокрутите немного назад, вы заметите, что это значение равно 0,97 .Обычно вы можете сказать, что если вы умножите положительное число x на 0

Так что, если ваш spaship в настоящее время движется горизонтально со скоростью 3 пикселя на кадр (shipMoveX = 3;shipMoveY = 0) это станет 2.91 в следующем кадре.В следующем кадре это будет 2.8227, затем 2.738019 ... и так далее, прежде чем он, наконец, достигнет нуля в бесконечности.

...