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

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

При нажатии на мувиклип (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
            }

        }

person Opoe    schedule 12.09.2011    source источник
comment
любой из ответов решил вашу проблему? Если это так, рассмотрите возможность пометить наиболее полезный ответ как принятый ответ. Также не стесняйтесь обращаться за дополнительной помощью, если это необходимо.   -  person danishgoel    schedule 16.09.2011


Ответы (2)


Событие 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);
person danishgoel    schedule 12.09.2011
comment
Это, вероятно, близко к тому, как я бы это сделал, но я бы подумал о том, чтобы использовать мышь вне сцены. - person The_asMan; 13.09.2011
comment
Вы правы, событие MOUSE_UP не сработает, если мышь перетащить и отпустить за пределы сцены. Чтобы обработать этот случай, добавьте прослушиватель событий для события MOUSE_LEAVE с обратным вызовом в виде той же функции buttonReleased. - person danishgoel; 13.09.2011
comment
Спасибо за этот отличный ответ и объяснение - person Opoe; 13.09.2011
comment
Рад быть полезным. Также, если это ответило на ваш вопрос, отметьте его как принятый ответ. - person danishgoel; 13.09.2011

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

  • 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;
person alxx    schedule 12.09.2011