это то, что я пытаюсь выполнить;
При нажатии на мувиклип (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
}
}
Ответ 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;