Pergunta

é isso que estou tentando realizar;

Com um clique em um clipe de filme (cannon_mc) um tiro está sendo disparado (ball_mc)

Quanto mais tempo o mouse estiver pressionado, a velocidade com que a bola é disparada deverá aumentar.Minha pergunta para você é;

Qual é a maneira mais eficiente de fazer isso?Com um temporizador ou algo parecido;

    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
            }

        }
Foi útil?

Solução

O evento MOUSE_DOWN é acionado apenas uma vez.Para obter o efeito desejado, você precisa da combinação dos manipuladores de eventos MOUSE_DOWN e MOUSE_UP.

Você pode definir uma variável como verdadeira no evento MOUSE_DOWN junto com o carimbo de data/hora atual de flash.utils.getTimer()

Então, em MOUSE_UP, se a variável definida em MOUSE_DOWN for verdadeira, você calcula o tempo decorrido e define a potência de acordo.

Exemplo:

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

Você também pode adicionar um evento ENTER_FRAME e animar um medidor de energia ou algo assim para efeito visual

Atualizar
Conforme apontado por The_asMan, MOUSE_UP O evento não será acionado se o mouse for arrastado e solto fora do palco.Para lidar com este caso, adicione um ouvinte de evento para MOUSE_LEAVE evento com o retorno de chamada como a cópia da função buttonReleased, mas que leva um objeto 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);

Outras dicas

(em pseudocódigo muito curto)
Escreva alguns manipuladores de eventos:

  • onMouseDown:define bandeira _mouseDown, definir power para zero
  • onFrame: if (_mouseDown) power++;
  • onMouseUp:limpa a bandeira _mouseDown e atira bola com acumulado power

Versão independente da taxa de quadros:

  • onMouseDown: _loadStart = getTimer(); _mouseDown = true; _power = 0;
  • onFrame: if (_mouseDown) delta = getTimer() - _loadStart; _power += delta;
  • onMouseUp:chutou a bola com _power, _mouseDown = false;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top