Anuncios Google

Colision de dos Sprites

Creo que no lo estoi dejando claro, lo de la colision de sprites no me refiero a que cuando yo coja un sprite y lo mueva hacia otro se reste vida. Lo que me refiero es que, en el juego de kenny, en una lucha final, tengo 3 sprites: Kenny, el sprite del enemigo (osea, el que si colisionas con el se le resta una vida) y el sprite de unas llamas (que si colisionas con el se te resta una vida a ti).

He colocado el sprite del enemigo encima del sprite del fuego, por lo que parece que esta lanzando llamas, y una vez puesto le he añadido movimiento infinito hacia la derecha. Ahora, lo que quiero es que cuando kenny toque el sprite del enemigo se le reste una vida al enemigo, y cuando  el sprite del fuego toque a kenny se le reste una vida a kenny. El sprite de kenny es de 32x32, el del enemigo es de 64x64 y el de las llamas tambien es de 64x64

Aqui pongo las variables que he creado para las vidas de ambos:

u32 vidakenny=3;
u32 vidasatan=5;

 


Desarrollando Super Mario Galaxy DS

http://SceneGames.byethost10.com <--MI WEB OFICIAL


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 Froskito

Toma de todas formas el codigo:

(No esta entero, solo es la parte de la colision)

//AQUI EMPIEZA LA ROOM 5 ---------------------LUCHA FINAL 1--------------------------
 
int Room_5 (void) {
// Main function
 
	// PAlib init
	PA_Init();
	PA_InitVBL();
	PA_InitText(1, 2);
	PA_InitText(1, 0);
s32 speed1 = 256;  
s32 speed2 = 256;  
 
	PA_LoadSpritePal(0, 0, (void*)kenny_Pal);	// Palette....
                  PA_LoadSpritePal(0, 1, (void*)satan_Pal);	// Palette....
                  PA_LoadSpritePal(0, 2, (void*)llamas_Pal);	// Palette....
 
 
 
	PA_EasyBgLoad(0, 1, Luchafinal1); // platfroms...
	PA_EasyBgLoad(0, 2, hills3); // hills
 
 
 
	PA_EasyBgLoad(1, 3, bg01); 
 
 
 
 
 
 
 
	PA_InitParallaxX(0, 0, 256, 128, 64);
 
	kenny.x = 0<<8; kenny.y = (128-32)<<8; // bottom of the screen... fixed point
	kenny.vy = 0; // not jumping
	kenny.flip = 0;
	kenny.scrollx = 0;
 
	PA_CreateSprite(0, 0,(void*)kenny_Sprite, OBJ_SIZE_32X32,1, 0, kenny.x>>8, kenny.y>>8); // Sprite
 
           s32 x1 = 1; s32 y1 = 0; // Sprite's center position
	s8 w1 = 32; s8 h1 = 32; // width and height...
	// all sprites stick to the left
	s32 spritex1 = 0; s32 spritex2 = 0;		
 
 
PA_CreateSprite(0, // pantalla
1, /* numero de sprite ( de 0 a 127 sprites que soporta ) el 0 estaria al frente de todos,
el 1, encima de todos menos del 0, etc... */
(void*)satan_Sprite, // nombre del sprite
OBJ_SIZE_64X64, // tamaño
1, // modo (1= 256 colores)
1, // numero de paleta
80, 37); // posicion X, Y
 
s32 x2 = 80; s32 y2 = 37; // Sprite's center position
s8 w2 = 64;  s8 h2 = 64; // width and height...
 
PA_CreateSprite(0, // pantalla
2, /* numero de sprite ( de 0 a 127 sprites que soporta ) el 0 estaria al frente de todos,
el 1, encima de todos menos del 0, etc... */
(void*)llamas_Sprite, // nombre del sprite
OBJ_SIZE_64X64, // tamaño
1, // modo (1= 256 colores)
2, // numero de paleta
80, 101); // posicion X, Y
 
 
 
	while(1)
	{
		// Move all the sprites by their corresponding speed
		spritex1 += speed1; spritex2 += speed2; 
 
		// Positionne all the sprites, >>8 to return to normal position
		PA_SetSpriteX(0, 1, spritex1>>8);
                                    PA_SetSpriteX(0, 2, spritex2>>8);
 
                                    if ((x2 >= x1 - (w1 + w2)/2) && (x2 <= x1 + (w1 + w2)/2) && (y2 >= y1 - (h1 + h2)/2) && (y2 <= y1 + (h1 + h2)/2)) vidasatan--;
		else PA_OutputText(1, 2, 17, "            ");


Desarrollando Super Mario Galaxy DS

http://SceneGames.byethost10.com <--MI WEB OFICIAL

Imagen de DRmack

Creo..

Que en este codigo no esta el error seguramente este en el de la vida.

Imagen de Froskito

como qe en la vida?

??

Imagen de DRmack

El codigo

Me refiero al codigo que tienes para la vida.
Que si no recuerdo mal lo dijiste en el tema del foro.

Imagen de Froskito

creo que es este al que te refieres:

 

u32 vidakenny=5;
u32 vidasatan=10;

 

Imagen de DRmack

El codigo

O no tienes un codigo de la vida(con sprites y todo eso).¿Solamente tienes esas dos variables y ya esta?

Imagen de Froskito

Si

La verdad esqe si xD

Imagen de Froskito

Creo que no me e explicado bien

ahi esta el tema modificado aber si me explico.

PD: El movimiento de un sprite infinito ya lo he hecho.

Saludos

Imagen de DRmack

Froskito

Lo que tienes que hacer ahora es configurar el codigo que te he puesto hacia tus sprites(la altura y la anchura) y ya esta.Si tienes alguna duda del codigo comentala.


Imagen de Froskito

Mira lo que he puesto:

Esto es lo que me da problemas, (no al compilar, sino que no resta vida);

		if ((x2 >= x1 - (w1 + w2)/2) && (x2 <= x1 + (w1 + w2)/2) && (y2 >= y1 - (h1 + h2)/2) && (y2 <= y1 + (h1 + h2)/2)) vidasatan--;
		else PA_OutputText(1, 2, 17, "            ");


Desarrollando Super Mario Galaxy DS

http://SceneGames.byethost10.com <--MI WEB OFICIAL

Imagen de DRmack

A mi me funciona

Acabo de probarlo y a mi me funciona pon el codigo entero
para hallar el error mas facilmente.

Imagen de Froskito

Te resta la vida poniendo lo que yo he puesto?

Te resta la vida poniendo lo que yo he puesto? Porqe a mi no..., solo necesito lo de la colision, un nivel mas, y saco la V2

Imagen de DRmack

   

 

 

Imagen de Froskito

DRmack...

no as puesto nada en el comentario...

Imagen de DRmack

Seria algo asi. //

Seria algo asi.

// Includes
#include <PA9.h>
 
// PAGfx
#include "gfx/all_gfx.c"
#include "gfx/all_gfx.h"
 
int main(void){
 
	PA_Init();
	PA_InitVBL();
 
	PA_InitText(1,0); // Iniciamos texto
 
	PA_LoadSpritePal(0, 0, (void*)sprite0_Pal);
 
	// Cargamos el sprite 
	PA_CreateSprite(0, 0,(void*)tusprite, ...);	
	s32 x1 = 16; s32 y1 = 8; 
	s8 w1 = 32; s8 h1 = 16; 
 
	//Otro sprite
	PA_CreateSprite(0, 1,(void*)tusprite, ...); 
	s32 x2 = 128; s32 y2 = 96; 
	s8 w2 = 16;  s8 h2 = 32; 	
 
	while(1)
	{
		if (PA_MoveSprite(0)){
			x1 = PA_MovedSprite.X;
			y1 = PA_MovedSprite.Y;
		}
 
		// Si hay colision aparece el texto
		if (x2 >= x1 - (w1 + w2)/2) && (x2 <= x1 + (w1 + w2)/2) && (y2 >= y1 - (h1 + h2)/2) && (y2 <= y1 + (h1 + h2)/2)) PA_OutputText(1, 2, 10, "Collision !!");
		else PA_OutputText(1, 2, 10, "            ");
 
		PA_WaitForVBL();
	}
	return 0;
}

Ahora tienes que configurar esto a tu gusto pero la colision ya la tienes.


Imagen de Froskito

Me da error ese codigo:

Idintifier before "<" token

Statement before ">" token

va froskito que te lo estan

va froskito que te lo estan dando hecho ya XD

 

se le ha pasado abrir un parentesis en el if

if  (    (x2 >= x1 - (w1 + w2)/2) && (x2 <= x1 + (w1 + w2)/2) && (y2 >= y1 - (h1 + h2)/2) && (y2 <= y1 + (h1 + h2)/2)) PA_OutputText(1, 2, 10, "Collision !!");

lee los errores, ahi te pone, hay un error antes de "<" ...en que linea aparece algun "<"...en la del if

y ahi ves que falta abrir un parentesis.

Imagen de Froskito

xD

lo siento pero pa estas cosas soi mu cabezon xD

Imagen de Froskito

El sprite

El sprite es de 64x64.

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.