Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/08/2007, 06:03
kirof
 
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.