abr/08 04

Baixe o arquivo fonte aqui.

Existem várias formas de alterar o cursor do mouse no Flash. A maioria delas usa “onEnterFrame”, o que significa que a cada frame o swf atualiza a posição do cursor. Daí já dá pra perceber a falha desse método porque se precisarmos usar um frame rate baixo, como 12, por exemplo, o cursor novo não fica totalmente fiel ao cursor normal. Pode-se argumentar que o uso do comando “updateAfterEvent” resolve isto, mas eu encarei um problema quando estava construindo o site da Brazucah. Ao utilizarmos gráficos complexos, que exigem grande processamento do CPU, a tendência é que o mouse fique tremido e pouco fiel. Saí estudando todas as possibilidades e finalmente encontrei a resposta, e ela se chama “setInterval”. Com este comando, dizemos ao swf para executar uma tarefa de tempo em tempo, mas medindo este tempo em segundos, ao invés de utilizar os frames. O que eu fiz foi programar este tempo para 0.1 milesegundos (milesegundo é a medida de tempo utilizada pelo Flash, cada milesegundo é 1 segundo dividido por 1000) e mandar o swf atualizar a posição do cursor sempre que se completasse esse período. Ou seja, a todo instante.

Crie um novo arquivo no Flash, coloque o Movie Clip que você deseja que substitua o mouse no palco, clique nele e nomeie sua instância (no canto inferior direito, em baixo de “Movie Clip”) como “rato” (sem aspas).

Depois, no primeiro frame do filme principal, cole este código:

stop();
//De início, escondemos o mouse.
Mouse.hide();

//É preciso dar um nome para o “setInterval” e definí-lo como número
var Mudando:Number;

//Aqui você escolhe o período de tempo que “setInterval” executará
var tempo:Number = 0.1;

//Esta é a função executada a cada 0,1 milesegundo
function mudaMouse():Void {
//vc está dizendo para o seu movie clip acompanhar o x e o y do mouse
rato._x = _root._xmouse;
rato._y = _root._ymouse;

//Este comando auxilia na independência deste evente em relação ao que acontece no resto do seu filme
updateAfterEvent();

}
//Aqui está o setInterval. O “this” se refere a ele mesmo, “mudaMouse” é o nome da função a ser repetida e “tempo” é o período escolhido acima.
Mudando = setInterval(this, “mudaMouse”, tempo);

//Eu criei um outro Movie Clip chamado “imagem” e o coloquei como fundo do swf para brincarmos

_root.imagem.onPress = function() {
//ao clicar no fundo, o mouse muda de Cabana é Bacana para Bacana é Cabana
rato.gotoAndStop(2);
}

_root.imagem.onRelease = _root.imagem.onReleaseOutside = function() {
//ao soltar, dentro ou fora do MC “imagem” o mouse volta ao frame anterior
rato.gotoAndStop(1);

}
_root.imagem.onRollOut = function() {

/*mandamos o mouse ficar escondido de novo, pois se apertarmos o botão direito
o menu do Flash puxa o mouse normal novamente*/
Mouse.hide();
}
_root.imagem.onRollOver = function() {

/*mandamos o mouse ficar escondido de novo, pois se apertarmos o botão direito
o menu do Flash puxa o mouse normal novamente*/
Mouse.hide();
}

Fácil né? Se tiver dificuldade, deixa um comentário.

Pablo Cabana

26 Respostas para “Como mudar o cursor do mouse no Flash – o script definitivo”

  1. Regina Alfaia Diz:

    Excelente, funciona muito melhor do que “onEnterFrame”.

  2. Gustavo Diz:

    NEsse tutor vc estáexplicandocomo fazer Flash 6.0 mais oke eu tenhu aki em casa é o MX feis o download do arki a cima e não rodou no MX….
    e num funfo!
    queria que postaseum de Flash MX.
    Fui…
    Vlw….

  3. Gustavo Diz:

    Outra duvida voce teria umtutorial pra tipow asim:
    fazer um jogo onde o curso é um mira de uma arma e so acertase quando atirase no lugar certo tipow luraes definidos por x & y ou botão.
    fui…
    Té mais.
    Vlw’s…

  4. pablo Diz:

    Gustavo, o código está aí. É so colar no seu arquivo Flash MX e criar o Movie Clip “rato”.

  5. Fernando Sherman Diz:

    cara, num deu certo naum…
    será pq eu to usando o flash 8???
    num sei, soh sei q foi assim…
    o mouse sumiu e por nada aparece, jah testei altas modificações… mas naum deu em nada!

    flow
    wabra!

  6. Pablo Cabana Diz:

    Po Fernando. Tem que estudar um pouquinho de AS2…

  7. Silvaney Diz:

    cara eu usei deu certo, foi usado como um pincel em um jogo de desenho para colorir, porém quando eu volto pra pagina inicial ou descarrego outro swf em cima , o mouse volta invisivel, e eu nao quero abrir em html como faço para resolvel ou seja pra quando for descarregado outro swf o mouse aparecer.

  8. Pablo Cabana Diz:

    Silvaney, você deve usar o comando contrário:
    Mouse.show();

  9. Silvaney Diz:

    Kara deu certo valew ai pela força. abrass

  10. Bruno Diz:

    Olá,estou tentando aqui + a parte

    //Aqui está o setInterval. O “this” se refere a ele mesmo, “mudaMouse” é o nome da função a ser repetida e “tempo” é o período escolhido acima.
    Mudando = setInterval(this, “mudaMouse”, tempo);

    Está dando erro aqui no meu flash

    uso o cs

    abraços

  11. Bruno Diz:

    Opa,Já Consegui…

    Tem algum jeito de,em um site que estou fazendo,quando eu clicar em qualquer parte do site(a seta é uma mira)espirrar uma tinta no lugar? um uma mancha…?(Site pra PaintBall)

    Outra coisa,como eu coloco um som de tiro quando a pessoa der um clique
    ?

    Abraços

  12. Pablo Cabana Diz:

    Aí só estudando um pouquinho Bruno…

  13. Felipe Magno Diz:

    Cara, eu te amo…hehehehehehehe

    Excelente explicação e pra mim que estou aprendendo (fuçando) mto sobre flash ultimamente, e esse comportamento será mto útil!!!

    Valeu!

  14. Pablo Cabana Diz:

    ahauhauah

    Disponha Felipe! Seja sempre bem-vindo ao Cabanoblog. ;)

  15. Lucas Lago Diz:

    E se eu quiser fazer com que quando fique em cima de um botao,apareça a maozinha tradicional???

  16. Pablo Cabana Diz:

    Lucas, apenas use : Mouse.show();

  17. Lucas Lago Diz:

    ahh!! Valeu !!!
    alias, acabei caindo aqui de para quedas, e achei o site de voces, e o portifolio tudo muito bom mesmo!!!

    vcs estao de parabens!
    e continue postando as dicas ai p gente heheh!

    flw

  18. Pablo Cabana Diz:

    valeu Lucas!
    volte sempre!

  19. Jean HS Diz:

    Pablo espero que possa me ajudar no meu problema!! A questão é que tenho um mapa arrastável e quando clico com a mão que criei com seu tutor a mão trava, mas continuo arrastando o mapa mesmo assim. Que posso fazer???

    See ya!!

  20. Jean HS Diz:

    Percebi que ele não trava se eu tirar uma outra função que havia aplicado, mas entaum o mapa não se move:
    mapa.onPress = function(){
    this.startDrag(false, -400, -300, +600, +400);
    }
    mapa.onRelease = function(){
    this.stopDrag();
    }

  21. André Diz:

    Cara,
    Deu certinho, bem legal esse esquema.
    Funciona se eu limitar uma área para o cursor mudar?
    Exemplo: tenho um stage a 1024×768, quero que o cursor só mude sobre uma imagem de 200×200, e no resto do stage volte a seta default.
    Rola?
    Valeu cara, parabéns!

  22. Pablo Cabana Diz:

    Claro que rola André! É só você configurar o mouseOver para cada objeto.

  23. silva Diz:

    Eu usaria o addEventListener para acompanhar o mouse:

    Mouse.hide();
    target.addEventListerner(MouseEvent.MOUSE_MOVE, mouseMoveHandler);

    function mouseMoveHandler(e){
    rato.x = xmouse;

    }

  24. silva Diz:

    Eu usaria o addEventListener para acompanhar o mouse:

    Mouse.hide();

    addEventListerner(MouseEvent.MOUSE_MOVE, mouseMoveHandler);

    function mouseMoveHandler(e){
    rato.x = _xmouse;
    rato.y = _ymouse;
    }

  25. silva Diz:

    corrigindo o script acima seria:

    Mouse.hide();
    this.addEventListerner(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
    function mouseMoveHandler(e){
    rato.x = mouseX;
    rato.y = mouseY;
    }

  26. Pablo Cabana Diz:

    Silva, se estiver usando AS3, aí sim…

 Deixe um comentário.