Comunidad de diseño web y desarrollo en internet online

transformar flecha en mira (imagen.png)

Citar            
MensajeEscrito el 03 Feb 2010 01:39 am
Buenas como podria hacer en FLEX 3 para transformar la flecha del mouse en mira (de pistola), una imagen png,
ya he visto que en flash se puede hacer llendo a las acciones de la imagen, y poniendo el sig, codigo:

onClipEvent(enterFrame){
Mouse.hide();//desaparece la flecha del mouse, esto se puede hacer en Flex
this._x=_root._xmouse;//se da a el mc las coordenadas del mouse
this._y=_root._ymouse;//se da a el mc las coordenadas del mouse
}

ahora, la funcion onClipEvent(enterFrame) no la puedo usar en flex sobre una imagen, ya que se usa en una accion de un movie clip, mi pregunta es como hago para hacer esto en flex 3.????

Por diego_G_09

31 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Feb 2010 07:27 am
En la ayuda de Flash tienes un ejemplo "parecido".
Es un poco largo de explicar, porque no es problema de Flex 3, sino de AS.3
En AS.3 ya NO existe el onClipEvent, ahora lo que se hace es
1.-Nos creamos una función
2.-Añadimos un "listener", para que "cuando ocurra algo" se ejecute dicha función.
Vamos, a los MCs y a nuestra película siempre les están ocurriendo cosas (eventos): movemos el ratón, hacemos click, van avanzando fotogramas... Esos "eventos" los podemos "escuchar". Vamos, en el primer frame de nuestra película podemos escribir

Código ActionScript :

//creamos una función
private function mouseMoveHandler(event:MouseEvent):void {
            trace("mouseMoveHandler");
}
//le decimos que, cuando se mueva el ratón, se ejecute la función
addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);

Vale, ya casi lo tenemos
Un método de Mouse es Mouse.Hide(), así que le técnica debe ser:
a)Ocultamos el ratón
b)Hacemos visible nuestro "cursor" (si es que no lo estaba ya)
c)Añadimos el "listener" de modo que, cuando movamos el ratón, la posición de nuestro "cursor" sea la del ratón.
En código

Código ActionScript :

//Ocultamos el botón
Mouse.hide();  
//le decimos que, cuando se mueva el ratón, se ejecute la función
addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
//nuestra función queda como
//Supongo que el "nombre de instancia" de tu "mira" es "cursor"
private function mouseMoveHandler(event:MouseEvent):void {
        cursor.x = event.localX;
        cursor.y = event.localY;
        event.updateAfterEvent();
}

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Feb 2010 12:17 pm
Muchisimas gracias ya lo logre hacer funcionar, con el codigo q me diste, solo lo tube que cambiar un poco le puse:
cursorMira.x = event.stageX;
cursorMira.y = event.stageY;
event.stage, porque con:
cursor.x = event.localX;
cursor.y = event.localY;
event.local no se por que el mouse estaba muy lejos de la imagen, ahora te pregunto dos cositas, una es que como puedo hacer para que la flecha quede en el centro de la imagen, manualmente le tengo que restar al evento unos puntos
eje:
cursorMira.x = event.stageX - 15;
cursorMira.y = event.stageY - 15;
ya que si no el mouse se posisiona (la imagen es un cuadrado) en el vertice superior izquierdo, punto 0,0 de la imagen (creo), restandole eso puedo posisonarlo en el centro, pero como puedo hacerlo para calcularlo?? no se si me explico?

y dos para que sirve la funcion: event.updateAfterEvent(); ???
gracias... :D :D

Por diego_G_09

31 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Feb 2010 12:35 pm
:glups: tienes razón en lo de stageX y stageY
Para hacer que la flecha quede en el centro tienes que editar el símbolo de tu "cursorMira" y moverlo al centro.
TODO Símbolo tiene un punto que es el que se toma cuando cambiamos su "x" o su "y" (es una crucecita que aparece). Por defecto siempre está en la esquina superior izquierda.

Si no lo quieres mover (o es un MC creado por programación) puedes usar "cursorMira.width/2" y "cursorMira.height/2"

El updateAfterEvent() fuerza a que se "refresque" la pantalla. Eso hace que el movimiento parezca "más suave" (prueba a quitarlo para comprobarlo)

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Feb 2010 01:10 pm
muchas gracias nuevamente, ahora con la solucion de poner el mouse en el centro de la imagen cursorMira, surge otro problema, y es que cuando quiero "disparar" sobre otra imagen, o sea pocisiono le cursorMira sobre otra imagen, y doy click el evento no se produce ya que logicamente el click no lo doy sobre la otra imagen si no que siempre estoy dando el click sobre la imagen cursorMira, no se si se entiende, antes no pasaba porque el cursor no estaba sobre la imagen cursor mira, si no estaba arriba a la izq (cor 0, 0 de la imagen), no se si me explico :? , como puedo solucionar esto, o sea que tenga mi cursor con forma de mira(imagen), pero que esta imagen tenga las propiedades del cursor..???? :roll:

Esta esta dificil no?? :shock:
Gracias. :D

Por diego_G_09

31 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Feb 2010 03:24 pm
Debemos hacer que nuestro "cursor" no se pueda "clickar". Vamos, ponerle su "propiedad" mouseEnabled a false

Código ActionScript :

cursorMira.mouseEnabled=false;

NOTA:Supongo que el listener Mouse.CLICK lo añades al stage también y usas event.target para saber qué "imagen" has pinchado.

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Feb 2010 04:13 pm

Eliseo2 escribió:

Debemos hacer que nuestro "cursor" no se pueda "clickar". Vamos, ponerle su "propiedad" mouseEnabled a false

Código ActionScript :

cursorMira.mouseEnabled=false;

NOTA:Supongo que el listener Mouse.CLICK lo añades al stage también y usas event.target para saber qué "imagen" has pinchado.


El listenerMouse.Click lo estoy haciendo sobre la imagen y no sobre el stage, ya que quiero que el evento se produzca unicamente cuando doy click en la imagen, ademas no se bien para que es el event.target (soy nuevo en esto), ahora con el cursorMira.mouseEnabled=false, no pude, :( pero le agregue cursorMira.mouseChildren=false; que averigue que servia para que la imagen Mira no interfiera en el evento click, "propiedad mouseChildren de los DisplayObjectContainer, que determina si los elementos secundarios de un objeto están habilitados para ratón. Su valor predeterminado es true"
y pude :) , asi que muchas gracias, por fin se pudo lograr el funcionamiento que buscaba. Muchas gracias por tu ayuda, y ya te voy comentando que necesitare mas jaja. Nos vemos y gracias!!!

Por diego_G_09

31 de clabLevel



 

msie8
Citar            
MensajeEscrito el 03 Feb 2010 05:13 pm
Diego,
Sobre el lenguaje: Los eventos no podemos evitar que ocurran. Así, cuando hacemos Click sobre un MC, se produce un evento Click sobre el MC y otro evento Click sobre el stage -si tuviéramos un MC interior al anterior y pincháramos dentro, se producirían tres eventos Click-
Otra cosa es dónde añadamos el listener. En el caso de un MC en un stage, lo podemos añadir sobre el MC o sobre el stage (o sobre los dos -cosa que NO se hace CASI NUNCA-
Vamos a añadirlo a los dos para ver qué pasa

Código ActionScript :

mimc.addEventListener(MouseEvent.CLICK,mimcOnClick)
stage.addEventListener(MouseEvent.CLICK,stageOnClick)
function mimcOnClick(e:MouseEvent){
    trace("From mimcOnClick :"+e.target+":"+e.currentTarget)
}
function stageOnClick(e:MouseEvent){
    trace("From stageOnClick:"+e.target+":"+e.currentTarget)
}

(*)Podríamos haber usado una única función
Vemos que "currentTarget" es siempre donde se ha añadido el listener y "target" donde se ha hecho click.
¿para qué nos puede servir esto?
Imagina que, en tu caso, lugar de una imagen, tienes 100. Podríamos añadir un listener a cada imagen o un único listener al stage. Añadir un único listener tiene la ventaja de que ocupa menos memoria (y de que no nos tenemos que encargar de eliminarlo, si eliminamos el objeto)
El otro caso típico es un menú con muchos botones dentro. en lugar de añadir tantos lísteners como botones tenemos en el menú, podemos darle propiedad "name" a nuestros botones y añadir un único listener al menú, luego en la función, preguntando por el e.target, si es distinto de currentTarget -esto es, hemos pulsado un botón y no dentro del menú pero no en un botón- podremos hacer una cosa y otra dependiendo de e.target.name, y podremos "draguearlo" si no es así.
NOTA:Ni idea de lo de mouseChildren -estoy todavía con Flash 9, y sí que me funcionaba el mouseEnabled-

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Feb 2010 06:45 pm
Muchas gracias con tu explicación entendi a la perfeccion por que usar stage en vez de poner a la imagen una accion en particualar, ahora para darme cuenta en que objeto estoy parado en el momento del click, tengo problemas, ya que no me doy cuenta como hacer para que me devuelva algo para comparar, eje tengo que hacer lo siguiente:

if(event.target.valueOf(avionEnemigo).toString() == "Ataque0.avionEnemigo.FlexLoader19")
"Ataque0.avionEnemigo.FlexLoader19" es el string que me debuelve cuando presiono en el objeto, no hay alguna forma que me devuelva, el objeto, asi lo comparo, algo asi:

if(event.target.getObjeto() == avionEnemigo) ????
donde avionEnemigo es el ID de mi objeto.
???

Por diego_G_09

31 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Feb 2010 07:38 am
El propio objeto es "event.target" (lo de valueOf sobra en cualquier caso). El problema de los eventos es que event.target, sin más, se considera un simple Objeto. Ello implica que podemos acceder a todas las "propiedades", pero no a los métodos
Imaginemos que pinchamos en un MC, podríamos escribir

Código ActionScript :

function stageOnClick(e:MouseEvent){ 
    trace(e.target) 
    trace(e.target.x) //<--la posición "x"
    trace(e.parent)  //<---el "DisplayContainer" que lo contiene
    ....
}

Pero NO podemos hacer

Código ActionScript :

//dará ERROR
function stageOnClick(e:MouseEvent){ 
    e.target.gotoAndStop(3)  //<--es un método y los objetos no tienen métodos
}

Para hacer algo como eso tenemos que hacer una "conversión de cast"

Código ActionScript :

//Una "Conversión de Cast"
function stageOnClick(e:MouseEvent){ 
    var mc:MovieClip=e.target as MovieClip  //<--creamos una variable "mc"
                                         //de timpo MovieClip y la igualamos a e.target "como" ovieClip
    mc.gotoAndStop(3)  //<--ahora sí
}
//O bien,
function stageOnClick(e:MouseEvent){ 
    MovieClip(e.target).gotoAndStop(3)  //<--el método gotoAndStop se aplica a e.target "como" MovieClip
}

puff!, Ahora tu pregunta (perdona este "rondo" que me he marcado. DEBEMOS usar el operador "is". Así que supongo(*) que deberías escribir algo como

Código ActionScript :

function stageOnClick(e:MouseEvent){ 
    if (e.target.parent is avionEnemigo){
            //por ejemplo
           Ataque0.removeChild(displayObject(e.target.parent))
    }
}

(*)No te digo que esté bien, haz pruebas

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Feb 2010 07:01 pm
No pude hacer if (e.target.parent is avionEnemigo) no me reconoce la funcion parent, estoy usando flex, hay que importar alguna libreria o algo ademas de import flash.events.Event; import flash.events.MouseEvent;??

Por diego_G_09

31 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.