1

Dans le but d'affiner les collision, je recherche un moyen de tester la collision entre deux sprites.
Pour l'instant je fais un truc tout con entre deux quadrilatères :
int collision_check(int x1,int y1 ,int w1, int h1, int x2, int y2, int w2, int h2) { if(y1+h1 < 0 || y2+h2 < 0) return(0); if(x1+w1<x2) return(0); if(x2+w2<x1) return(0); if(y1+h1<y2) return(0); if(y2+h2<y1) return(0); /* Collision */ return(1); }

On peut légèrement affiner avec un "masque de réduction" de collision de qques pixels en moins mais c'est toujours pas parfait.
Sur cet exemple on voit le masque de réduction sur le dernier rock.
http://www.youtube.com/watch?v=2mDdjwj2tww&list=UUvtGGvyzQSfHOUenqHSHKXA&index=27&feature=plcp

Une autre technique consisterait à tester la couleurs des pixels sur l'intersection des deux carrés.

Existe-il un moyen de lire la couleur du pixel d'un sprite ?

2

Tu ne peux pas lire les pixels.

Si tu veux affiner tes collisions pour qu'elle collent à la forme de l'objet il faut employer plusieurs hitboxes au lieu d'une seule. Et si t'es chaud bouillant tu peux faire une hitbox circulaire pour les bullets. smile

3

mince sad
Les hitboxes c'est super long à coder ! je suis nettement moins chaud là smile
tampis, va pour les hitboxes alors..

4

CeL , HPMAN

pardonné mon ignorance : concernant la gestion de collisons, l' utilisation de la technique des 'quadrilatères', des 'Hitboxes' ca marche plutot pour des objets mobiles, en mouvement ? (exemple des asteroides)

et la technique des 'collision map' ... totalement autre chose ?

exemple : Pingouin qui tombe et qui marche sur un rocher ( 'object') , sans le traverser :
http://www.setera.org/2011/01/16/pingus-on-android-more-collision-detection/

trouvé ca aussi, sur le sujet des 'map collision' (très interessent) avec utilisation de couleurs bien précise ...
http://www.dev-fr.org/index.php?topic=3553.15

A SUIVRE ...
Fred

5

pourquoi on ne peu pas lire les pixels ?
et la le mec il le pécho par le bras et il lui dit '

6

Salut robinHood

désolé , j' ai pas la réponse ... I am a poor Newbie
Mais c'est bien que CeL commence a ouvrir des sujets tel que les collisions et autres
perso, je cherche a me cultiver

On veut des TUTOS dédiés NEO-GEO bien sur !!

bye
Fred

7

robinHood (./5) :
pourquoi on ne peu pas lire les pixels ?


Parce que cool

8

Si tu veux des collisions pixel-perfect, tu peux utiliser des masques binaires (1 bit par pixel du sprite, qui vaut 1 si le pixel est opaque et 0 sinon). Du coup avec un simple AND tu peux vérifier la collision de 32 pixels d'un coup. Si tu veux que ce soit vraiment rapide, tu peux aussi précalculer les versions décalées horizontalement de 1, 2, 3... pixels de ton sprite, au lieu de le faire à la volée.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

9

robinHood (./5) :
pourquoi on ne peu pas lire les pixels ?


<monsieurjesaistout>
Il n'y a pas de framebuffer sur Neogeo, les pixels sont envoyés en live à la télé sans qu'on puisse y toucher.
</monsieurjesaistout>

Au pixel près t'es parti pour avoir les données graphiques de tes sprites en 1bit/pixel dans ton P ouais tongue
avatar
Je fais des trucs. Des fois ça marche, des fois ça marche pas.

10

je veut bien, mais les sprites eux même sont bien qq part en mémoire, pas moyen d'aller les lires ? (même si ca doit être la merde j'ai vu que c'est seulement du 16px de large ^^)
et la le mec il le pécho par le bras et il lui dit '

11

Ils sont seulement dans la cartouche, seul le gpu y a accès, pas le cpu donc pas de moyen de lire si un pixel est transparent ou non.
avatar
Je fais des trucs. Des fois ça marche, des fois ça marche pas.

12

salut
j' ai retouvé le site de tutos qui traitait de la gestion des Collisons ...

et dont la technique de :
2.3. Collision Rectangle-Rectangle

avec le code identque a celui de CeL qui l' a simplement adapté au SDK NeoDev ... bon boulot Yannick

'Il se peut que notre programme ait besoin d'une gestion de collision entre deux rectangles. Dans notre cas, nous aurons besoin de ce type de collision pour gérer la collision entre les balles et la raquette du jeu.

Collisions entre deux rectangles
Sélectionnez
//Fonctions qui gerent les collisions
bool Physique::collisionRect(double x1, double y1, double w1, double h1,double x2, double y2, double w2, double h2)
{
if(x1+w1<x2) return false;
if(x2+w2<x1) return false;
if(y1+h1<y2) return false;
if(y2+h2<y1) return false;

return true;
}


Comme vous le voyez, ce n'est pas très compliqué. La question est de savoir si le rectangle (x1,y1,w1,h1) est en collision avec (x2,y2,w2,h2).

On commence par regarder si l'abscisse x2 est à gauche de x1+w1. Si c'est le cas, il peut y avoir une intersection si x1 n'est pas à droite de x2+w2. En effet, cela voudrait dire que soit x2 appartient à l'intervalle [x1, x1+w1], soit x1 appartient à l'intervalle [x2,x2+w2]. Dans ce cas, on regarde si y1 est inclu dans [y2, y2+h2] ou si y2 est inclu dans [y1, y1+h1].

En faisant un dessin, je pense que vous arriveriez à voir tous les cas possibles et voir que nous les gérons tous... Ce type de collision sera utilisé par la collision entre une balle et une raquette.

13

I've used this solution for IOCEROSOCCER with good results:
bool spritecollidePixel(bool screen,s8 sprite1,s8 w1,s8 h1,s8 sprite2,s8 w2,s8 h2){ //grab sprite demensions (center positions and length and width) s16 x1=PA_GetSpriteX(screen,sprite1)+(PA_GetSpriteLx(screen, sprite1)>>1); s16 y1=PA_GetSpriteY(screen,sprite1)+(PA_GetSpriteLy(screen, sprite1)>>1); s16 x2=PA_GetSpriteX(screen,sprite2)+(PA_GetSpriteLx(screen, sprite2)>>1); s16 y2=PA_GetSpriteY(screen,sprite2)+(PA_GetSpriteLy(screen, sprite2)>>1); return (((x2 >= x1 - ((w1 - -w2)>>1)) && (x2 <= x1 - -((w1 - -w2)>>1)) && (y2 >= y1 - ((h1 - -h2)>>1)) && (y2 <= y1 - -((h1 - -h2)>>1)))); }
RetroIsTheOnlyFuture!