Foros del Web » Creando para Internet » Flash y Actionscript »

problemas con videojuego de navecitas

Estas en el tema de problemas con videojuego de navecitas en el foro de Flash y Actionscript en Foros del Web. Hola, muy buenas a tod@s. Espero no liarme mucho escribiendo lo que me pasa: Estoy haciendo un videojuego de navecitas de scroll lateral (tipo U.N ...
  #1 (permalink)  
Antiguo 23/08/2007, 06:03
 
Fecha de Ingreso: noviembre-2004
Mensajes: 47
Antigüedad: 20 años
Puntos: 0
Pregunta problemas con videojuego de navecitas

Hola, muy buenas a tod@s. Espero no liarme mucho escribiendo lo que me pasa:

Estoy haciendo un videojuego de navecitas de scroll lateral (tipo U.N Squadron o R-Type). Primero movía la nave y disparaba con el ratón. Ahí todo perfecto. El caso es que decidí que el manejo fuera mediante teclado, a la vieja usanza .

Ahora tengo el problema de que al disparar, el láser se mueve junto con la nave, siguiendo las mismas coordenadas, en vez de salir desde el morro de la nave y continuar horizontalmente por la pantalla, independientemente de si mueves arriba o abajo la nave. El láser sube o baja junto con la nave.

La nave es un Clip de Película (se le llama MC, no??), al igual que el láser. La idea es que cada vez que pulso la barra espaciadora, creo una instancia de láser (hasta un máximo de 25 en pantalla. Luego borra con removeMovieClip() y vuelve a empezar). El código es el siguiente:

Código:
	 if (Key.isDown(Key.SPACE)){
		 this.attachMovie ("laser", "disp"+i, i, {_x:this._x, _y:this._y});

		 eval("_root.disp"+i)._x = this._x;
		 eval("_root.disp"+i)._y = this._y;	
		 i++;
		 //cuando se alcance el número máximo de disparos, procedemos a eliminarlos para liberar memoria. Para eliminarlos, utilizo removeMovieClip()
		 if (i>=max_disparos){
		 	i=0;
		 	for(var j=0;j<max_disparos;j++){
			 	nombre="disp"+j;
			 	_root.nombre.removeMovieClip();
			}
		 }
	  }
El problema puede ser cuando pongo:
Código:
		 eval("_root.disp"+i)._x = this._x;
		 eval("_root.disp"+i)._y = this._y;
Probé a ejecutar con y sin eso, pero nada, sigue igual.

Otra pregunta referente a esto es la siguiente. Cuando instancio los láser, lo hago de manera dinámica. Cómo podría aplicarle propiedades a cada disparo?? Es decir, si quiero hacer un hitTest() desde cada instancia de láser (no sería lo más correcto), cómo haría?? Es que este es el problema que se me plantea ahora para los enemigos, pq los genero aleatoriamente y de manera dinámica cargando un MC que se llama "enemigo", q no es más q un triágnulo rojo que echa fuego, dándole nombre a cada instancia "enemigo"+i, i=0..9.

El código entero que tengo asociado a la nave protagonista es el siguiente:


Código:
onClipEvent(load){
//atributos objeto
	_velocidad = 0;
	_aceleracion = 0.5;
	_frenada = 1;
	_velocidadMax =  10;
	_decelaracion = 0;  // para cuando suelte acelerador

	//this.startDrag(true);
	Mouse.hide();
	dis = 0;
	acie = 0;
	i = 0;
	max_disparos = 25;  //número máximo de disparos en pantalla
	//pongo un número algo elevado para no sobrecargar teniendo
	//que borrar continuamente las instancias del disparo

}


onClipEvent(enterFrame){
	 if (Key.isDown(Key.RIGHT)) {
		this._x += 15;
	 } else if (Key.isDown(Key.LEFT)) {
		 this._x -= 15;
	 }
	 if (Key.isDown(Key.UP)) {
		this._y -= 15;
	 } else if (Key.isDown(Key.DOWN)) {
		 this._y += 15;
	 }
	 if (Key.isDown(Key.SPACE)){
		 this.attachMovie ("laser", "disp"+i, i, {_x:this._x, _y:this._y});

		 //eval("_root.disp"+i)._x = this._x;
		 //eval("_root.disp"+i)._y = this._y;	
		 i++;
		 //cuando se alcance el número máximo de disparos, procedemos a eliminarlos para liberar memoria
		 //para eliminarlos, utilizo removeMovieClip()
		 if (i>=max_disparos){
		 	i=0;
		 	for(var j=0;j<max_disparos;j++){
			 	nombre="disp"+j;
			 	_root.nombre.removeMovieClip();
			}
		 }
	  }

	 
	 //TEST DE COLISIONES DE LA NAVE CON LOS ENEMIGOS (máximo de 10 en pantalla)
	 //Solución adoptada: comprobación explícita con hitTest de la nave con cada uno de los enemigos
	 //El código con bucle for sería conveniente para utilizar una variable numMaxEnemigos
	 //que indique el número máximo de enemigos en pantalla. En el juego utilizo un máximo
	 //de 10 y así hago las comprobaciones explícitas para 10 enemigos. Esta solución hace el
	 //juego menos flexible pero no sobrecarga tanto como con el for y resulta más eficiente.
	 /* -- dejo el ejemplo del código con for
	 for(var j=0;j<numMaxEnemigos;j++){
		nombre="enemigo"+j;
		if (this.hitTest(_root.nombre)){
	 	this.gotoAndPlay(15); 
	 }
	 */
	 if (this.hitTest(_root.enemigo0)){
	 	this.gotoAndPlay(15);
	 }
	 if (this.hitTest(_root.enemigo1)){
		this.gotoAndPlay(15);
	 }
	 if (this.hitTest(_root.enemigo2)){
	 	this.gotoAndPlay(15);
	 }
	 if (this.hitTest(_root.enemigo3)){
	 	this.gotoAndPlay(15);
	 }
	 if (this.hitTest(_root.enemigo4)){
	 	this.gotoAndPlay(15);
	 }
	 if (this.hitTest(_root.enemigo5)){
	 	this.gotoAndPlay(15);
	 }
	 if (this.hitTest(_root.enemigo6)){
	 	this.gotoAndPlay(15);
	 }
	 if (this.hitTest(_root.enemigo7)){
	 	this.gotoAndPlay(15);
	 }
	 if (this.hitTest(_root.enemigo8)){
	 	this.gotoAndPlay(15);
	 }
	 if (this.hitTest(_root.enemigo9)){
	 	this.gotoAndPlay(15);
	 }
}
Y el código que tengo en el frame 1 de la capa "acciones" es el siguiente

Código:
numenemigos = 5;
//Definimos variables alto y ancho de escena
anchopantalla = 400;
altopantalla = 300;

//Añadimos dinámicamente los enemigos a escena
for (var i = 0; i<numenemigos; ++i) {
	var nombre = "enemigo"+i;
	_root.attachMovie("enemigo", nombre, i);
	_root[nombre]._x = random(anchopantalla);
	_root[nombre]._y = random(altopantalla);
}
Ah! y una última duda. El láser es una animación de unos 50 frames donde el láser se desplaza por la pantalla. Esto es la manera correcta de hacerlo?? O lo correcto sería dibujar una simple línea verde que luego, mediante Action Script, se desplace a lo largo de su eje X?? (es q esto último no lo sé hacer por ser instanciados dinámicamente cada disparo).

Espero no haberme liado demasiado y explicarme lo mejor posible.
Un saludo y muchas gracias de antemano.
  #2 (permalink)  
Antiguo 23/08/2007, 07:38
Avatar de Mahalo  
Fecha de Ingreso: julio-2004
Ubicación: Mallorca (Illes Balears)
Mensajes: 1.121
Antigüedad: 20 años, 4 meses
Puntos: 12
Re: problemas con videojuego de navecitas

Primero, no me he repasado todo tu código (por cuestión de tiempo, no de pereza, ¿eh?), pero si el láser se mueve arriba y abajo con la nave es que es obvio que cargas la instancia de láser dentro del mc de la nave. Revisa en el punto del attach la ruta (tal vez _root.attachMovie...).

Y respecto al láser, yo lo haría con código. Es más, con la clase tween no te sería muy difícil.

Saludos!
  #3 (permalink)  
Antiguo 23/08/2007, 11:45
 
Fecha de Ingreso: noviembre-2004
Mensajes: 47
Antigüedad: 20 años
Puntos: 0
De acuerdo Re: problemas con videojuego de navecitas

Muchas gracias!! Ahora mismo me pongo con eso e investigaré sobre la clase tween pq ando un poco pez.
Dejaré respuesta aquí con lo que sea.
Gracias de nuevo.
Saludos.
  #4 (permalink)  
Antiguo 23/08/2007, 11:54
 
Fecha de Ingreso: noviembre-2004
Mensajes: 47
Antigüedad: 20 años
Puntos: 0
De acuerdo Re: problemas con videojuego de navecitas

Perfecto!! Tema del láser solucionado. Efectivamente, lo estaba instanciando en la nave y no el root. Muchísimas gracias.

Ahora tengo otro problema añadido. Resulta que cargo 5 instancias dinámicamente de las naves enemigas cuando carga el archivo. Pues al disparar(con la barra espaciadora), les dé o no, desaparecen. Estoy mirando y no encuentro el problema pero fijo q está asociado a la barra espaciadora. Sigo buscando.

Gracias otra vez. Estaba atascadísimo.
  #5 (permalink)  
Antiguo 23/08/2007, 12:09
 
Fecha de Ingreso: noviembre-2004
Mensajes: 47
Antigüedad: 20 años
Puntos: 0
Re: problemas con videojuego de navecitas

Problema de desaparición de naves también solucionado!! Resulta que el láser tenía un nivel de profundidad mayor que el de las naves. Así, a cada disparo (una nueva instancia) se iba ocultando una nave. Solución, el láser en nivel 0 y las naves las genero a partir del nivel 1
Me queda "lo gordo": cómo meter código ActionScript a las instancias q se van generando automáticamente. En mi caso, las naves y el láser.
Sigo investigando.

ERROR: Reedito este post pq lo de antes fue una chapucilla que se me ocurrió al momento. Resulta q genero todos los disparos en el mismo nivel, con lo q se comen unos a otros. Mi siguiente chapuza: crear las naves a partir de un nivel elevado (30 ó así).

Qué os parece la idea?? Alguna recomendación??

Última edición por kirof; 23/08/2007 a las 12:21 Razón: Rectificación
  #6 (permalink)  
Antiguo 24/08/2007, 00:58
Avatar de Mahalo  
Fecha de Ingreso: julio-2004
Ubicación: Mallorca (Illes Balears)
Mensajes: 1.121
Antigüedad: 20 años, 4 meses
Puntos: 12
Re: problemas con videojuego de navecitas

Pues lo de dedicar intervalos de niveles a diferentes grupos de instancias me parece correcto. Para ahorrar recursos, yo pondría un número máximo de disparos (10 ó 20 o así) y que no pueda volver a disparar hasta que no haya acabado el primero de estos disparos.
Así tienes los niveles 0 al 20 (ó 30 o lo que quieras para los disparos), y los niveles siguientes para naves enemigas.

Saludos!

PD: Cuando tengas publicado el juego, quiero echar una partida!
  #7 (permalink)  
Antiguo 24/08/2007, 05:56
 
Fecha de Ingreso: noviembre-2004
Mensajes: 47
Antigüedad: 20 años
Puntos: 0
Re: problemas con videojuego de navecitas

Muchas gracias una vez más!!
Puse un límite de 25 disparos (ni pa ti ni pa mí jajajajaja) para no sobrecargar demasiado haciendo borrados cada dos por tres.

Tengo que echarle un vistazo a la clase que me dijiste y a ver si encuentro la manera de meterle código actionscript a las naves generadas dinámicamente.

La manera más cutrilla que se me ocurrió ahora y que hace el juego poco actualizable/escalable, es meter el código directamente en el frame de acciones que tengo en el root. como no van a aparecer más de... pongamos 6 naves enemigas en pantalla, pues pongo explícitamente el código y listo. Lo q pasa es q me sale una burrada de combinaciones pq tengo q evaluar hitTest de cada nave con todos los láser (hablamos de 6x25). Pensé en hacer dos bucles for anidados para así evitar escribir tanto código, pero me da q va a ser muy muy ineficiente y sobrecargará una barbaridad. Y debe de haber otra solución...

Pensé en poner algo así:
Código:
onClipEvent(enterFrame){
	for(var i=0;i<numenemigos;i++){
		nombreEnemigo="enemigo"+i;
		for(var j=0;j<max_disparos;j++){
			nombreLaser="laser"+j;
			if (_root.nombreEnemigo.hitTest(_root.nombreLaser)){
			 	_root.enemigo.gotoAndPlay(15);
			}
		}
	 }
}
Sigo razonando.

Ah!! y por supuesto!! cuando acabe el juego, lo mando o lo cuelgo por alguna parte!! a ver qué sale!! jajajaja

saludos!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:05.