Anuncios Google

OSLib - Colisiones y Sprites

Tutoriales Avanzados Homebrewes

Continuando la entrega de fuentes, hoy os vamos a enseñar a manejar sprites y colisiones. Las colisiones son realmente sencillas, son muy parecidas a las del intérprete Lua, por eso los que vengáis de ese lenguaje la entendereis rápidamente y sin problemas. También os dejo otro tutorial de sprites en el mismo para ahorrar tutoriales. Os dejo el sprite para la lección de los sprites en la sección "Descargas". ¡Allá vamos!

Autor: Dioni0396.

Colisiones:

Os voy a dejar la funcion de colision normal para que la leais y la entendais, la colision solo se porduce cuando un objeto choca contra el otro ya sea por debajo por arriba o por donde sea.

int colision(obj1, obj2){ //esta función, verifica si hay colisión o no entre dos objetos, notar que, DENTRO de la función se usan los parámetros que recibe, más adelante, veremos como se usa
	if ((obj1.x+obj1.w>obj2.x) //borde derecho obj1 > borde izquierdo obj2
	&& (obj1.x<obj2.x+obj2.w) //borde izquierdo obj1 < borde derecho obj2
	&& (obj1.y+obj1.h>obj2.y) //borde inferior obj1 > borde superior obj2
	&& (obj1.y<obj2.y+obj2.h)){ //borde superior obj1 < borde inferior obj2
		return lo que querais
	}
	else{
		return lo que querais
	}
} //By Chimecho transformado por Dioni0396

Y direis: "¿pero cómo uso esto?"...

Pues os doy un ejemplo practico para que aprendáis:

struct{
	int x;
	int y;
	int w;
	int h;
} J1;
struct{
	int x;
	int y;
	int w;
	int h;
} J2;
void Declarar_Estructuras(){
	J1.x = 50;
	J1.y = 10;
	J1.w = 100;
	J1.h = 10;
	J2.x = 200;
	J2.y = 100;
	J2.w = 100;
	J2.h = 10;
}
int colision(obj1, obj2){ //esta función, verifica si hay colisión o no entre dos objetos, notar que, DENTRO de la función se usan los parámetros que recibe, más adelante, veremos como se usa
	if ((obj1.x+obj1.w>obj2.x) //borde derecho obj1 > borde izquierdo obj2
	&& (obj1.x<obj2.x+obj2.w) //borde izquierdo obj1 < borde derecho obj2
	&& (obj1.y+obj1.h>obj2.y) //borde inferior obj1 > borde superior obj2
	&& (obj1.y<obj2.y+obj2.h)){ //borde superior obj1 < borde inferior obj2
		return lo que querais
	}
	else{
		return lo que querais
	}
} //By Chimecho transformado por Dioni0396
 
int main(){
	//Me salto las funcion principales
	while(!osl_quit){
		//code
		//code
		if (colision(J1,J2) == /*Lo que habia en el return*/){
			//Code
		}
	}
}

Sprites:

Ahora os hacemos una entrega de sprites, por desgracia mía, solo lo he podido hacer funcionar mediante un sample de otra página web.

#include <oslib/oslib.h>
 
PSP_MODULE_INFO("OSLib Sample", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
 
 
OSL_IMAGE *Jugador;
 
//Unas definiciones
#define Abajo    0
#define Arriba   35
#define Derecha 70
#define Izquierda 105
 
//variables
int Jugador_Posicion;
int Anim;
int temp_anim;
 
//Funciones.
void Controles_Sprite();
void Anim_Marcha();
 
int main()
{
	oslInit(0);
 
	oslInitGfx(OSL_PF_8888, 1);
 
	//Nueva funcion, en esta funcion decimos que color de la imagen no queremos que se vea
	oslSetTransparentColor(RGB(255,0,0));
 
	//Carga de imagen
	Jugador = oslLoadImageFile("Jugador.png", OSL_IN_RAM, OSL_PF_5551);
 
	//Quitamos ese color de la imagen
	oslDisableTransparentColor();
 
	if (!Jugador) oslDebug("Comprueba el sprite");
 
	//Aunque no lo haya explicado, al cargar una imagen se carga invisiblemente su x y su y, aqui decimos donde queremos la x y la y
	Jugador->x = 240;
	Jugador->y = 130;
        //Esta es la que hemos creado arriba
	Jugador_Posicion = Abajo;
 
	while (!osl_quit)
	{
 
		oslStartDrawing();		
 
 
		Controles_Sprite();
 
		//Dibujamos el sprite, en este comando no es necesario la x ni la y, ya las lleva por si solas al cargarlo
		oslDrawImage(Jugador);
 
 
		oslEndDrawing();
 
 
		oslSyncFrame();		
	}
 
 
	oslEndGfx();
	oslQuit();
	return 0;
}
 
 
void Controles_Sprite()
{
 
	oslReadKeys();
 
	if (osl_keys->held.down)
	{
		//Movemos el sprite
		Jugador->y += 2;
 
		//Decimos la posicion
		Jugador_Posicion = Abajo;
 
		//Cargamos una funcion
		Anim_Marcha();
	}
	if (osl_keys->held.up)
	{
		//Movemos el sprite
		Jugador->y -= 2;
 
		//Decimos la posicion
		Jugador_Posicion = Arriba;
 
		//Cargamos una funcion
		Anim_Marcha();	}
	if (osl_keys->held.left)
	{
		//Movemos el sprite
		Jugador->x -= 2;
 
		//Decimos la posicion
		Jugador_Posicion = Izquierda;
 
		//Cargamos una funcion
		Anim_Marcha();
	}
	if (osl_keys->held.right)
	{
		//Movemos el sprite
		Jugador->x += 2;
 
		//Decimos la posicion
		Jugador_Posicion = Derecha;
 
		//Cargamos una funcion
		Anim_Marcha();
	}
 
	//Si no presionamos ninguna tecla
	if (!osl_keys->held.value)
	{
		//Reinciamos las variables
		Anim = 0; 
		temp_anim = 0;
 
		//Mas adelante lo explico
		oslSetImageTileSize(Jugador,0,Jugador_Posicion,22,35);
	}
}
 
 
void Anim_Marcha()
{
	temp_anim++;
	if (temp_anim == 6)
	{
 
		Anim++;
 
		//Mas adelante lo explico
		oslSetImageTileSize(Jugador,(Anim * 22),Jugador_Posicion,22,35);
 
		//Reinciamos
		if (Anim== 6) Anim = 0;
		temp_anim = 0;
	}
}

oslSetImageTileSize(Jugador,(Anim * 22),Jugador_Posicion,22,35); Esto selecciona mediante tiles la parte de la imagen que queremos que se muestre, el primer argumento recibe la imagen, el segundo la posicion x0, el tercero la y0, el cuarto la x1 y el quinto la y1, resumiendo la funcion original seria asi:

oslSetImageTileSize(img, x0, y0, x1, y1)

Descargas:

Imagen del Ejemplo de Sprites (Sólo Usuarios Registrados) (Renombrar a "Jugador", sin comillas).

3.97436
Tu voto: Ninguno Votos totales: 4 (39 votos)

Anuncios Google

Comentarios

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 NEKERAFA

Mmm...

He corregido alginas cosillas, aparte de añadirle un límite, y resulta que tengo un problema, y esque no limpia la pantalla cada vez que se mueve el personaje. ¿Como haría esto?

También, por si os sirve, he confeccionado el sprite de link de los tutoriales de chimecho por si lo quereis utilizar aquí, es este: http://ubuntuone.com/2x0H96EFxCLcaIYEXBOPBi

Solo teneis que cambiar el color rojo a rosa (255, 0, 255)


NekeOS, el nuevo shell para PSP

PS4 500GB OFW, PS3 320GB OFW, PS3 500GB OFW, PSP 6.39 PRO-C Fix4.

Sony Xperia Z1 Compact con Android 5.1.1

Portatil Lenovo z50-70 Intel® Core™ i7-4510U y NVIDIA GeForce 840M con Elementary OS 0.3.2 Freya (64 bits) y Windows 10 (64 bits).

Imagen de Dioni0396

has probado con

oslCls();

A mi si me la limpia.

Imagen de NEKERAFA

XD

Estaba ahora mirando tu tuto de botones y lo vi XD

Funciona

Variables

Para no tener que declarar las variables J1 y J2 como tu lo haces, duplicando codigo, puedes definirte en C un tipo tuyo. Por ejemplo puedes usar este codigo

typedef struct TipoObjeto{
	int x;
	int y;
	int w;
	int h;
} TipoObjeto;
 
TipoObjeto J1;
TipoObjeto J2;

Esto tendria el mismo efecto que lo que tu escribes. Tambien vale para definir otros tipos, alla tu imaginacion y declarar mas variables de ese tipo se hace mucho mas facil. Solo es un consejo, no es ninguna sugerencia ni imposicion.

Tambien como te habras fijado, C no tiene el tipo Boolean, pero se puede hacer un truquillo para mejorar la legibilidad del programa, usando macros.

#define Boolean int
#define true 1
#define false 0

Con esos 3 codigos podras usar las palabras Boolean, true o false como si C tuviese booleanos.

Imagen de Dioni0396

hombre..

Ok, lo de arriba ya me lo dijo xerpi, pero para 2J me vale,

y lo de bolean, pues...

Variable1 = TRUE;
Variable2 = FALSE;
Variable3 = NULL;

Aunque aqui no resalta la sintaxis, en un editor profesional si.

Imagen de Ricx-Dark

Si que bueno que lo pusieron

Si que bueno que lo pusieron en la portada!!   buen aporte Dioni0396

Imagen de Dioni0396

Gracias al admin que lo ha subido

pero falta un minusculo detalle, tiene que estar despues de OSLib - Sonidos, es para mantener el orden.

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.