PDA

Voir la version complète : [PSP][Tutorial] Jour 9 Non Officiel


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)

Dr.Vince
23/01/2008, 14h03
très bonne initiative, félicitations

mais, il y a beaucoup de fautes dans ce que tu écris donc ce serait bien de les corriger soit par un outils, soit toi-même, ou bien de demander à quelqu'un (du forum par exemple )

sinon bravo encore pour l'initiative

pjeff
23/01/2008, 14h57
très bonne initiative, félicitations

mais, il y a beaucoup de fautes dans ce que tu écris donc ce serait bien de les corriger soit par un outils, soit toi-même, ou bien de demander à quelqu'un (du forum par exemple )

sinon bravo encore pour l'initiative




Merci je vient de corriger quelque faute avec mon copain word.
Comme vous le remarquer je suis mauvait en orthographe :)

Bobby Sixkilla
23/01/2008, 15h34
J'ai corrigé une partie des fautes et refait un peu la mise en page. ^^

Merci pour ce tuto. :)

Yodajr
23/01/2008, 16h04
Bonne idée, ces 2 tutos sont descendus bien bas dans ma *longue* liste des trucs à faire, merci pour les autres :)
(en plus quand je ferais les miens, j'aurais un truc à copier :p)

J'ai corrigé également quelques fautes ;)

pjeff
23/01/2008, 19h06
Une chose qui et tres bien c'est pour la correction des fautes vous avez raison,
j'ai fait ces tuto car je sais combien c'est difficile avec les collition quand on n'y connais rien.

le reste vas suivre bientot

Bap65
24/01/2008, 01h28
Waho, j'utilisais le même genre de code pour faire mes collisions dans un de mes jeux ! :D J'ai toujours cru que je faisais un truc à l'arrache et qu'il y avait moyen de mieux faire ! Je me sens flatté du coup :p

Merci pour le tuto, sinon il n'existe pas de fonction pour gérer directement les collisions ?

Superbes initiatives, félicitations ;)

Nesgba
24/01/2008, 07h38
Waho, j'utilisais le même genre de code pour faire mes collisions dans un de mes jeux ! :D J'ai toujours cru que je faisais un truc à l'arrache et qu'il y avait moyen de mieux faire ! Je me sens flatté du coup :p

ne le sois pas trop quand même, ceci est effectivement c'est le truc de base que tout codeur se doit d'avoir implementé apres 2 jours de formation a un language informatique, il y a pas mal d'autres moyens plus propres/précis/optimisés/moin minable algorithmiquement :ange:

pjeff
24/01/2008, 09h24
Nesgba tu as entierement raison il y a beaucoup d'autre moyen de faire la meme chose.

La on et dans l'optique d'une INITIATION pour la programmation C avec l'oslib, donc c'est pour cette raison que je n'ai pas mi un systeme tres compliquer.l'essentien et que ca fonctionne bien et que ca soient comprit :)

Mais dans les tuto a venir je vais combler petit a petit cette tache : collision map ,bounding sphere ,collisions pixel perfect , faire un menu pour un jeux,creer un clavier virtuel, accompagnement pour faire un Debut de RPG , un debut de Mario-Like ,je ferait certainnemùent un rapide tour pour les POINTEURS qui sont pour moi tres importants pour la suite des chose, enfin un planing tres serer mais ca sera sur du long terme car je suis en paralelle et meme prioritairement sur la programmation de mon jeux "SUPER MARIO TOY"....
en gros certainne chose qui peut etre pour un bon codeur asser simple mais en realiter pas evident pour un debutant qui n'a meme jamais fait de cour d'informatique ou de programmation :)


Par contre Nesgba si tu veux tu peut nous presenter d'autre possibiliter pour les collisions ou pour Optimiser tout ca. Je pence parler au nom de tous ,que tu serais le Bienvenu .

Brunni
24/01/2008, 11h31
Merci bcp pour ce tuto ^^
C'est vrai que Yodajr et moi-même étant seuls à travailler sur OSLib, ça fait plaisir de voir d'autres personnes motivées pour aider les gens, surtout qu'on n'a plus beaucoup de temps de notre côté ;)

kinski
24/01/2008, 18h52
ne le sois pas trop quand même, ceci est effectivement c'est le truc de base que tout codeur se doit d'avoir implementé apres 2 jours de formation a un language informatique, il y a pas mal d'autres moyens plus propres/précis/optimisés/moin minable algorithmiquement :ange:

Pauvre mec

archilolo
24/01/2008, 19h22
Par contre Nesgba si tu veux tu peux nous présenter d'autre possibilités pour les collisions ou pour optimiser tout ça. Je pense parler au nom de tous, que tu serais le bienvenu .

+1 ^^ !

Bap65
25/01/2008, 00h01
+1 ^^ !

+1 ^^ !



Je suis curieux de voir ce que ça peut donner.

Nesgba
26/01/2008, 15h42
oh j'avais pas vu, merci bobby ;)

la je n'ai pas le temp mais je vous montre ca ce soir (si j'ai la connexion).

Bobby Sixkilla
26/01/2008, 15h45
Ba voilà. :p

pjeff
26/01/2008, 17h28
Nesgba on et impatient :)

Smealum
27/01/2008, 15h26
Ouai. :D

archilolo
27/01/2008, 15h43
Carrémen :bave:

Ass-Itch
27/01/2008, 15h54
lo :lol:

cruisx
16/04/2008, 00h37
what part do i have to modify if i want a 3rd sprite? and ow? sorry im a noob

Dr.Vince
16/04/2008, 00h51
hum..... you want to test collision between 3 sprites ???

archipel
16/04/2008, 10h05
moi j'ai pas tout compris non plus mais :

test collision A-B , B-C and A-C ? (A,B and C are the three different sprites)

pjeff
16/04/2008, 12h54
bonjour, effectivement pour 2 3 ou meme 10 sprite , il y a pas de miracle, il faut tester 1 par 1 chaque sprite avec un autre.

la solution citer au dessus et donc la bonne, enfin pour moi.
techniquement on ne peut que tester les collisions de 2 sprites en meme temps.