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;
}

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.

also what do this image have anything to do with collision? like how does this work.

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.
