Frage

das versuche ich zu erreichen;

Mit einem Klick auf einen Movieclip (cannon_mc) Es wird ein Schuss abgefeuert (ball_mc)

Je länger die Maus gedrückt ist, desto höher sollte die Geschwindigkeit sein, mit der der Ball abgefeuert wird. Meine Frage an Sie lautet:

Was ist der effizienteste Weg, um dies zu erreichen? Mit einem Timer oder so ähnlich;

    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
            }

        }

War es hilfreich?

Lösung

Das MOUSE_DOWN-Ereignis wird nur einmal ausgelöst.Um den gewünschten Effekt zu erzielen, benötigen Sie die Kombination aus MOUSE_DOWN- und MOUSE_UP-Ereignishandlern.

Sie können eine Variable im MOUSE_DOWN-Ereignis zusammen mit dem aktuellen Zeitstempel aus flash.utils.getTimer() auf true setzen

Wenn bei MOUSE_UP die in MOUSE_DOWN festgelegte Variable true ist, berechnen Sie die verstrichene Zeit und stellen die Leistung entsprechend ein.

Beispiel:

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

Sie können auch ein ENTER_FRAME-Ereignis hinzufügen und eine Leistungsanzeige oder etwas für einen visuellen Effekt animieren.

Update
Wie von The_asMan angegeben, wird das MOUSE_UP-Ereignis nicht ausgelöst, wenn die Maus außerhalb der Bühne gezogen und losgelassen wird.Um diesen Fall zu behandeln, fügen Sie einen Ereignis-Listener für das MOUSE_LEAVE-Ereignis hinzu, wobei der Rückruf als Kopie der Funktion buttonReleased dient, für die jedoch ein Ereignisobjekt erforderlich ist:

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

Andere Tipps

(in sehr kurzem Pseudocode)
Schreiben Sie einige Ereignishandler:

  • onMouseDown: Setzt das Flag _mouseDown und setzt power auf Null
  • onFrame: if (_mouseDown) power++;
  • onMouseUp: Löscht den Flag-_mouseDown und feuert den Ball mit dem akkumulierten power ab.

    Unabhängige Version der Framerate:

    • onMouseDown: _loadStart = getTimer(); _mouseDown = true; _power = 0;
    • onFrame: if (_mouseDown) delta = getTimer() - _loadStart; _power += delta;
    • onMouseUp: Schoss den Ball mit _power, _mouseDown = false;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top