Bezdepbonusu7Программирование: статьи и ответы

Вопрос

AS3 Удерживайте мышь, чтобы увеличить скорость/мощность

Автор вопроса: OpoeОтветов: 2

это то, что я пытаюсь выполнить;

При нажатии на мувиклип (cannon_mc) происходит выстрел (ball_mc)

Чем дольше мышь находится внизу, тем выше должна быть скорость, с которой летит мяч. Мой вопрос к вам;

Каков наиболее эффективный способ добиться этого? С таймером или чем-то подобным;

    var isMouseDown:Boolean = false;
    var speed= 10;

    myCannon.addEventListener(MouseEvent.MOUSE_DOWN,buttonPressed);

        function buttonPressed(event:MouseEvent){
            //trace("down");
            isMouseDown == true;

            if(isMouseDown == false)
            {
                speed == +1
            }

        }
  • любой из ответов решил вашу проблему? Если это так, рассмотрите возможность пометить наиболее полезный ответ как принятый ответ. Также не стесняйтесь обращаться за дополнительной помощью, если это необходимо. danishgoel 16.09.2011

timerperformanceactionscript-3mousedown

Ответы

Ответ 1 · рейтинг 7 · danishgoel

Событие MOUSE_DOWN запускается только один раз. Чтобы получить желаемый эффект, вам понадобится комбинация обработчиков событий MOUSE_DOWN и MOUSE_UP.

Вы можете установить переменную в значение true в событии MOUSE_DOWN вместе с текущей меткой времени из flash.utils.getTimer()

Затем в MOUSE_UP, если переменная, которую вы установили в MOUSE_DOWN, имеет значение true, вы вычисляете прошедшее время и соответственно устанавливаете мощность.

Пример:

var isMouseDown:Boolean = false;
var mouseDownBegin:int;
var speed = 10;
var speed_inc = 2; // give it in per second
var speed_max = 100; // max speed possible

// add event handlers
myCannon.addEventListener(MouseEvent.MOUSE_DOWN, buttonPressed);
myCannon.addEventListener(MouseEvent.MOUSE_UP, buttonReleased);

function buttonPressed(event:MouseEvent){
    isMouseDown = true;
    mouseDownBegin = flash.utils.getTimer();
}

function buttonReleased(event:MouseEvent){
    if(isMouseDown == true){
        // get time between press and release
        var timeElapsed = flash.utils.getTimer() - mouseDownBegin;

        // reset isMouseDown
        isMouseDown = false;

        // compute speed
        speed += int(Math.floor(speed_inc * (timeElapsed / 1000.0)));
        speed = Math.min(speed, speed_max);

        // code to fire ball with new speed
        // .......
    }
}

Вы также можете добавить событие ENTER_FRAME и анимировать индикатор мощности или что-то еще для визуального эффекта.

Обновление
Как указывает The_asMan, событие MOUSE_UP не сработает, если мышь перетаскивается и отпускается за пределы сцены. Чтобы обработать этот случай, добавьте прослушиватель событий для события MOUSE_LEAVE с обратным вызовом как копию функции buttonReleased, но который принимает объект Event:

function buttonReleasedOutsideStage(event:Event){
    if(isMouseDown == true){
        // get time between press and release
        var timeElapsed = flash.utils.getTimer() - mouseDownBegin;

        // reset isMouseDown
        isMouseDown = false;

        // compute speed
        speed += int(Math.floor(speed_inc * (timeElapsed / 1000.0)));
        speed = Math.min(speed, speed_max);

        // code to fire ball with new speed
        // .......
    }
}
stage.addEventListener(Event.MOUSE_LEAVE, buttonReleasedOutsideStage);

Ответ 2 · рейтинг 2 · alxx

(в очень коротком псевдокоде)
Напишите несколько обработчиков событий:

  • onMouseDown: устанавливает флаг _mouseDown, устанавливает power в ноль
  • в кадре: if (_mouseDown) power++;
  • onMouseUp: очищает флаг _mouseDown и запускает шар с накопленными power

Независимая от частоты кадров версия:

  • onMouseDown: _loadStart = getTimer(); _mouseDown = true; _power = 0;
  • в кадре: if (_mouseDown) delta = getTimer() - _loadStart; _power += delta;
  • onMouseUp: стрелять по мячу с помощью _power, _mouseDown = false;

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы