Flash. No repetir rollOver
5 seguidores
Chicos, me dirijo a ustedes con una consulta q me trae de malas:
Resulta q para una actualización de mi sitio, necesito hacer q un rollOver se repita nomal HASTA q se presione ese botón;una vez el boton haya sido presionado, ese rollOver no se vuelva a repetir... osea, q el evento de rollOver desaparezca.
Calculo q con una función booleana se podría llegar a hacer, aunq no estoy completamente seguro.
Claro q necesito q el botón siga funcionando, pero q el rollOver no se repita si el botón ya fué presionado la 1ra vez.
Eso es todo; espero q me puedan ayudar. Muchas gracias!
maxer3d
creo que entendi...
lo que queres es ponerlos a mano ok entonces una vez que los tengas todos en el escenario:
<code>
over = function () {
this.gotoAndStop(2);
};
out = function () {
this.gotoAndStop(1);
};
cantidad_de_botones_en_stage = 90;
for (i=0; i<cantidad_de_botones_en_stage; i++) {
var bot = this["btn"+i];
bot.quien_soy = i;
bot.onRollOver = over;
bot.onRollOut = out;
bot.onRelease = function() {
delete this.onRollOut;
delete this.onRollOver;
this.gotoAndStop(3);
funcion(this.quien_soy);
};
}
function funcion(quien_es) {
trace("boton Nº: "+quien_es);
}
</code>
tengo que chequearlo pero creo que con eso basta...
maxer3d
lo que podes hacer si tus botones tienen nombres correlativos como dice Ventd'Ava:
btn1
btn2
btn3
btn4
btn5
etc
<code>
over = function () {
this.gotoAndStop(2);
};
out = function () {
this.gotoAndStop(1);
};
createEmptyMovieClip("contenedor_de_botones", 1);
distancia_x = 10;
for (i=0; i<90; i++) {
contenedor_de_botones.attachMovie("btn"+i, "bot"+i, i, {_x:distancia_x*i, quien_soy:i, onRollOver:over, onRollOut:out});
var bot = contenedor_de_botones["bot"+i];
bot.onRelease = function() {
delete this.onRollOut;
delete this.onRollOver;
this.gotoAndStop(3);
funcion(this.quien_soy);
};
}
function funcion(quien_es) {
trace("boton Nº: "+quien_es);
}
</code>
si eso no te resulta es que no estoy entendiendo al 100% lo que queres lograr por no ser lo más recomendable o usado por la mayoria...
si vas a hacer los botones a mano, con lo que tenes arriba te basta para ponerlos en el stage un al lado del otro y después veras si haces un scroll de alguna manera o modificando un poco el código los puedes separar en filas y columnas etc...
hay muchas soluciones...
...podrías poner un ejemplo de algo parecido que se pueda ver colgado en alguna parte....
ventdaval
Buenas,
Si los botones los creas con codigo, (es mas comodo) al crearlos les puedes asignar las acciones con sus datos especificos y demases facilmente, ya que igual tendras la informacion para crearlos serializada...
En cualquier caso, para mi lo mas comodo casi siempre es crear una funcion aparte que aplique los comportamientos... tal que asi:
<code>function accionarBoton(boton, parametro) {
boton.onRollOver = function() {
boton.gotoAndStop(2);
}
boton.onRollOut = function() {
boton.gotoAndStop(1);
}
boton.onRelease = function() {
delete boton.onRollOut;
delete boton.onRollOver;
boton.gotoAndStop(3);
trace(parametro);
}
}</code>
Con esto, al crearlos, simplemente llamas a la funcion con el boton y el parametro correspondiente asi:
<code>accionarBoton(miBoton, miParametro);</code>
... si los tienes ya creados en el escenario, y solo quieres darles la accion, necesitas alguna manera de decirle "al codigo" qué objetos, y con que parametros debe aplicar los comportamientos... para esto puedes crear un array con tus botones y otro correlativo con sus parametros, tal que asi:
<code>var misBotones:Array= new Array(btn1,btn2,btn3,btnN);
var misParametros:Array= new Array("texto1", "texto2", "texto3", "textoN");</code>
Luego, ya puedes crear un bucle (un codigo que se repite una determinada cantidad de veces) que vaya iterando por cada uno de los elementos del array, y les asigne las funciones que quieras, con el correspondiente parametro del otro array:
<code>var cantidad=misBotones.length; //para saber cuantos elementos hay, y asi saber cuantas iteraciones habra que hacer...
for(var i=0; i<cantidad; i++) { //declaramos un bucle... este se ejecutara cierta cantidad de veces, sumandole uno a "i" (que empieza con valor cero), mientras "i" sea menor que la cantidad de objetos ("cantidad")
var boton=misBotones[i]; //seleccionamos un boton,
var parametro=misParametros[i]; //su correspondiente parametro...
accionarBoton(boton, parametro); //y "aplicamos" la funcion al boton, con su parametro correspondiente...
}</code>
Si te quieres ahorrar escribir los arrays, y tienes los botones nombrados con numeros correlativos, puedes hacer un bucle asi:
<code>for(var i=1; i<90;i++) { //empezamos con 1 y terminamos con 89)
var boton=this["boton"+i]; //seleccionamos el clip que este en "this" (el timeline actual) y que se llame "boton" mas el numero que tenga "i"
//...
}</code>
En este caso, para los parametros, hay varias maneras... puedes crear variables propias de cada boton, un objeto, etc.... yo te propongo igualmente crear un array en el que coincidan los numeros con el indice (creo que quedaria mas ordenado), tal que asi:
<code>var misParametros=new Array();
misParametros[1]="texto 1";
misParametros[2]="texto 2";
misParametros[3]="texto 3";
//...
misParametros[89]="texto 89";</code>
Espero se entienda... Saludos...
damianmuti
MAXer3D
que es lo que queres hacer?
A eso iba antes...
Lo q quiero es hacer los 90 botones x separado...
Hasta ahi vamos bien ?
Osea... los quiero hacer yo, no los quiero hacer x código.
Luego de eso...
Lo q quiero es poner cada uno de los 90 botones q hice en mi película y ponerles un nombre de instancia correlativamente numérico:
btn1
btn2
btn3
btn4
btn5
etc
Luego, en el keyframe donde estan los botones, poner una funcion con la q no se repita el rollOver después de presionado (q eso lo logramos) y q me tome esas funciones para cada boton SIN la necesidad de agregar código, sinó q ese código me tome las funciones para el:
btn1
btn2
btn3
btn4
btn5
etc
Creo q ahora me expliqué bastante mejor :P
Gracias x tu ayuda y compasión! ;)
maxer3d
que es lo que queres hacer?
damianmuti
MAXer3D
creas una nueva capa dentro del mc que ocupe los tres keyframes y es ahi en donde pones el textField
tambien el ultimo codigo que puse
Bien, solucionado, ya me funciona...
Ahora bien, q le cambio a tu cod para q no me duplique el mc ?
maxer3d
creas una nueva capa dentro del mc que ocupe los tres keyframes y es ahi en donde pones el textField
tambien el ultimo codigo que puse
damianmuti
MAXer3D
eso es lo que hace lo que acabo de poner
Es q tu codigo me sigue duplicando el MC, más allá de q no me salió lo último q me dijiste de hacer.
Mi boton es mi mc, x eso no te comprendo...
Mi boton (un mc) está hecho así:
keyframe1: nro1 blanco
keyframe2: nro1 celeste
keyframe3: nro1 rojo
Ahora bien... donde meto la caja de texto ?
maxer3d
eso es lo que hace lo que acabo de poner
damianmuti
MAXer3D
pone una caja de texto dentro de tu mc y ponele nombre de instancia
texto
dentro de tu boton pone esto en una capa
<code>
texto.text = quien_soy+1;
</code>
Agradezco tu preocupación y tu ayuda, pero lo q quiero hacer es hacer cada boton x separado... ya sé q también suena una locura, pero así lo prefiero. Tampoco quiero q me duplique el MC.
Lo explico más detenidamente:
En mi película meter los noventa botones, cada uno con el nombre de instancia correspondiente: btn1, btn2, btn3, btn4, btn5, etc
En el keyframe de los botones pegar un código q me cumpla las funciones q necesito, pero q me funcione para todos los botones a la misma vez...
Se entendió un poquitin mejor ?
maxer3d
pone una caja de texto dentro de tu mc y ponele nombre de instancia
texto
dentro de tu boton pone esto en una capa
<code>
texto.text = quien_soy+1;
</code>
damianmuti
MAXer3D
copia pega
En tu bibliteca tenes que tener el movieclip linkeado que va a hacer de boton con nombre: tu_mc_desde_biblioteca
Woooha, hecho!
Funciona...
Q pasa (y ya me paso de molesto, no?¿)?, lo q no aclaré es q cada boton lleva un texto con un número...
A lo q me refiero, tengo 90 botones q son números del 1 al 90.
No me molesta poner los 90 botones en mi película (lo digo xq veo q tu codigo va duplicando el MC); lo q no quiero es tener q ir editando el mismo código una y otra vez para cambiarle de btn1 a btn2 y así sucesivamente...
Quizá me expresé mal; mil disculpas
maxer3d
copia pega
En tu bibliteca tenes que tener el movieclip linkeado que va a hacer de boton con nombre: tu_mc_desde_biblioteca
damianmuti
MAXer3D
<code>
over = function () {
this.gotoAndStop(2);
};
out = function () {
this.gotoAndStop(1);
};
createEmptyMovieClip("contenedor_de_botones", 1);
distancia_x = 10;
for (i=0; i<90; i++) {
contenedor_de_botones.attachMovie("tu_mc_desde_biblioteca", "bot"+i, i, {_x:distancia_x*i, quien_soy:i, onRollOver:over, onRollOut:out});
var bot = contenedor_de_botones["bot"+i];
bot.onRelease = function() {
delete this.onRollOut;
delete this.onRollOver;
this.gotoAndStop(3);
funcion(this.quien_soy);
};
}
function funcion(quien_es) {
trace("boton Nº: "+quien_es);
}
</code>
Ayayay...
Me creerías si te dijera q tu código me asustó? :P
Como debo hacerlo funcionar? :$
maxer3d
<code>
over = function () {
this.gotoAndStop(2);
};
out = function () {
this.gotoAndStop(1);
};
createEmptyMovieClip("contenedor_de_botones", 1);
distancia_x = 10;
for (i=0; i<90; i++) {
contenedor_de_botones.attachMovie("tu_mc_desde_biblioteca", "bot"+i, i, {_x:distancia_x*i, quien_soy:i, onRollOver:over, onRollOut:out});
var bot = contenedor_de_botones["bot"+i];
bot.onRelease = function() {
delete this.onRollOut;
delete this.onRollOver;
this.gotoAndStop(3);
funcion(this.quien_soy);
};
}
function funcion(quien_es) {
trace("boton Nº: "+quien_es);
}
</code>
damianmuti
Touché!
Al principio no funcionaba ya q necesitaba q se quedara en el OnRelease, así q cambié una pavada al código y funciona!
Quedó así
<code>
btn1.onRollOut = function () {
btn1.gotoAndStop(1);
}
btn1.onRollOver = function () {
btn1.gotoAndStop(2);
}
btn1.onRelease = function () {
delete this.onRollOut;
delete this.onRollOver;
btn1.gotoAndStop(3);
}
</code>
Ahora bien, solo me restaría hacerles una pregunta...
Como podría armar un código para no tener q repetirlo en el mismo keyframe 90 veces (si dejara el codigo así debería ir cambiando el cod 90 veces para cada boton, cambiandole de btn1 a btn2 y así sucesivamente con los 90), solamente cambiándole el nombre de instancia a cada boton?
damianmuti
dani
<code>nombreDelBoton.onRollOver = function () {
blablabla;
}
nombreDelBoton.onRelease = function () {
delete this.onRollOver;
blablabla;
}</code>
suerte :)
d+g.
Voy a probarlo!
Gracias!
damianmuti
DVD'78
<em>No se puede hacer alguna funcion x la cual se ejecute el rollOver y luego, después de presionar el boton, se borre esa funcion ?</em>
Si te refieres a alguna función predefinida en flash.. me temo que no.
Osea q la única manera de hacerlo es la q vos me planteas?
Entonces...
No se podría cambiar el color del texto del boton una vez presionado ?
Hice una funcion para cambiar el boton; funciona bien pero me cambia todo el objeto completo (x ejemplo: si pongo una imagen de fondo en ese boton, me "pinta" la imagen y el texto del mismo color), y necesitaría q cambie solamente el color del texto.
La funcion es ésta:
El boton tiene un monbre de instancia bt_texto1
En el keyframe
<code>
function cambiar (boton) {
mi_color = new Color("bt_texto"+boton);
mi_color.setRGB (0xff9900);
}
</code>
Y en el boton
<code>
on (release) {
cambiar(1);
_root.contenedor.loadMovie("sonoridad1.jpg");
}
</code>
Como dije, me "pinta" todos los objetos dentro del boton del color q elegí, pero necesitaría q solamente me cambie el color del texto
granatta Profesor Plus
<code>nombreDelBoton.onRollOver = function () {
blablabla;
}
nombreDelBoton.onRelease = function () {
delete this.onRollOver;
blablabla;
}</code>
suerte :)
d+g.
x8
<em>No se puede hacer alguna funcion x la cual se ejecute el rollOver y luego, después de presionar el boton, se borre esa funcion ?</em>
Si te refieres a alguna función predefinida en flash.. me temo que no.
damianmuti
DVD'78
Podrías crearte un movieclip con dos fotogramas y llamarlo por ejemplo "estadoboton", un fotograma para la posición de reposo y lel otro para la de rollOver.
Inicializarias la variable estadoOver a true,
estadoOver=true
Y después en el botón hacer algo así:
<code>on(rollOver){
if(estadoOver) estadoboton.gotoAndStop(2)
}
on(rollOut){
estadoboton.gotoAndStop(1)
}
on(press){
estadoOver=false;
//El código a parte que necesitaras
}</code>
Te sirve? con esto al presionar pondrías la variable estadoOver a false con lo que ya no entraría la condición del rollOver.
edito: Supongo que lo habrias dado por hecho, pero por si acaso te digo que se me había olvidado decir que el botón sería un botón transparente encima del movieclip "estadoboton".
Bien, veo q ya me entendistes...
El problema es q es una galería de fotos en las cuales tengo casi 90 fotos...
Hacer ésto 90 veces es una desquiciada locura!
No se puede hacer alguna funcion x la cual se ejecute el rollOver y luego, después de presionar el boton, se borre esa funcion ?
Lamento volverlos locos, pero no se me ocurre como hacerlo.
x8
Podrías crearte un movieclip con dos fotogramas y llamarlo por ejemplo "estadoboton", un fotograma para la posición de reposo y lel otro para la de rollOver.
Inicializarias la variable estadoOver a true,
estadoOver=true
Y después en el botón hacer algo así:
<code>on(rollOver){
if(estadoOver) estadoboton.gotoAndStop(2)
}
on(rollOut){
estadoboton.gotoAndStop(1)
}
on(press){
estadoOver=false;
//El código a parte que necesitaras
}</code>
Te sirve? con esto al presionar pondrías la variable estadoOver a false con lo que ya no entraría la condición del rollOver.
edito: Supongo que lo habrias dado por hecho, pero por si acaso te digo que se me había olvidado decir que el botón sería un botón transparente encima del movieclip "estadoboton".
damianmuti
DVD'78
Pruebalo así:
nombreboton.enabled=false
Ahora sí, eso sí me funciona como corresponde, gracias... Pero sigue sin ser lo q necesito. Necesito desabilitar el rollOver luego de haber sido presionado el boton, y la funcion q me pasaste me anula toda funcionalidad del boton
x8
Pruebalo así:
nombreboton.enabled=false
damianmuti
Nop, no me funciona... eso es flash 8?
Creo q tampoco me sirve, xq me dejaría de funcionar el boton, y no es lo q necesito...
Lo q necesito es q no haga más rollOver luego de haber sido presionado el boton
Usuario desconocido
en el fotograma usas buttonenabled con el nombre de instancia del botón y la opción false y deja de ser utilizable, funciona seguro?
damianmuti
Si, claro... disculpenme q no lo haya aclarado antes, pero estoy utilizando flash 8
Ahora bien, probé lo q me dijiste anteriormente, pero no me funciona... =\
Usuario desconocido
si es en flash
nombreboton.buttonenabled=false