AS3 Mantener mouseDown para aumentar la velocidad/potencia
-
29-10-2019 - |
Pregunta
esto es lo que estoy tratando de lograr;
Con un clic en un clip de película (cannon_mc) un tiro se disparó (ball_mc)
El más ratón hacia abajo, la velocidad de la que el balón se dispara con la debería aumentar.Mi pregunta es;
¿Cuál es la forma más eficiente para lograr esto?Con un temporizador o algo como esto;
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
}
}
Solución
El evento MOUSE_DOWN solo se activa una vez.Para obtener el efecto que desea, necesita la combinación de controladores de eventos MOUSE_DOWN y MOUSE_UP.
Puede establecer una variable en verdadera en el evento MOUSE_DOWN junto con la marca de tiempo actual de flash.utils.getTimer()
Luego, en MOUSE_UP, si la variable que configuraste en MOUSE_DOWN es verdadera, calculas el tiempo transcurrido y configuras la potencia en consecuencia.
Ejemplo:
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
// .......
}
}
También puede agregar un evento ENTER_FRAME y animar un indicador de potencia o algo para un efecto visual
Actualización
Como señaló The_asMan, el evento MOUSE_UP
no se activará si se arrastra y suelta el mouse fuera del escenario.Para manejar este caso, agregue un detector de eventos para el evento MOUSE_LEAVE
con la devolución de llamada como la copia de la función buttonReleased pero que toma un 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);
Otros consejos
(en muy corto pseudocódigo)
Escribir algunos controladores de eventos:
- onMouseDown:conjuntos de bandera
_mouseDown
, conjuntopower
a cero - onFrame:
if (_mouseDown) power++;
- onMouseUp:borra la bandera
_mouseDown
y dispara la bola con el acumuladopower
Velocidad de fotogramas independientes de la versión:
- onMouseDown:
_loadStart = getTimer(); _mouseDown = true; _power = 0;
- onFrame:
if (_mouseDown) delta = getTimer() - _loadStart; _power += delta;
- onMouseUp:tiro la pelota con
_power
,_mouseDown = false;