Crear un MC en Flash para usar como background
5 seguidores
A ver si me puedo explicar.. creo que si que es posible, pero no estoy seguro, el tema es que quiero hacer un flash al 100% del navegador y que un MC haga de background, como hacemos en html, que pones una imagen y te la repite hasta llenar todo el fondo.
Creo qeu hay alguna función que se llama .pat o algo así que puede hacerme un apaño, estoy en lo cierto?
Supongo que si no siempre se puede hacer un apaño, pero claro, hay que tener en cuenta las diferentes resoluciones, y si ya no es sencillo hacer que la ventana se acople al 100% (aun me tengo que mirar el tutorial de aqui abajo), lo de ponerle una imagen de fondo repetida creo que se complementará bastante bien con esta función.
pedro_fm
mide el stage y crealo segun el valor que te diga, o sino sin mas hazlo a 1600x1200 partiendo de x/y como en html de toda la vida.
loopecio
creo que no me he explicado bien.
El tema es que debe de ser dinámico, que se adapte a cada resolución de pantalla. Así, debe de cubrir al 100%, en altura y anchura, de cualquier navegador. PERO CON FLASH
Con html, es más que sencillo, pero no se si con el flash se puede, a mi me suena de haber visto algo alguna vez.. enga, que seguro que algun fiera sabe algo del tema. Yo mientras buscaré en el google.
odrakir
A ver si es esto lo que quieres: ENLANCE
¡Ojo! El ejemplo solo funciona en Explorer y Netscape, pero se podría arreglar para que funcionara también en otros navegadores.
El fondo se escala para ocupar toda la ventana, mientras que el contenido que quieras (en este caso un solo movieclip) permanece con el tamaño inalterable y en la posición que le digas (en este caso centrado).
Si es lo que quieres explico como está hecho.
Odrakir.
loopecio
sastamente!.. eso seria el primer paso..
No se si el fondo, mu chulo por cierto, es un MC que se repite.. es asi? si es así es exactamente lo que necesito.
EXPLICA, EXPLICA!
odrakir
El fondo, que es una foto sacada en Llanes, no es un movieclip que se repite, si no un movieclip que se adapta al tamaño de la ventana. Está siempre al 100%.
Aunque si quieres también se puede hacer que el fondo sea un mc compuesto de mcs de tamaño fijo que se repiten. Aunque para eso, quizás te valdría más hacerlo en html y poner encima un flash transparente, no sé... puede que esto último no sea muy compatible con navegadores.
Así que aquí va mi explicación:
Necesitamos:
- Un .html con un .swf dentro.
- Saber el tamaño de la ventana en cada momento (javascript)
- Mandar el tamaño de la ventana a flash cuando ésta cambie, para que sepa como mostrar el contenido.
- Variar el tamaño del archivo .swf, según el tamaño de la ventana. Peeeero, que no varie el tamaño de lo que tenemos dentro de ese swf, al menos no de todo.
El html: Llegado a este punto quiero aclarar que yo fuí aprendiendo lo que necesitaba de javascript para hacer esto, así que puede que esté un poco chapuzas. (la parte fuera de la etiqueta de código son comentarios al código anterior)
<code><HTML>
<HEAD>
<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<TITLE>P&aacute;gina de Fotos</TITLE>
<STYLE TYPE="text/css" MEDIA="screen, print, projection">
<!--
#mifla
.unfla { }
-->
</STYLE>
</code>Este estilo se usa para referirte al swf después.
<code>
<SCRIPT LANGUAGE="JavaScript">
<!--
function newSize(datoX,datoY) {
if(document.all && !document.getElementById) {
document.all['mifla'].style.pixelWidth = datoX;
document.all['mifla'].style.pixelHeight = datoY;
// window.alert('Primera');
}else{
document.getElementById('mifla').style.width = datoX+'px';
document.getElementById('mifla').style.height = datoY+'px';
}
}
</code>Esta función (newSize) es llamada desde el swf para cambiar el tamaño del mismo en el html. En principio este tamaño es 1px x 1px. Aquí, y en la siguiente, es probablmente donde habría que cambiar algo para que funcionara en mozilla y opera, pero no me preguntes qué, habría que investigarlo.
<code>
function dimeSize() {
var myWidth = 0, myHeight = 0;
if( typeof( window.innerWidth ) == 'number' ) {
//Non-IE
myWidth = window.innerWidth;
myHeight = window.innerHeight;
} else {
if( document.documentElement &&
( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
//IE 6+ in 'standards compliant mode'
myWidth = document.documentElement.clientWidth;
myHeight = document.documentElement.clientHeight;
} else {
if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
//IE 4 compatible
myWidth = document.body.clientWidth;
myHeight = document.body.clientHeight;
}
}
}
window.document.mifla.SetVariable('resx',myWidth);
window.document.mifla.SetVariable('resy',myHeight);
}
</code>Esta función (dimeSize) se llama cada vez que se cambia el tamaño de la ventana (onResize, está en la etiqueta BODY) y también la primera vez desde el swf, para adaptar el swf al tamaño de la ventana antes de que ésta haya sido cambiada de tamaño
<code>
//-->
</script>
</HEAD>
<BODY bgcolor="#557A96" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" scroll="no" onResize="dimeSize();">
<SPAN class=unfla id="mifla" style="position:relative; width:1px; height:1px; z-index:1">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/
swflash.cab#version=6,0,0,0" width="100%" height="100%" align="" id="mifla">
<param name=movie value="superflash.swf">
<param name=salign value="LT">
<param name=quality value=high>
<param name=scale value=noscale>
<embed src="superflash.swf" quality=high scale=noscale bgcolor=#557A96 width="100%" height="100%" name="mifla" swliveConnect="true" salign="LT" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>
</object>
</SPAN>
</BODY>
</HTML>
</code>
Por último las propiedades del swf: Tienes que usar span y object porque si no no tira, importante "NOSCALE" y "align LT"
Buf!. sigo en otro mensaje.
odrakir
En el root del fla:
<code>
_root.resactx = 500;
_root.resacty = 500;
_root.resx = -1;
_root.resy = -1;
_root.attachMovie("fondo","fondo",1);
_root.attachMovie("objeto1","objeto1",2);
getURL("javascript:dimeSize()");
_root.createEmptyMovieClip("esperador",3);
_root.esperador.onEnterFrame = function ()
{ if((_root.resx==-1)||(_root.resy==-1)) {}
else {
getURL("javascript:newSize("+_root.resx+","+_root.resy+")");
_root.resactx= _root.resx;
_root.resacty= _root.resy;
_root.objeto1.reposiciona();
_root.fondo.reposiciona();
_root.ocultador._x =_root.resactx+10;
_root.resx=-1;
_root.resy=-1;
}
}</code>
Como ves le doy un ancho y alto cualquier en principio (500). resactx y resacty guardan la anchura y altura actual de la ventana.
Mientras que resx y resy recogen los parámetros de anchura y altura devueltos por la función javascript dimeSize. Cuando son -1 no pasa nada, no ha cambiado el tamaño.
El clip esperador está atento a cuando cambian, dejan de ser -1, y entonces, como el tamaño de la ventana ha cambiado, llama a la funció javascript newSize, que cambia el tamaño del swf en el html. Luego actualiza resactx y resacty. Y finalmente llama a una función reposiciona, creada para todos los objetos y que en cada uno hace una cosa diferente, lo que queramos.
En el caso de fondo lo que hace es cambiar sus propiedades _width y _height a resactx y resacty.
En el caso de objeto1 cambia _x e _y a resactx/2 y resacty/2. Para mantenerlo centrado. Con este mismo método lo podríamos colocar en cualquier posición relativa al tamaño de la ventana.
Buf... creo que nada más... voy a beber agua.
Odrakir.
loopecio
WOW!
colega te lo has currao. merci.. ahora cuando tengo algo de tiempo disecciono el codgo este.
MUCHAS GRACIAS.
Usuario desconocido
Hay una forma más sencilla para hacer que un movieclip se reescale al tamaño de la ventana, y es poner directamente el código dentro del flash mediante el evento onResize del objeto Stage, así nos evitamos problemas con los navegadores :D
EJEMPLO
Descarga el FLA
El código del primer fotograma del flash es este:
<code>
stop();
//Función que se va a ejecutar cada vez que se redimensiona el Flash
function recolocar(ancho, alto) {
fondo._x = 0;
fondo._y = 0;
fondo._width = ancho;
fondo._height = alto;
}
//La llamamos la primera vez para que haga el primer ajuste
recolocar(Stage.width, Stage.height);
//Creamos un objeto con el evento onResize, en el que llamamos a la función recolocar con las dimensiones del escenario nuevas
redimension = new Object();
redimension.onResize = function() {
recolocar(Stage.width, Stage.height);
}
//Cambiamos la alineación del Flash a arriba izquierda y sin escala
Stage.align = "TL";
Stage.scaleMode = "noScale";
Stage.showMenu = false;
//Vinculamos el objeto redimension con el objeto Stage, para que funcione el evento onResize
Stage.addListener(redimension);
</code>
Lo único que cambia en el HTML para que funcione es también la alineación del objeto Flash, también arriba a la izquierda:
<code>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>prueba</title>
</head>
<body bgcolor="#202020" marginwidth="0" marginheight="0" leftmargin="0" topmargin="0">
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=6,0,0,0" width="100%" height="100%" id="prueba" align="middle">
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="prueba.swf" />
<param name="menu" value="false" />
<param name="quality" value="high" />
<param name="scale" value="noscale" />
<param name="salign" value="lt" /> <------------- Este
<param name="bgcolor" value="#202020" />
<embed src="prueba.swf" menu="false" quality="high" scale="noscale" salign="lt" bgcolor="#202020" width="100%" height="100%" name="prueba" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</body>
</html>
</code>
loopecio
Bueno voy a echarle el guante, a esto.. y he visto tu post msanchez.. Exactamente lo que necesito es que un MC se mantenga fijo en cuanto a tamaño en el centro, y lo que se adapte al navegador sea un MC que se repita,pongamos que tiene un jpg de 40x40 (como los avatares.. jeje) que tiene que repetirse hasta ocupar todo el navegador.
La primera parte queda clara. La segunda e sla que tengo que masticar un poco. La cueston viene por que ahora estoy usando transparencias en html, pero se de buena tinta, que eso no rula en MAC, y mi obsesión por que se vea bien en todos los navegadores, y todas las plataformas, me lleva a comerme el tarro de esta manera. Igual no vale la pena...
Por cierto, Odrakir, no tendras un .fla como ejemplo de esto que me enseñas, no?
odrakir
msanchez
Hay una forma más sencilla para hacer que un movieclip se reescale al tamaño de la ventana, y es poner directamente el código dentro del flash mediante el evento onResize del objeto Stage, así nos evitamos problemas con los navegadores :D
msanchez... te odio...http://www.smileys.ws/sm/sad/00000005.gif
¿Tú sabes el tiempo que me estuve pegando con eso hasta que funcionó? y encima ni siquiera funciona bien del todo...http://www.smileys.ws/sm/speechless/00000003.gif
Bueno... muchas gracias.
Odrakir.
odrakir
Ahora que recuerdo...
Ya sé porque yo me metí en tanto lio. Lo que me pasaba es que yo necesitaba que el flash cambiara de tamaño dentro de la web y que hubiera html alrededor... Por eso me metí en ese jaleo...
Aunque para lo que lo usé después me habría valido tu opción... :(
Odrakir.
Usuario desconocido
No me odies que solo he puesto la solución flashera :D es que meterse con javascript+flash suele ser demasiado lioso a veces para hacer cosas simples
loopecio, te he enseñado el camino para hacer lo que tú quieres, te he puesto una función que se ejecuta cada vez que cambias el tamaño del navegador, si ahora quieres tener un movieclip centrado, prueba a abrir el FLA que he colgado antes y cambia la función recolocar por esta otra:
<code>
function recolocar(ancho, alto) {
fondo._x = (ancho-fondo._width)/2;
fondo._y = (alto-fondo._height)/2;
}
</code>
De esta forma el clip fondo siempre va a estar centrado en el flash, independientemente del tamaño de éste.
Si luego también quieres hacer un mosaico, create una función que pasándole como argumentos el ancho y el alto del escenario, te duplique tu movieclip textura a lo largo y ancho de todo el escenario.
Te lo haría yo pero prefiero enseñar a pescar que dar el pescado directamente (además que estoy trabajando :D )
loopecio
msanchez
Te lo haría yo pero prefiero enseñar a pescar que dar el pescado directamente (además que estoy trabajando )
jajajajaj, di que si. Luego faltara paciencia para llegar pillar lago, pero es así.
una_china_en_mi_zapato
Creo que esto te puede ayudar:
http://www.e-tonilopez.com/after-hours/archives/000383.html
http://www.e-tonilopez.com/after-hours/archives/000382.html
El señor Toni Lopez es un crack del flash :D
-
loopecio
Si, si, si, PEDRO!, tio, me viene al pelo eso.. Muchas gracias tio! Tu si que eres un crack!
odrakir
Ta shulo, es más o menos lo que usé en el PORTFOLIO. Perooo, con esto no se puede poner html alrededor del flash, no?
Odrakir.
loopecio
Oye, estoy flipando con el tutorial, que ha puesto pedro para hacer fondos en flash, super sencillo, super potente, y super útil.
MUY RECOMENDABLE,.. y la web esta, de toni lopez, esta pero que rica, rica.
una_china_en_mi_zapato
loopecio
Oye, estoy flipando con el tutorial, que ha puesto pedro para hacer fondos en flash, super sencillo, super potente, y super útil.
MUY RECOMENDABLE,.. y la web esta, de toni lopez, esta pero que rica, rica.
jejejeje, sip, Toni monto http://www.after-hours.org/ hace cosa de medio año y el tio no para de currarse tutos y articulos cojonudos, aparte de ser la mar de majo. Si tienes alguna duda con los tutos tiene una seccion dedicada a estos en su foro:
foro after-hours
-
odrakir
Una China en mi Zapato
jejejeje, sip, Toni monto http://www.after-hours.org/ hace cosa de medio año y ...
Buen enlace... pa la saca!
Odrakir.
loopecio
Buff, que mákina. .. pues lo que me has pasado es exactamente lo que quería, de una manera sencillisima, estoy ahora mismo metido en el tema, y soólo me falla un a cosa, pero voy a ver si soy capaz de solucionarla por mi mismo, sino daré un poco por saco,.. bien por aqui, o en el foro del toni (afterhours) :mrgreen: