Anuncios Google

[SOLUCIONADO] Detectar el sentido en que se mueve un Sprite

Hola, he comenzado hace poco a programar en DS usando las NFlib (aún estoy aprendiendo) y me encontré con un problema:

Tengo dos sprites cuadrados (uno fijo y el otro móvil) que colisionan entre sí, lo cual ya he logrado programar, pero ahora quiero detectar si el sprite móvil se está desplazando de izquierda a derecha o viceversa en el momento de la colisión, para luego llamar a una función u otra según sea el caso. También quiero agregar que el sprite móvil se mueve en todas las direcciones y que por lo general no choca con el fijo horizontalmente o verticalmente, a menudo lo hace en diagonal.

Espero su respuesta y disculpen si es tonta la pregunta, pero no pude dar con la respuesta por más vueltas que le di.


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de OdnetninI

Ver lo de izquierda o derecha

Ver lo de izquierda o derecha es muy simple, coje 2 variables, asignas una a la posicion x del sprite y otra que vas a ponerle la x al final de la función, luego solo debes comparar las dos: ejemplo en pseudocodigo

var1 = x;

si var 1 > var 2 

esta para la derecha

si var 1 < var 2

esta para la izquierda

var 2 = x

 

Ya lo demas desarrollaló a partir de eso


Be Libre my Friend.

Muchas gracias

Te agradezco mucho la respuesta, gracias a ti logré que funcionara pero me trajo errores en otra parte del código que no tiene ninguna relación (o eso creo), por eso quiero saber si lo escribí bien:

int main(){
//Aquí defino las variables
u8 bola_x; //Eje x del sprite móvil
u8 bola_y; //Eje y del sprite móvil
u8 bola_x2; //La variable que me dijiste que defina
u8 power_x = 100; //Ejes del
u8 power_y = 80; //sprite fijo
 
while(1){  //Bucle principal
 
//Aquí me trae problemas:
if(bola_x > 248){  //Si la bola llega al lado derecho de la pantalla, 
    puntos += 1;  //el jugador 1 recibe 1 punto
    }
 
if (bola_x < 0){  //Si la bola llega al lado izquierdo de la pantalla,
    puntos2 += 1;  //el jugador 2 recibe 1 punto
    }
 
//Este es el código que me dijiste (o lo que entendí):
if((bola_x < bola_x2) && (Colision)){  //Si el sprite se mueve a la izquierda y colisiona
    //realiza la función que va aquí
}
 
if((bola_x > bola_x2) && (Colision)){  //Si el sprite se mueve a la derecha y colisiona
    //realiza la función que va aquí
}
 
bola_x2 = bola_x;
 
} //Cierro el bucle while
 
return 0;
}  //Finalizo la función main()

En la parte en que digo que me da problemas, lo que ocurre es que solo funciona con el jugador 1, es decir que por más que el jugador 2 sea quien haga el punto, siempre se lo da al jugador 1. En cuanto al resto funciona bien.

Sé que es un poco largo pero traté de explicarlo todo bien, aún así hay muchas partes del código que no escribí, pero porque no lo creí necesario. Si no le encuentras ningún problema avisame, que de todas formas lo buscaré yo mismo.

Desde ya, muchas gracias.

Imagen de OdnetninI

Cambia //Aquí me trae

Cambia

//Aquí me trae problemas:
if(bola_x > 248){  //Si la bola llega al lado derecho de la pantalla, 
    puntos += 1;  //el jugador 1 recibe 1 punto
    }
 
if (bola_x < 0){  //Si la bola llega al lado izquierdo de la pantalla,
    puntos2 += 1;  //el jugador 2 recibe 1 punto
    }

por:

//Aquí me trae problemas:
if(bola_x >= 248){  //Si la bola llega al lado derecho de la pantalla, 
    puntos += 1;  //el jugador 1 recibe 1 punto
    }
 
if (bola_x <= 0){  //Si la bola llega al lado izquierdo de la pantalla,
    puntos2 += 1;  //el jugador 2 recibe 1 punto
    }

Y me cuentas

Be Libre my Friend.

Imagen de OdnetninI

Si me pasas el code un poco

Si me pasas el code un poco mas compelto, a lo mejor puedo echarte una mano, es que si me pones // funcion va aqui, pues no se que funcion es. Si ocupa mucho usa pastebin.com

 


Be Libre my Friend.

Código

Aquí hay un poco más del código:

int main(){
 
int saque = 0;
u8 bola_x;
u8 bola_x2;
u8 bola_y;
s8 bola_spx;
s8 bola_spy;
u8 power_x = 100;
u8 power_y = 80;
 
[...]
 
srand(time(NULL));
 
bola_x = 17;
bola_y = 92;
bola_x = (rand() % 223);
bola_y = (rand() % 159);
bola_spx = 2;
bola_spy = 2;
 
while(1) {
 
                bola_x += bola_spx;
		bola_y += bola_spy;
 
		if ((bola_y < 0) || (bola_y > 183)) bola_spy *= -1;
 
		if ((bola_x > 231 && bola_y > y1 && bola_y < (y1 + 32))) bola_spx *= -1;
 
		if ((bola_x < 17 && bola_y + 8 > y && bola_y < (y + 32))) bola_spx *= -1;
 
		if (bola_x >= 248){
		    puntos += 1;
			saque = 0;
		}
 
		if (bola_x <= 0){
		    puntos2 += 1;
			saque = 1;
		}
 
		if((saque == 0) && keysHeld() & KEY_L){		
 
			saque = 2;
 
		}
 
		if((saque == 1) && keysHeld() & KEY_R){
 
			saque = 2;
 
		}
 
		switch(saque){
 
			case 0:
			    bola_x = 17;
			    bola_y = y + 12;
				NF_MoveSprite(1, 2, bola_x, bola_y);
				break;
			case 1:
				bola_x = 231;
			    bola_y = y1 + 12;
				NF_MoveSprite(1, 2, bola_x, bola_y);
				break;
			case 2:
				NF_MoveSprite(1, 2, bola_x, bola_y);
				break;
 
		}
 
                if((bola_x < bola_x2) && (Colision(bola_x, bola_y, power_x, power_y, 8, 8, 8, 8))){
		    NF_ShowSprite(1, 0, false);
		}
 
		if((bola_x > bola_x2) && (Colision(bola_x, bola_y, power_x, power_y, 8, 8, 8, 8))){
		    NF_ShowSprite(1, 1, false);
		}
 
}  //Aquí termina el while
 
return 0;
 
}  //Aquí termina la función

Voy a aclarar que mi homebrew es un juego de ping pong al estilo antiguo (con la pelota y las paletas rectangulares) por si sirve de algo.

Tus soluciones anteriores no me funcionaron, pero igualmente muchas gracias. Avisa si hay algo que no entiendes.

PD: Ignoren las partes del código que son innecesarias, aún tengo que limpiarlo.

PD2: Colision() es una función que yo cree para detectar más facilmente las colisiones.

Imagen de OdnetninI

prueba a cambiar las

prueba a cambiar las variables u8 a s16, no se me ocurre nada más

Solución

Te lo agradezco mucho, realmente ha funcionado, me has ayudado mucho y solucionaste mis dos problemas, por eso te digo nuevamente muchas gracias.

Imagen de magicblack2009

Puede que eso sea cosa de las

Puede que eso sea cosa de las variables. Prueba a cambiar los u8 por u16 o u32 a ver si así consigues solucionarlo ;D.

Salu2!

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.