pjeff
23/01/2008, 11h08
Les collisions entre 2 sprites basés sur le Jour 6
par PJEFF
Bonjour. Bienvenue dans la suite des tutoriels consacrés au développement sur PSP.
Pour des raisons évidentes j’ai repris les tutoriels déjà existants pour les adapter à ce qui suivra.
Je ne vais commenter que le code ajouté, pour le reste référez-vous aux anciens tutoriels.
1) Notre nouveau sprite pour la collision
Et bien oui, il nous faut forcément un 2eme sprite. :lol:
http://pjeffadsl.free.fr/docs2/output/Sprite1.png
........
//definition des pointeurs vers nos images
OSL_IMAGE *chrono;
////////////////////////////////////////////////////////////////////
//definition des pointeurs vers notre nouvelle images utiliser pour la collision
OSL_IMAGE *sprite1;
///////////////////////////////////////////////////////////////////
//defines
#define BAS 0
.......
puis dans le main
....
//chargement de nos images (oui, le "loading" :p)
chrono = oslLoadImageFile("chrono_sheet.png", OSL_IN_RAM, OSL_PF_5551);
/////////////////////////////////////////////////
sprite1 = oslLoadImageFile("Sprite1.png", OSL_IN_RAM, OSL_PF_5551);
//on place le sprite un peu au hasard
sprite1->x = 180;
sprite1->y = 90;
////////////////////////////////////////////
//vérification
if (!chrono)......
........
2) Déclaration des collisions
On va faire un système de collision assez simple sans se prendre la tête.
déclaration
.....................
//fonctions
void Touches();
void AnimMarche();
int colision(OSL_IMAGE *img1,float img1posX, float img1posY, OSL_IMAGE *img2, float img2posX, float img2posY );
...................
La fonction en elle-même nous retourne 1 s'il y a une collision.
Pour les explications, c'est très simple : on indique 2 sprites avec leur position et on teste sur tout les côtés s'il y a 1 pixel qui touche le 2ème sprite.
Pas compliqué?
ATTENTION : Cette fonction doit être adaptée selon le style de jeu, comme pour un Mario ou autre par exemple (tuto qui viendra bientôt) ou même pour un RPG qui ne teste qu'une partie du personnage car là, le sprite et totalement infranchissable !!
.....................
/*
====================
collision
Vérifier s'il y a une collision entre 2 sprites
====================
*/
int collision(OSL_IMAGE *img1,float img1posX, float img1posY, OSL_IMAGE *img2, float img2posX, float img2posY ) {
int collision;
collision = 0;
float img1width = img1->stretchX;
float img1height = img1->stretchY;
float img2width = img2->stretchX;
float img2height = img2->stretchY;
if ((img1posX + img1width > img2posX) &&
(img1posX < img2posX + img2width) &&
(img1posY + img1height > img2posY) &&
(img1posY < img2posY + img2height) ) {
collision = 1;
}
return collision;
}
...................
3) Utilisation des collisions
On va tester si le joueur touche le 2ème sprite, on va laisser la position actuelle au joueur, on teste avec 2 pixels en plus, si pas de collision : on avance...
On va l'inclure dans la fonction touche.
void Touches()
{
//Lit les touches
oslReadKeys();
if (osl_keys->held.down)
{
if (!collision(chrono,chrono->x, chrono->y + 2, sprite1, sprite1->x, sprite1->y ))// test collision + 2 pixel
{
//ok on bouge
chrono->y += 2;
chrono_position = BAS;
AnimMarche();
}
}
if (osl_keys->held.up)
{
if (!collision(chrono,chrono->x, chrono->y - 2, sprite1, sprite1->x, sprite1->y ))// test collision - 2 pixel
{//ok on bouge
chrono->y -= 2;
chrono_position = HAUT;
AnimMarche();
}
}
if (osl_keys->held.left)
{
if (!collision(chrono,chrono->x - 2, chrono->y, sprite1, sprite1->x, sprite1->y ))// test collision - 2 pixel
{//ok on bouge
chrono->x -= 2;
chrono_position = GAUCHE;
AnimMarche();
}
}
if (osl_keys->held.right)
{
if (!collision(chrono,chrono->x + 2, chrono->y, sprite1, sprite1->x, sprite1->y )) // test collision + 2 pixel
{//ok on bouge
chrono->x += 2;
chrono_position = DROITE;
AnimMarche();
}
}
//si aucune touche n'est appuyée
if (!osl_keys->held.value)
{
//reinitialisation des variables, pour la prochaine fois
anim_marche = 0;
temp_anim_marche = 0;
//affiche chrono dans sa dernière position
oslSetImageTileSize(chrono,0,chrono_position,22,35 );
}
}
Maintenant on peut tester! :)
Bon, ce tuto est bref mais efficace. Dans les prochains cours, on fera d'autres types de collision et on fera également les cours pour les collisions avec une map en utilisant GBAGraphics.
Vous allez voir, rien de plus simple, il suffisait seulement d'y penser.
Ca doit donc donner ça visuellement :
http://pjeffadsl.free.fr/docs2/output/screen.png
Voici le code source pour PSP, pour Windows et les binaires pour Windows
Tutorial1collision.rar (http://pjeffadsl.free.fr/docs2/output/Tutorial1collision.rar)
par PJEFF
Bonjour. Bienvenue dans la suite des tutoriels consacrés au développement sur PSP.
Pour des raisons évidentes j’ai repris les tutoriels déjà existants pour les adapter à ce qui suivra.
Je ne vais commenter que le code ajouté, pour le reste référez-vous aux anciens tutoriels.
1) Notre nouveau sprite pour la collision
Et bien oui, il nous faut forcément un 2eme sprite. :lol:
http://pjeffadsl.free.fr/docs2/output/Sprite1.png
........
//definition des pointeurs vers nos images
OSL_IMAGE *chrono;
////////////////////////////////////////////////////////////////////
//definition des pointeurs vers notre nouvelle images utiliser pour la collision
OSL_IMAGE *sprite1;
///////////////////////////////////////////////////////////////////
//defines
#define BAS 0
.......
puis dans le main
....
//chargement de nos images (oui, le "loading" :p)
chrono = oslLoadImageFile("chrono_sheet.png", OSL_IN_RAM, OSL_PF_5551);
/////////////////////////////////////////////////
sprite1 = oslLoadImageFile("Sprite1.png", OSL_IN_RAM, OSL_PF_5551);
//on place le sprite un peu au hasard
sprite1->x = 180;
sprite1->y = 90;
////////////////////////////////////////////
//vérification
if (!chrono)......
........
2) Déclaration des collisions
On va faire un système de collision assez simple sans se prendre la tête.
déclaration
.....................
//fonctions
void Touches();
void AnimMarche();
int colision(OSL_IMAGE *img1,float img1posX, float img1posY, OSL_IMAGE *img2, float img2posX, float img2posY );
...................
La fonction en elle-même nous retourne 1 s'il y a une collision.
Pour les explications, c'est très simple : on indique 2 sprites avec leur position et on teste sur tout les côtés s'il y a 1 pixel qui touche le 2ème sprite.
Pas compliqué?
ATTENTION : Cette fonction doit être adaptée selon le style de jeu, comme pour un Mario ou autre par exemple (tuto qui viendra bientôt) ou même pour un RPG qui ne teste qu'une partie du personnage car là, le sprite et totalement infranchissable !!
.....................
/*
====================
collision
Vérifier s'il y a une collision entre 2 sprites
====================
*/
int collision(OSL_IMAGE *img1,float img1posX, float img1posY, OSL_IMAGE *img2, float img2posX, float img2posY ) {
int collision;
collision = 0;
float img1width = img1->stretchX;
float img1height = img1->stretchY;
float img2width = img2->stretchX;
float img2height = img2->stretchY;
if ((img1posX + img1width > img2posX) &&
(img1posX < img2posX + img2width) &&
(img1posY + img1height > img2posY) &&
(img1posY < img2posY + img2height) ) {
collision = 1;
}
return collision;
}
...................
3) Utilisation des collisions
On va tester si le joueur touche le 2ème sprite, on va laisser la position actuelle au joueur, on teste avec 2 pixels en plus, si pas de collision : on avance...
On va l'inclure dans la fonction touche.
void Touches()
{
//Lit les touches
oslReadKeys();
if (osl_keys->held.down)
{
if (!collision(chrono,chrono->x, chrono->y + 2, sprite1, sprite1->x, sprite1->y ))// test collision + 2 pixel
{
//ok on bouge
chrono->y += 2;
chrono_position = BAS;
AnimMarche();
}
}
if (osl_keys->held.up)
{
if (!collision(chrono,chrono->x, chrono->y - 2, sprite1, sprite1->x, sprite1->y ))// test collision - 2 pixel
{//ok on bouge
chrono->y -= 2;
chrono_position = HAUT;
AnimMarche();
}
}
if (osl_keys->held.left)
{
if (!collision(chrono,chrono->x - 2, chrono->y, sprite1, sprite1->x, sprite1->y ))// test collision - 2 pixel
{//ok on bouge
chrono->x -= 2;
chrono_position = GAUCHE;
AnimMarche();
}
}
if (osl_keys->held.right)
{
if (!collision(chrono,chrono->x + 2, chrono->y, sprite1, sprite1->x, sprite1->y )) // test collision + 2 pixel
{//ok on bouge
chrono->x += 2;
chrono_position = DROITE;
AnimMarche();
}
}
//si aucune touche n'est appuyée
if (!osl_keys->held.value)
{
//reinitialisation des variables, pour la prochaine fois
anim_marche = 0;
temp_anim_marche = 0;
//affiche chrono dans sa dernière position
oslSetImageTileSize(chrono,0,chrono_position,22,35 );
}
}
Maintenant on peut tester! :)
Bon, ce tuto est bref mais efficace. Dans les prochains cours, on fera d'autres types de collision et on fera également les cours pour les collisions avec une map en utilisant GBAGraphics.
Vous allez voir, rien de plus simple, il suffisait seulement d'y penser.
Ca doit donc donner ça visuellement :
http://pjeffadsl.free.fr/docs2/output/screen.png
Voici le code source pour PSP, pour Windows et les binaires pour Windows
Tutorial1collision.rar (http://pjeffadsl.free.fr/docs2/output/Tutorial1collision.rar)