AS3 Segure mouseDown para aumentar velocidade/potência
-
29-10-2019 - |
Pergunta
é isso que estou tentando realizar;
Com um clique em um clipe de filme (cannon_mc) um tiro está sendo disparado (ball_mc)
Quanto mais tempo o mouse estiver pressionado, a velocidade com que a bola é disparada deverá aumentar.Minha pergunta para você é;
Qual é a maneira mais eficiente de fazer isso?Com um temporizador ou algo parecido;
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
}
}
Solução
O evento MOUSE_DOWN é acionado apenas uma vez.Para obter o efeito desejado, você precisa da combinação dos manipuladores de eventos MOUSE_DOWN e MOUSE_UP.
Você pode definir uma variável como verdadeira no evento MOUSE_DOWN junto com o carimbo de data/hora atual de flash.utils.getTimer()
Então, em MOUSE_UP, se a variável definida em MOUSE_DOWN for verdadeira, você calcula o tempo decorrido e define a potência de acordo.
Exemplo:
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
// .......
}
}
Você também pode adicionar um evento ENTER_FRAME e animar um medidor de energia ou algo assim para efeito visual
Atualizar
Conforme apontado por The_asMan, MOUSE_UP
O evento não será acionado se o mouse for arrastado e solto fora do palco.Para lidar com este caso, adicione um ouvinte de evento para MOUSE_LEAVE
evento com o retorno de chamada como a cópia da função buttonReleased, mas que leva um objeto 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);
Outras dicas
(em pseudocódigo muito curto)
Escreva alguns manipuladores de eventos:
- onMouseDown:define bandeira
_mouseDown
, definirpower
para zero - onFrame:
if (_mouseDown) power++;
- onMouseUp:limpa a bandeira
_mouseDown
e atira bola com acumuladopower
Versão independente da taxa de quadros:
- onMouseDown:
_loadStart = getTimer(); _mouseDown = true; _power = 0;
- onFrame:
if (_mouseDown) delta = getTimer() - _loadStart; _power += delta;
- onMouseUp:chutou a bola com
_power
,_mouseDown = false;