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
            }

        }
¿Fue útil?

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, conjunto power a cero
  • onFrame: if (_mouseDown) power++;
  • onMouseUp:borra la bandera _mouseDown y dispara la bola con el acumulado power

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top