AS3 Tieni premuto il mouse per aumentare velocità/potenza
-
29-10-2019 - |
Domanda
questo è ciò che sto cercando di realizzare;
Con un clic su un fileclip (cannon_mc) viene sparato un colpo (ball_mc)
Più a lungo il mouse è abbassato, la velocità con cui viene lanciata la palla dovrebbe aumentare.La mia domanda per te è;
Qual è il modo più efficace per raggiungere questo obiettivo?Con un timer o qualcosa del genere;
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
}
}
Soluzione
L'evento MOUSE_DOWN viene attivato solo una volta.Per ottenere l'effetto desiderato è necessaria la combinazione di gestori di eventi MOUSE_DOWN e MOUSE_UP.
Puoi impostare una variabile su true nell'evento MOUSE_DOWN insieme al timestamp corrente da flash.utils.getTimer()
Quindi su MOUSE_UP, se la variabile impostata in MOUSE_DOWN è vera, calcoli il tempo trascorso e imposti la potenza di conseguenza.
Esempio:
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
// .......
}
}
Puoi anche aggiungere un evento ENTER_FRAME e animare un indicatore di potenza o qualcosa del genere per ottenere effetti visivi
Aggiorna
Come indicato da The_asMan, l'evento MOUSE_UP
non si attiverà se il mouse viene trascinato e rilasciato Fuori dallo stage.Per gestire questo caso aggiungi un listener di eventi per l'evento MOUSE_LEAVE
con il callback come copia della funzione buttonReleased ma che accetta un oggetto 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);
Altri suggerimenti
(in pseudocodice molto breve)
Scrivi alcuni gestori di eventi:
- onMouseDown:imposta la bandiera
_mouseDown
, impostatopower
a zero - suFrame:
if (_mouseDown) power++;
- suMouseUp:cancella la bandiera
_mouseDown
e spara la palla con l'accumulopower
Versione indipendente dal framerate:
- onMouseDown:
_loadStart = getTimer(); _mouseDown = true; _power = 0;
- suFrame:
if (_mouseDown) delta = getTimer() - _loadStart; _power += delta;
- suMouseUp:ha tirato la palla con
_power
,_mouseDown = false;