Comunidad de diseño web y desarrollo en internet online

Ayuda con los index de mi juego

Citar            
MensajeEscrito el 30 Mar 2014 05:27 am
Les cuento mas o menos como viene la mano. Resulta que estoy creando un videojuego con AS3, al ejecutarlo, en mi pantalla se ve lo que había creado: un contador de tiempo 'Timer' y otro de puntaje (estos son cuadros de textos dinámicos lo único que se puede ver en el archivo en edición), mi personaje que se maneja como si fuera la flecha del mouse y los enemigo que se van agregando constantemente como si hicieran "reshuffle", o sea cada 60 segundo un nuevo enemigo se agrega (usando 'addChild') desde un extremo de la pantalla, Todo esto codificado desde el archivo principal. El probrema es que mis enemigos se sitúan delante de mis contadores y no se como hacer como solucionar eso. Eh probado con todas las maneras de atribuirle un index a excepción de "SwapChildren", pero ninguno de los anteriores funciono. Tambien eh probado con asignarle a 'timerbox' un valor de TextField pero nada. Aquí les dejo el código de mi Timer:

var timeleft:Number=60;
timerbox.text=timeleft.toString();
timerbox.selectable = false;
setChildIndex(timerbox,numChildren - 1);

El problema podría ser que los enemigos se añaden constantemente al escenario? Como puedo solucionarlo?

PD: Soy nuevo en esto de los foros y perdonen si di mucha info. o hice algo mal jejeje...

Por Fakundito

9 de clabLevel



 

chrome
Citar            
MensajeEscrito el 01 Abr 2014 01:51 pm
Considera agrupar elementos en contenedores que te faciliten el manejo de la profundidad. por ejemplo todo lo que sea User Interface ponlo en un contenedor (aka MovieClip) en donde tengas botones de ayuda, info de puntaje, vidas, poder, etc, luego otro contenedor que sea el "escenario", adonde agregues enemigos, heroe, powerups, etc. Este ordenamiento por grupos l[ogicos simplificará no solo el manejo de profundidad, sino otros problemas con los que te irás encontrando

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 01 Abr 2014 11:11 pm
gracias por tu respuesta Jorge. En el código principal, Primero se agregan al escenario el fondo (un MovieCLip) y el personaje (otro Movieclip) mediante addChild, estos dos estan fuera de funciones. Despues, se inicia el contador que va agregando los enemigos (Sprites) (los enemigos se adhieren dentro de una funcion llamada por el contador que cree). Luego, fuera de esa función nuevamente, cree el Timer y el contador de puntaje (estos dos fuera de funciones también). No se cual sea el problema, por ahi esta mal el orden, pero no puedo hacer que estos dos ultimos queden en frente.

Por Fakundito

9 de clabLevel



 

chrome
Citar            
MensajeEscrito el 02 Abr 2014 01:09 pm
No se trata del orden de los comandos, sino DONDE agregas.
Lo que propongo es que uses un contenedor, llamemosle UIMovieClip donde haces el addChild de todos los elementos de interface que tienen que estar arriba
Digamos que tienes otro contenedor llamado escenario en donde haces el addChild de todo lo demas que tiene que ver con el juego (héroe, enemigos, etc)

Verifica adonde haces tus addChild, crea contenedores, organiza tu contenido

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 10 Abr 2014 07:07 pm
Eh probado con poner mi cuadro de texto que estaba en el escenario (donde iría el tiempo en cuenta regresiva), el que es un cuadro de texto dinámico con el nombre de "timerbox", lo puse dentro de un MovieClip llamado "tiempo" e hice esto:

var Tiempo:MovieClip = new MovieClip();
var timeleft:Number=60;
Tiempo.parent.timerbox.text=timeleft.toString();
Tiempo.parent.timerbox.selectable = false;
addChild (Tiempo);

pero me saltan estos tres errores:

error 1120: Acceso a una propiedad timerbox no definida.

error 1119: Acceso a una propiedad timerbox posiblemente no definida mediante una referencia con tipo estático flash.display:DisplayObjectContainer.

error 1119: Acceso a una propiedad timerbox posiblemente no definida mediante una referencia con tipo estático flash.display:DisplayObjectContainer.

Eh probado definiendo a "timerbox" como un "TextField" pero nada.
De todos modos, creo que el problema es que mis enemigos se agregan constantemente al escenario cambiando su orden de index, por eso se muestran al frente. Tendría que hacer como que cuando el numero o cuadro toquen a mis enemigos cambien de posicion al frente, pero la adición de mis enemigos se encuentra dentro de una función diferente a la de donde esta mi Timer.

Por Fakundito

9 de clabLevel



 

chrome
Citar            
MensajeEscrito el 10 Abr 2014 07:21 pm
Tienes errores demasiado básicos para poder llevar un juego a buen puerto. Los errores:

error 1120: Acceso a una propiedad timerbox no definida.
- haces un parent de algo que todavía no está agregado al displayList (addChild)

- error 1119: Acceso a una propiedad timerbox posiblemente no definida mediante una referencia con tipo estático flash.display:DisplayObjectContainer.
Lo mismo, aunque hubieras hecho el addChild, para timerbox el compilador no sabe lo que es, por lo tanto se queja por cada vez que lo nombras.

Tip: no crees las cosas por código, por lo menos hasta que no estes mas suelto. Dentro de un MovieClip dibuja todos los elementos que quieras manualmente, que quede una UI linda

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

chrome
Citar            
MensajeEscrito el 10 Abr 2014 08:02 pm
Gracias Jorge, aún soy un poco inexperto en esto puesto que si bien eh logrado crear la jugabilidad y apariencia en mi juego aún me falta aprender algunas cositas, mi problema es especialmente con el index, con esto mi juego se vería completo. Mi juego esta funcionando organizado de la siguiente manera:

1) El escenario o fondo (son montones de MovieCLips de plantas que forman una selva, dentro de un MovieClip general);
se adhiere mediante "addChild();" y luego "setChildIndex(MC, 0);" para situarlo al fondo de todo.

2) Un contenedor de ballas que estas son lanzadas por mi personaje. Se adhiere con AddChild();

3) Mi personaje o jugador, de igual manera que el anterior con addChild();

4) Cree un contador que llama a una función y en ella es donde se adhieren los enemigos a escena de manera constante. en total 4 enemigos, todos se adhieren de esta manera:
addChild(enemigo);
this.getChildAt(2);
a excepción de uno que se adhiere de esta manera:
addChild(flw);
setChildIndex(flw, 1);
curiosamente este ultimo si queda debajo de los contadores, pero también de mi personaje lo que quiero con este, pero no con los demás enemigos, por eso con ellos es diferente.

5) de la misma manera que la mayoría de los enemigos se adhiere con "this.getChildAt(3);" una barra que cuando el personaje que cuando se colisione termine el nivel.

6) se adhiere una bala al contenedor de balas con un addChild.

7) Aquí entra el TIMER con addChild();

8) Aquí entra el SCORE o puntaje.

9 y 10) Aquí entran dos botones del menu.

con estos 4 últimos tengo problemas con su orden, deberían estar al frente. Creo que mi código esta algo desprolijo y erróneo en cuanto al orden, pero no sabría identificarlos o solucionarlos.

Perdón por ser cabeza dura es que esto del orden se me complica un poco. Quizás explicar esto ayude.

Por Fakundito

9 de clabLevel



 

chrome
Citar            
MensajeEscrito el 11 Abr 2014 03:37 pm
Hola @Fakundito, parece que no captaste lo que dijo Jorge:
Prácticamente cualquier app o juego o pagina que hagas en Flash va a tener una jerarquía de DisplayObjects en el displayList (Sprites, MovieClip, Bitmap, Buttons, TextFields, etc). Por ende, la forma más simple y logica de hacer cualquier cosa, es usar contenedores (DisplayObjectContainer) como MovieClip o Sprite, a fin de agrupar otros DisplayObjects o DisplayObjectContainers.

Usar addChildAt(), o getChildAt(), para manejar TODOS los elementos de un juego en un mismo contenedor es tedioso y poco práctico.

Entonces:

Código ActionScript :

var contenedorFondo:Sprite = new Sprite();
var contenedorObjetosJuego:Sprite = new Sprite(); // aca pone el player, el contendor de las ballas, el contenedor de los enemigos, etc.

var contenedorPlayers = new Sprite(); // aca pone el player y los enemigos.
var contenedorBallas:Sprite = new Sprite(); // aca pone las balas.

var contenedorUI:Sprite = new Sprite(); // para poner los timers, puntajes, y todo lo que no es "parte" del juego, o sea, que es estatico.

Ahora tenes un set de contenedores para agregar cosas. Creemos una jerarquia:
Considerando que no tenes nada en el stage... nos fijamos como quedan los index:

Código ActionScript :

this.addChild( contenedorFondo ) // index 0
this.addChild( contenedorObjetosJuego ) // index 1
this.addChild( contenedorUI ) // index 2

// agregamos a contenedorObjetosJuego
contenedorObjetosJuego.addChild(contenedorPlayers); // index 0 en contenedorObjetosJuego 
contenedorObjetosJuego.addChild(contenedorBallas); // index 1 en contenedorObjetosJuego

// ahora fijate que contenedorObjetosJuego va a quedar con un index menor que contenedorUI, y contenedorFondo siempre va a estar al fondo.
// De esta forma no tenes que usar mas addChildAt, etc.... ya todo esta en  "layer" que deberia estar.
// Por eso, ahora podemos agregar el score y los botones, ya que siempre van a estar por encima del resto, ya que su contenedor es el ultimo child agregado en el root.
var score:Score = new UIScore();
contenedorUI.addChild(score);

// agrega los botones de menu en OTRO contenedor .
var menuContenedor:Sprite = new Sprite();
contenedorUI.addChild( menuContenedor ) ;
menuContenedor.addChild( boton1 );
menuContenedor.addChild( boton2 );


// ahora arma la jerarquia de enemigos y player.
contenedorPlayers.addChild( enemigo1 ); // index 0
contenedorPlayers.addChild( player ); // index 1
contenedorPlayers.addChild( enemigo2 ); // index 2
contenedorPlayers.addChild( enemigo3 ); // index 3

// agregamos una bala..
var balla:Balla = new Balla();
contenedorBallas.addChild( balla ) ;
balla.mover() // o cualquier metodo que quieras llamar.
// cuando terminaste con la balla, si la queres elimiar.
contenedorBallas.removeChild( balla ) ;



Espero que hayas entendido el concepto para poder implementarlo en tu juego.

Por rodrigolopezpeker

61 de clabLevel



 

chrome
Citar            
MensajeEscrito el 11 Abr 2014 07:31 pm
gracias rodrigolopezpeker por tu respuesta completa, me has ayudado.
Haber si eh entendido bien, primero defino los contenedores generales y luego voy agregando en ellos, digamos "subcontenedores", de esta forma estaría organizado mas prolijo.
Mi pregunta es: ¿da lo mismo el orden en que agrego cosas a los contenedores?
ej. comienzo agregando un enemigo al "contenedorPlayers", y luego sigo agregando un botón al "menuContenedor" suponele. O sea, en ese caso podría escribir el código desordenado ya que pertenecen a contenedores diferentes. Igual se que me conviene agrupar agregando los enemigos con los enemigos y los botones con los botones, pero me surge esa duda. No sé si se entendió.

Por Fakundito

9 de clabLevel



 

chrome
Citar            
MensajeEscrito el 11 Abr 2014 10:46 pm
Claro... solo considera esto:
cada vez que llamas a contenedor.addChild(obj)... estas poniendo el index de ese child encima de todo, DENTRO de ese contenedor.

Mira este ejemplo:

root.addChild(contenedor) ;
root.addChild(contenedor2)
contenedor.addChild( obj1 ) ;
contenedor.addChild( obj2 ) ;
contenedor.addChild( obj3 ) ;
contenedor.addChild( obj1 ) ;

aca terminas con este orden (de menor a mayor):
obj2, obj3, obj1
Y contenedor2 sigue estando por encima de contenedor.

Asi usas las llamadas a addChild() para "ordenar" los items. Se entiende? Mientras entiendas eso y el concepto de contenedor (cada contenedor tiene su propia jerarquia de DisplayObjects y contenedores), vas a poder resolver la parte grafica de tu juego.
Yo, particularmente, en 14 años trabajando con ActionScript, MUY rara vez uso setChildAt(), addChildAt(), getChildAt()... son funciones utiles a veces, pero no se necesitan casi nunca. Y son MUY propensas a errores, si tratas de mover a un indice mayor a .numChildren, te salta un error en tiempo de ejecución.

Te estaba escribiendo una analogía larga mostrandote que el displayList trabaja como un Array, o como el sistema de archivos de la compu (directorios=DisplayObjectContainer, archivos=DisplayObject) pero no se que conocimientos de programación tenes, y probablemente te la complique mas.

Por rodrigolopezpeker

61 de clabLevel



 

chrome
Citar            
MensajeEscrito el 12 Abr 2014 02:10 am
rodrigolopezpeker eh entendido perfectamente, de hecho había leído algo de la jerarquía dentro de contenedores y como va alternando el orden cuando agrego algo, pero en ningún momento la puse en practica lo de los contenedores de esa forma porque tenía armado mi juego a mi manera (al parecer complicada) y no quería salir de esa manera por miedo de hacer cualquier cosa.
Ahora con tus explicaciones comprendo como funcionan los contenedores y puedo seguir adelante con mi juego.
En cuanto a mi conocimiento, eh visto una serie de videos y leído paginas para informarme de AS3 y me ha servido. Mi videojuego lo comencé con un conocimiento nulo en codificación, siguiendo tutoriales en internet de como crear videojuegos. Jugando con los códigos logre combinar los tutoriales perfectamente y así lo cree, ahora solo resta perfeccionar algunos detalles y tu me has ayudado, no me has complicado.
Gracias.

Por Fakundito

9 de clabLevel



 

chrome

 

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