AS3 Halten Sie mouseDown gedrückt, um die Geschwindigkeit / Leistung zu erhöhen
-
29-10-2019 - |
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
}
}
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 setztpower
auf Null - onFrame:
if (_mouseDown) power++;
- onMouseUp: Löscht den Flag-
_mouseDown
und feuert den Ball mit dem akkumuliertenpower
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;
- onMouseDown: