Question

C'est ce que j'essaie d'accomplir;

Avec un clic sur un movielip (cannon_mc), un tir est tiré (Ball_MC)

La souris plus longue est en baisse, la vitesse de la balle est tirée avec devrait augmenter. Ma question est à vous;

Quelle est la façon la plus efficace d'y parvenir? Avec une minuterie ou quelque chose comme ça;

    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
            }

        }
Était-ce utile?

La solution

L'événement Mouse_Down n'est licencié qu'une seule fois. Pour obtenir l'effet que vous voulez, vous avez besoin du combo des gestionnaires d'événements Mouse_Down et Mouse_up.

Vous pouvez définir une variable sur true dans l'événement Mouse_down avec le horodat actuel de flash.utils.getTimer()

Ensuite, sur souris_up, si la variable que vous définissez dans Mouse_down est vraie, vous calculez le temps écoulé et définissez la puissance en conséquence.

Exemple:

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
        // .......
    }
}

Vous pouvez également ajouter un événement ENTER_FRAME et animer une jauge de puissance ou quelque chose pour un effet visuel

Mise à jour
Comme indiqué par le_asman, MOUSE_UP L'événement ne tirera pas si la souris est traînée et libérée à l'extérieur de la scène. Pour gérer ce cas, ajoutez et écouteur d'événements pour MOUSE_LEAVE Événement avec le rappel comme copie de la fonction ButtonReled mais qui prend un objet d'événement:

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);

Autres conseils

(en pseudocode très court)
Écrivez des gestionnaires d'événements:

  • OnMoudown: Définit le drapeau _mouseDown, Positionner power à zéro
  • onframe: if (_mouseDown) power++;
  • onMouseup: efface le drapeau _mouseDown et tire la balle avec accumulé power

Framer la version indépendante:

  • Onmoudown: _loadStart = getTimer(); _mouseDown = true; _power = 0;
  • onframe: if (_mouseDown) delta = getTimer() - _loadStart; _power += delta;
  • onMouseup: tiré avec le ballon avec _power, _mouseDown = false;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top