AS3 Hold MousDown pour augmenter la vitesse / la puissance
-
29-10-2019 - |
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
}
}
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
, Positionnerpower
à 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;