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.
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 } } }
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)
Imagen del Ejemplo de Sprites (Sólo Usuarios Registrados) (Renombrar a "Jugador", sin comillas).
Comentarios
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).
has probado con
oslCls();
A mi si me la limpia.
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
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.
Con esos 3 codigos podras usar las palabras Boolean, true o false como si C tuviese booleanos.
hombre..
Ok, lo de arriba ya me lo dijo xerpi, pero para 2J me vale,
y lo de bolean, pues...
Aunque aqui no resalta la sintaxis, en un editor profesional si.
Si que bueno que lo pusieron
Si que bueno que lo pusieron en la portada!! buen aporte 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.