Hypertext con mouseEnter
Hola es la primera vez que uso este recurso y espero pueda contar con tu ayuda, mi problema es el siguiente, estoy diseñando un CD en Director MX 2004 y tengo un texto que tiene hyperlinks y quiero que cuando pase sobre un hyperlink determinado en el texto digamos una palabra como "gracias", me muestre en otra área de la pantalla un gráfico que vaya de acuerdo a la palabra según yo indique que gráfico sera este, no se si me explico, pero mi problema es que puedo hacer que el hypertexto interactue con cualquier comando cuando le doy un click pero quiero que también me pueda interactuar con el comando lingo que yo desee cuando el mouse pase por una palabra determinada en el texto, pude hacer que cumpla un comando cuando el cursor pasa por un hypertexto pero me cumple el mismo comando sea cual se el texto, lo que yo quiero es que sea un comando diferente para cada hypertexto supongo que esto se puede hacer detectando que es lo que contiene el texto vía una lista, o quizá por el orden de los hyperlinks digamos el primer hyperlink del texto realiza una función POR y el segundo una función Y y así con todos los hyperlinks que tenga en el texto.
Espero me entiendas y puedas ayudarme, no quiero ser exigente pero estoy con un poco de apuro ya me pase una semana tratando de resolver este asunto y no puedo resolver y lo necesito con urgencia. Muchísimas gracias por anticipado.
Gabriel Arauco
Espero me entiendas y puedas ayudarme, no quiero ser exigente pero estoy con un poco de apuro ya me pase una semana tratando de resolver este asunto y no puedo resolver y lo necesito con urgencia. Muchísimas gracias por anticipado.
Gabriel Arauco
1 respuesta
Respuesta de bubebu
1
1
Cuando creas un enlace seleccionas el texto que formará el enlace, luego vas al Inspector de texto y escribes lo que quieras en el campo de enlace. Ese texto que escribes es el asociado al enlace y el que va a contener la variable código, no almacena la palabra sobre la que estas sino el texto asociado mediante el enlace.
Por ejemplo si tienes el texto "la herramienta llamada escalpero" y seleccionas "escalpelo", vas al Inspector de texto y en el campo de enlace escribes "escalp", la palabra "escalpelo" pasará a ser un enlace con el texto asociado "escalp". Cuando sitúes el cursor del ratón encima del enlace "escalpelo", la variable código contendrá la palabra "escalp". Esa palabra tiene que ser el nombre de un miembro de imagen. Entonces solo tienes que hacer lo siguiente:
sprite(2).member = member( codigo, "fotos" )
Lo único que tienes que hacer es crear los enlaces poniéndoles como texto asociado el nombre de un miembro que sera la imagen a mostrar. En el texto, la primera vez que aparece la palabra "escalpelo" al crear el enlace le asocias la palabra "foto1", en la tercera aparición pones la palabra "foto2". Aunque tengas en el texto la misma palabra, mediante el enlace le puedes asociar un texto diferente lo que mostrará una imagen diferente con el mismo código. El código sería igual sustituyendo "Aquí va tu código lingo" por la sentencia anterior.
Si quieres puedes usar el número de palabra, pero yo creo que de esta forma es mucho más corto y sencillo. Repito, lo único en lo que debes tener cuidado es a la hora de crear los enlaces.
Ya verás que sencillo es de esta manera.
Por ejemplo si tienes el texto "la herramienta llamada escalpero" y seleccionas "escalpelo", vas al Inspector de texto y en el campo de enlace escribes "escalp", la palabra "escalpelo" pasará a ser un enlace con el texto asociado "escalp". Cuando sitúes el cursor del ratón encima del enlace "escalpelo", la variable código contendrá la palabra "escalp". Esa palabra tiene que ser el nombre de un miembro de imagen. Entonces solo tienes que hacer lo siguiente:
sprite(2).member = member( codigo, "fotos" )
Lo único que tienes que hacer es crear los enlaces poniéndoles como texto asociado el nombre de un miembro que sera la imagen a mostrar. En el texto, la primera vez que aparece la palabra "escalpelo" al crear el enlace le asocias la palabra "foto1", en la tercera aparición pones la palabra "foto2". Aunque tengas en el texto la misma palabra, mediante el enlace le puedes asociar un texto diferente lo que mostrará una imagen diferente con el mismo código. El código sería igual sustituyendo "Aquí va tu código lingo" por la sentencia anterior.
Si quieres puedes usar el número de palabra, pero yo creo que de esta forma es mucho más corto y sencillo. Repito, lo único en lo que debes tener cuidado es a la hora de crear los enlaces.
Ya verás que sencillo es de esta manera.
Excelente tienes toda la razón tu solución es muchísimo más elegante y practica, solo que tengo un pequeño problema el campo de enlace que esta en el inspector de texto lo utilizo para darle otras ordenes al hypertexto pues ademas de tener la orden en el mouseWithin debe tener una orden distinta con mouseUp que en la mayoría de los casos me remite a otro frame o a otra imagen, entonce yo usaba este campo junto con el Behavior de HyperText General que viene en la librería para cumplir estos otros comandos, pero quizá se pueda trabajar ambos con este código en el campo de enlace, voy a estar pensado en una solución, y si tu tienes alguna idea me seria de muchísima ayuda.
Por el momento lo que había logrado era esto, el código esta en la forma antigua del director pero igual funciona de todas formas si uso esto lo actulizare al dot sintax actual.
Global anterior
on mouseEnter me
anterior = -1
end
on mouseWithin me
esteSprite = me.spriteNum
if sprite(esteSprite).pointInHyperlink(the mouseLoc) then
numPalabra = sprite(esteSprite).pointToWord(the mouseLoc)
if (anterior <> numPalabra) then
codigo = sprite(esteSprite).member.word[numPalabra].hyperlink
case numPalabra of
60: set the member of sprite(13) to castlib("imagenes").member["escalpelo"]
62: set the member of sprite(13) to castlib("imagenes").member["frio"]
64: set the member of sprite(13) to castlib("fotos").member["02F-sae"]
end case
anterior = numPalabra
end if
else
set the member of sprite(13) to castlib("fotos").member["01F-sae"]
anterior = numPalabra
end if
set the locH of sprite(13) to (248)
end
Como veras tiene algunos cambios, pero el problema que surge con esta solución es que algunos de los enlaces no son compuestos de una sola palabra si no de 2 o hasta en algunos casos de muchas más de 20 pensé en solucionar esto uniendo las palabras con un _ y funciona pero surge otro problema usar este procedimiento me arruina totalmente el formateado del texto y hace que se vea horrible, entonces había pensado en otra cosa utilizando la misma solución pero contar los hyperlinks y que el case responda al numero de hyperlink almacenado en una variable, el problema es que no se como hacer esto supongo que es bastante fácil yo llegue a algo así:
links=[]
links = sprite(esteSprite).member.hyperlinks
numLink = links.count
Pero no es lo correcto por favor una ultima ayudita con este tema, si se puede solucionar de cualquiera de las dos formas vistas me parecería excelente.
Muchísimas, pero realmente muchísimas gracias por tu ayuda.
Agradecido eternamente.
Gabriel Arauco
Por el momento lo que había logrado era esto, el código esta en la forma antigua del director pero igual funciona de todas formas si uso esto lo actulizare al dot sintax actual.
Global anterior
on mouseEnter me
anterior = -1
end
on mouseWithin me
esteSprite = me.spriteNum
if sprite(esteSprite).pointInHyperlink(the mouseLoc) then
numPalabra = sprite(esteSprite).pointToWord(the mouseLoc)
if (anterior <> numPalabra) then
codigo = sprite(esteSprite).member.word[numPalabra].hyperlink
case numPalabra of
60: set the member of sprite(13) to castlib("imagenes").member["escalpelo"]
62: set the member of sprite(13) to castlib("imagenes").member["frio"]
64: set the member of sprite(13) to castlib("fotos").member["02F-sae"]
end case
anterior = numPalabra
end if
else
set the member of sprite(13) to castlib("fotos").member["01F-sae"]
anterior = numPalabra
end if
set the locH of sprite(13) to (248)
end
Como veras tiene algunos cambios, pero el problema que surge con esta solución es que algunos de los enlaces no son compuestos de una sola palabra si no de 2 o hasta en algunos casos de muchas más de 20 pensé en solucionar esto uniendo las palabras con un _ y funciona pero surge otro problema usar este procedimiento me arruina totalmente el formateado del texto y hace que se vea horrible, entonces había pensado en otra cosa utilizando la misma solución pero contar los hyperlinks y que el case responda al numero de hyperlink almacenado en una variable, el problema es que no se como hacer esto supongo que es bastante fácil yo llegue a algo así:
links=[]
links = sprite(esteSprite).member.hyperlinks
numLink = links.count
Pero no es lo correcto por favor una ultima ayudita con este tema, si se puede solucionar de cualquiera de las dos formas vistas me parecería excelente.
Muchísimas, pero realmente muchísimas gracias por tu ayuda.
Agradecido eternamente.
Gabriel Arauco
Muchísimas gracias me parece perfecto solo me queda una duda, aplique este código a mi sprite de texto y me funciona bien solo que poniéndolo tal cual me funciona igual para todos los enlaces que tengo, mi duda esta en que supongo que en
código = sprite(esteSprite).member.word[numPalabra]. Hyperlink
La variable "codigo" almacena la palabra que tengo sobre la cual estoy parado, supongamos que uso tu ejemplo y el texto asociado a cada enlace lo uso como miembro de la imagen que quiero mostrar, supongo que podría usar un código algo así por ejemplo
set the member of sprite(2) to member ("foto1") of castlib ("fotos")
(O algo así no creo que el código este bien escrito pero supongo que me entiendes)
Mi pregunta es en la parte donde tendría que poner "foto1" pongo "codigo" y si es así surge otro problema que pasa si tengo en el hypertexto algunas palabras que se repiten varias veces como ser "escalpelo pero supongamos este caso En la primera aparición de la palabra "escalpelo" me muestra una foto POR, la segunda aparición de esta palabra no cumple ninguna función y la tercera me muestra una foto diferente digamos Y el problema es como reconocer cual corresponde a cual.
Otra pregunta quizá pueda hacer esto de acuerdo al numero de palabra que representa digamos "escalpelo" en mi texto, tu crees que podría tomar el código sin la parte de código = sprite(esteSprite).member.word[numPalabra]. Hyperlink y solo usar al como
case numPalabra of
21: set the member of sprite(2) to member ("foto1") of castlib ("fotos")
23: set the member of sprite(2) to member ("foto3") of castlib ("fotos")
25:set the member of sprite(2) to member ("foto5") of castlib ("fotos")
end case
¿Sera esto factible? ¿Y si lo es o si se puede solucionar de otra forma me explicas un poco más este tema?
Sinceramente agradecido.
Gabriel Arauco
código = sprite(esteSprite).member.word[numPalabra]. Hyperlink
La variable "codigo" almacena la palabra que tengo sobre la cual estoy parado, supongamos que uso tu ejemplo y el texto asociado a cada enlace lo uso como miembro de la imagen que quiero mostrar, supongo que podría usar un código algo así por ejemplo
set the member of sprite(2) to member ("foto1") of castlib ("fotos")
(O algo así no creo que el código este bien escrito pero supongo que me entiendes)
Mi pregunta es en la parte donde tendría que poner "foto1" pongo "codigo" y si es así surge otro problema que pasa si tengo en el hypertexto algunas palabras que se repiten varias veces como ser "escalpelo pero supongamos este caso En la primera aparición de la palabra "escalpelo" me muestra una foto POR, la segunda aparición de esta palabra no cumple ninguna función y la tercera me muestra una foto diferente digamos Y el problema es como reconocer cual corresponde a cual.
Otra pregunta quizá pueda hacer esto de acuerdo al numero de palabra que representa digamos "escalpelo" en mi texto, tu crees que podría tomar el código sin la parte de código = sprite(esteSprite).member.word[numPalabra]. Hyperlink y solo usar al como
case numPalabra of
21: set the member of sprite(2) to member ("foto1") of castlib ("fotos")
23: set the member of sprite(2) to member ("foto3") of castlib ("fotos")
25:set the member of sprite(2) to member ("foto5") of castlib ("fotos")
end case
¿Sera esto factible? ¿Y si lo es o si se puede solucionar de otra forma me explicas un poco más este tema?
Sinceramente agradecido.
Gabriel Arauco
Con locH mueves el punto (0,0) de la imagen a la posición horizontal indicada, pero ese punto lo puedes modificar y no siempre está en el vértice superior izquierdo. Por lo general está centrado en la imagen.
El punto de registro es un punto tomado como la coordenada (0,0) dentro de la imagen, y lo puedes mover a tu antojo. Si estableces el punto de registro en el vértice superior derecho, cuando ejecutes la siguiente sentencia:
sprite(13).locH = 248
Situarás el vértice superior derecho de la imagen en la coordenada horizontal 248.
Por defecto todas las imágenes tienen el punto de registro en el centro de la imagen. Puedes cambiarlo en la ventana paint con la herramienta Registration Point. Y también desde el inspector de Propiedades, pulsando en el icono "List View Mode" situado en la parte superior derecha, en la lista que te aparece en la pestaña member buscas regPoint casi abajo del todo y pones las coordenadas que correspondan dentro de la imagen a su vértice superior derecho. Pero no las coordenadas del escenario sino las de la imagen, es decir, tomando el vértice superior izquierdo como el punto (0,0).
Otra opción sería no modificarlo, dejarlo en el centro de la imagen. Como el punto derecho a partir del cual se tienen que alinear siempre es el mismo, puedes hallar la distancia de ese punto usando la mitad del ancho de la imagen. Es decir, por ejemplo, todas las imágenes tienen que tener su borde derecho en la posición horizontal 248. El borde izquierdo dependerá del tamaño. Para alinear las imágenes en esa posición tienes que poner el siguiente código:
sprite(2).locH = 248 - (member(codigo, "fotos").width / 2)
Pruébalo y me comentas.
El punto de registro es un punto tomado como la coordenada (0,0) dentro de la imagen, y lo puedes mover a tu antojo. Si estableces el punto de registro en el vértice superior derecho, cuando ejecutes la siguiente sentencia:
sprite(13).locH = 248
Situarás el vértice superior derecho de la imagen en la coordenada horizontal 248.
Por defecto todas las imágenes tienen el punto de registro en el centro de la imagen. Puedes cambiarlo en la ventana paint con la herramienta Registration Point. Y también desde el inspector de Propiedades, pulsando en el icono "List View Mode" situado en la parte superior derecha, en la lista que te aparece en la pestaña member buscas regPoint casi abajo del todo y pones las coordenadas que correspondan dentro de la imagen a su vértice superior derecho. Pero no las coordenadas del escenario sino las de la imagen, es decir, tomando el vértice superior izquierdo como el punto (0,0).
Otra opción sería no modificarlo, dejarlo en el centro de la imagen. Como el punto derecho a partir del cual se tienen que alinear siempre es el mismo, puedes hallar la distancia de ese punto usando la mitad del ancho de la imagen. Es decir, por ejemplo, todas las imágenes tienen que tener su borde derecho en la posición horizontal 248. El borde izquierdo dependerá del tamaño. Para alinear las imágenes en esa posición tienes que poner el siguiente código:
sprite(2).locH = 248 - (member(codigo, "fotos").width / 2)
Pruébalo y me comentas.
Bueno tienes toda la razón podría crear todas las imágenes del mismo tamaño pero el problema surge si son muchas fotos entonces, esto ya lo explique en otro mensaje pero aparentemente no te llego, este es el mensaje:
Tengo otra pregunta, la foto que estoy ubicando tiene un encuandre que viene de la derecha y no todas las fotos que uso tienen el mismo tamaño entonces cuando esta foto cambia en el sprite el problema es que se sale del encuadre intente mantener una posición para el sprtie con locH pero el problema ahora surge en que esto me toma la posición contando desde la esquina izquierda entonces termino en el mismo problema por que se me sigue saliendo del encuadre entonces quiero saber si hay alguna forma de hacer el conteo de locH desde la derecha. Si es así por favor dime como o que otra forma de pocisionar la foto en el stage tengo, intente con left y me mantiene el encuandre perfecto pero ya también me deforma las fotos al tamaño de la original
Nuevamente muy agradecido.
Gabriel Arauco
Tengo otra pregunta, la foto que estoy ubicando tiene un encuandre que viene de la derecha y no todas las fotos que uso tienen el mismo tamaño entonces cuando esta foto cambia en el sprite el problema es que se sale del encuadre intente mantener una posición para el sprtie con locH pero el problema ahora surge en que esto me toma la posición contando desde la esquina izquierda entonces termino en el mismo problema por que se me sigue saliendo del encuadre entonces quiero saber si hay alguna forma de hacer el conteo de locH desde la derecha. Si es así por favor dime como o que otra forma de pocisionar la foto en el stage tengo, intente con left y me mantiene el encuandre perfecto pero ya también me deforma las fotos al tamaño de la original
Nuevamente muy agradecido.
Gabriel Arauco
Uff. ya no te preocupes deifinitivamente tu solución es mucho más sencilla y me ahorro muchísimos problemas.
Bueno al final solucione el ultimo asunto que te comente de esta manera quizá un poco morosa pero mucho más sencilla que las otras que estuve pensando.
Global anterior
Global código
on mouseEnter me
anterior = -1
end
on mouseWithin me
esteSprite = me.spriteNum
if sprite(esteSprite).pointInHyperlink(the mouseLoc) then
numPalabra = sprite(esteSprite).pointToWord(the mouseLoc)
if (anterior <> numPalabra) then
codigo = sprite(esteSprite).member.word[numPalabra].hyperlink
sprite(13).member = member( codigo, "imagenes" )
anterior = numPalabra
end if
else
sprite(13).member = member( "01F-sae", "fotos" )
anterior = numPalabra
end if
set the locH of sprite(13) to (248)
end
on mouseUp me
case codigo of
"escalpelo": go to frame 9
end case
end
Supongo incluso que podría asignar código como un Marker en el Score y remitir directamente a la palabra almacenada en código, pero esto ya lo probrare yo sin molestarte más.
El único tema que quedaría pendiente seri el de locH por la derecha espero puedas ayudarme con esto más y no te vuelvo a molestar.
Muchísimas gracias.
Para servirte siempre
Gabriel Arauco
Bueno al final solucione el ultimo asunto que te comente de esta manera quizá un poco morosa pero mucho más sencilla que las otras que estuve pensando.
Global anterior
Global código
on mouseEnter me
anterior = -1
end
on mouseWithin me
esteSprite = me.spriteNum
if sprite(esteSprite).pointInHyperlink(the mouseLoc) then
numPalabra = sprite(esteSprite).pointToWord(the mouseLoc)
if (anterior <> numPalabra) then
codigo = sprite(esteSprite).member.word[numPalabra].hyperlink
sprite(13).member = member( codigo, "imagenes" )
anterior = numPalabra
end if
else
sprite(13).member = member( "01F-sae", "fotos" )
anterior = numPalabra
end if
set the locH of sprite(13) to (248)
end
on mouseUp me
case codigo of
"escalpelo": go to frame 9
end case
end
Supongo incluso que podría asignar código como un Marker en el Score y remitir directamente a la palabra almacenada en código, pero esto ya lo probrare yo sin molestarte más.
El único tema que quedaría pendiente seri el de locH por la derecha espero puedas ayudarme con esto más y no te vuelvo a molestar.
Muchísimas gracias.
Para servirte siempre
Gabriel Arauco
No molestas. Estoy encantado de ayudarte en lo que pueda.
En vez de usar mouseUp puedes usar hyperlinkClicked:
On hyperlinkClicked me, lugar
go to frame lugar
end
Lugar contendrá la palabra asignada al enlace, es decir, el nombre del miembro de imagen que mostrarás cuando se coloca encima el cursor. Creas el marcador correspondiente con ese mismo nombre y todo solucionado.
No veo la necesidad de modificar la posición de las imágenes. Todas las imágenes tienen que estar en la misma posición, ¿no es así? Crealas todas con el mismo tamaño, y sitúa su punto de registro en el mismo sitio. De esta forma no tienes que cambiar para nada la posición.
De todas formas ¿a qué te refieres con locH por la derecha?
En vez de usar mouseUp puedes usar hyperlinkClicked:
On hyperlinkClicked me, lugar
go to frame lugar
end
Lugar contendrá la palabra asignada al enlace, es decir, el nombre del miembro de imagen que mostrarás cuando se coloca encima el cursor. Creas el marcador correspondiente con ese mismo nombre y todo solucionado.
No veo la necesidad de modificar la posición de las imágenes. Todas las imágenes tienen que estar en la misma posición, ¿no es así? Crealas todas con el mismo tamaño, y sitúa su punto de registro en el mismo sitio. De esta forma no tienes que cambiar para nada la posición.
De todas formas ¿a qué te refieres con locH por la derecha?
Hay una forma pero tiene algunas restricciones aunque por lo general funciona bien. Director te permite crear los hiperenlaces a tu antojo, lo que puede dar algún problema, por ejemplo cuando creas un único enlace con varias palabras, o con algunas letras solo de una palabra.
El código que tienes que colocar en el sprite del miembro de texto es el siguiente:
Global anterior
On mouseEnter me
anterior = -1
end
on mouseWithin me
esteSprite = me.spriteNum
if sprite(esteSprite).pointInHyperlink(the mouseLoc) then
numPalabra = sprite(esteSprite).pointToWord(the mouseLoc)
if (anterior <> numPalabra) then
codigo = sprite(esteSprite).member.word[numPalabra].hyperlink
-- Aqui va tu código lingo
anterior = numPalabra
end if
end if
end
Te explico: con pointInHyperlink se sabe si el cursor del ratón está encima de un enlace. En ese caso pointToWord te da el número que ocupa esa palabra dentro del texto. Con member. Word sabes que palabra es. Y con member.word[numPalabra]. Hyperlink obtienes el texto asociado al enlace.
En el texto asociado a cada enlace le puedes poner por ejemplo el nombre del miembro de imagen a mostrar.
Como es un método mouseWithin se ejecuta repetitivamente por lo que tienes que usar la variable 'anterior' para saber si se cambia de enlace o se sigue en el mismo.
Donde pongo "Aquí va tu código lingo" es donde tienes que hacer que se cambie la imagen, o la acción correspondiente usando la variable código.
Compruébalo y me comentas que tal te funciona.
El código que tienes que colocar en el sprite del miembro de texto es el siguiente:
Global anterior
On mouseEnter me
anterior = -1
end
on mouseWithin me
esteSprite = me.spriteNum
if sprite(esteSprite).pointInHyperlink(the mouseLoc) then
numPalabra = sprite(esteSprite).pointToWord(the mouseLoc)
if (anterior <> numPalabra) then
codigo = sprite(esteSprite).member.word[numPalabra].hyperlink
-- Aqui va tu código lingo
anterior = numPalabra
end if
end if
end
Te explico: con pointInHyperlink se sabe si el cursor del ratón está encima de un enlace. En ese caso pointToWord te da el número que ocupa esa palabra dentro del texto. Con member. Word sabes que palabra es. Y con member.word[numPalabra]. Hyperlink obtienes el texto asociado al enlace.
En el texto asociado a cada enlace le puedes poner por ejemplo el nombre del miembro de imagen a mostrar.
Como es un método mouseWithin se ejecuta repetitivamente por lo que tienes que usar la variable 'anterior' para saber si se cambia de enlace o se sigue en el mismo.
Donde pongo "Aquí va tu código lingo" es donde tienes que hacer que se cambie la imagen, o la acción correspondiente usando la variable código.
Compruébalo y me comentas que tal te funciona.
- Compartir respuesta
- Anónimo
ahora mismo