Code: Select all
/*****************************************************\
Auteur : Foury Jean-francois
Auteur de : Super Mario toy
Jour 10 collision entre 1 sprite et une map
\*****************************************************/
//La librairie principale OSLib
#include <oslib/oslib.h>
#include "collisions.h"
#include "sprite.h"
//les callbacks
PSP_MODULE_INFO("OSLib Sample", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
//definition des pointeurs vers notre map
OSL_MAP *Map01, *Map_collision;
OSL_IMAGE *Map01_tileset, *collision_tileset;
#define TILE_NOSOLID 0
#define TILE_SOLID 1
OSL_IMAGE *Joueur ;
//fonctions
void Touches();
void AnimMarche();
void Gestion_Map();
short GetTile(OSL_MAP *m,int col, int row);
int oslCollisionMap(OSL_MAP *m,OSL_IMAGE *sprite,int haut,int bas, int gauche, int droit);
/*
====================
colision
Verifie si il y a une colision entre 2 sprites
====================
*/
int main()
{
//Initialisation de la librairie
oslInit(0);
//Initialisation du mode graphique
oslInitGfx(OSL_PF_8888, 1);
//chargement de nos images (oui, le "loading" :p)
Map01_tileset = oslLoadImageFile("sprite_s.png", OSL_IN_RAM, OSL_PF_5551);
collision_tileset = oslLoadImageFile("collisions_s.png", OSL_IN_RAM, OSL_PF_5551);
Joueur= oslLoadImageFile("player.png", OSL_IN_RAM, OSL_PF_5551);
//place Le joueur vers le centre de l'écran et dans sa position de départ
Joueur->x = 240;
Joueur->y = 130;
Gestion_Map(); //Initialisation des map
//boucle principale
while (!osl_quit)
{
//Permet de dessiner
oslStartDrawing();
//check des touches
Touches();
//Affiche la map concerner, mais n'affiche pas la map des collision
oslDrawMapSimple(Map01);
//dessine nos sprite
oslDrawImage(Joueur);
//Fin du dessin
oslEndDrawing();
//Synchronise l'écran
oslSyncFrame();
}
//on quitte l'application
oslEndGfx();
oslQuit();
return 0;
}
/*
====================
Touches
Gestion des touches pour le jeux :)
====================
*/
void Touches()
{
//Lit les touches
oslReadKeys();
if (osl_keys->held.down)
{
if (!oslCollisionMap(Map_collision,Joueur,0,1,0,0))
{
//ok on bouge
Joueur->y += 2;
}
}
if (osl_keys->held.up)
{
if (!oslCollisionMap(Map_collision,Joueur,1,0,0,0))
{
Joueur->y -= 2;
}
}
if (osl_keys->held.left)
{
if (!oslCollisionMap(Map_collision,Joueur,0,0,1,0))
{
Joueur->x -= 2;
}
}
if (osl_keys->held.right)
{
if (!oslCollisionMap(Map_collision,Joueur,0,0,0,1))
{
Joueur->x += 2;
}
}
}
/*
====================
Gestion_Map()
Initialilsation des map
====================
*/
void Gestion_Map()
{
//configuration de la map
Map01= oslCreateMap(
Map01_tileset, //Tileset
(void *)sprite_map, //Map
16,16, //Taille des tiles
30,17, //Taille de la Map
OSL_MF_U16); //Format de la Map
//configuration de la map
Map_collision= oslCreateMap(
collision_tileset, //Tileset
(void *)collisions_map, //Map
16,16, //Taille des tiles
30,17, //Taille de la Map
OSL_MF_U16); //Format de la Map
}
/*
====================
GetTile
Retourne sur quel sprite le player et possitionner
====================
*/
short GetTile(OSL_MAP *m,int col, int row)
{
u16 *map = (u16*)m->map;
return map[row*m->mapSizeX + col];
}
/*
====================
oslCollisionMap
Gestion des collisions avec les map et les perso pour le RPG
====================
*/
int oslCollisionMap(OSL_MAP *m,OSL_IMAGE *Collision,int haut,int bas, int gauche, int droit)
{
int tile;
//Test de collition pour la partie Demander suivant la touche appuyer haut, bas, gauche, droit.
if (haut)
{
tile = GetTile(m,((m->scrollX + Collision->x +Collision->stretchX ))/ m->tileX, (m->scrollY + Collision->y - 2)/ m->tileY);
if (!tile)
{
tile = GetTile(m,((m->scrollX + Collision->x))/ m->tileX, (m->scrollY + Collision->y - 2)/ m->tileY); //essaye avec la moitier du personnage pour que la tete passe quoi qu'il arrive
}
}
if (bas)
{
tile = GetTile(m,((m->scrollX + Collision->x +Collision->stretchX ))/ m->tileX, (m->scrollY + Collision->y + Collision->stretchY + 2)/ m->tileY);
if (!tile)
{
tile = GetTile(m,((m->scrollX + Collision->x))/ m->tileX, (m->scrollY + Collision->y + Collision->stretchY + 2)/ m->tileY);
}
}
if (gauche)
{
tile = GetTile(m,((m->scrollX + Collision->x - 2))/ m->tileX, (m->scrollY + Collision->y + Collision->stretchY)/ m->tileY);
if (!tile)
{
tile = GetTile(m,((m->scrollX + Collision->x - 2))/ m->tileX, (m->scrollY + Collision->y)/ m->tileY);
}
}
if (droit)
{
tile = GetTile(m,((m->scrollX + Collision->x +Collision->stretchX + 2))/ m->tileX, (m->scrollY + Collision->y + Collision->stretchY)/ m->tileY);
if (!tile)
{
tile = GetTile(m,((m->scrollX + Collision->x +Collision->stretchX + 2))/ m->tileX, (m->scrollY + Collision->y)/ m->tileY);
}
}
switch(tile)
{
case TILE_NOSOLID:
// pas de collision sur le sprite retourne donc 0
return 0;
break;
case TILE_SOLID:
// impassable retourne simplement 1 car impossable
return 1;
break;
//On peut rajouter autant de case que besoin celon ce que on recherche.
}
return 0;
}
![Image](http://pjeffadsl.free.fr/docs2/output/tut2_screen3.png)
what i am haveing trouble figuring out is how he used this image to make the whole map? i dont get it, how you can use 1 image and make duplicates.
![Image](http://img206.imageshack.us/img206/5092/spritesyl1.png)
also what do this image have anything to do with collision? like how does this work.
![Image](http://img518.imageshack.us/img518/2122/collisionsskf7.png)
ya so im just wondering how he creates the whole map with those 2 sprites(like what part of the code and how) and what the second images has anything to do with collision.