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
            }

        }
È stato utile?

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, impostato power a zero
  • suFrame: if (_mouseDown) power++;
  • suMouseUp:cancella la bandiera _mouseDown e spara la palla con l'accumulo power

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top