CLASS SPRITE AVEC SDL

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 11 juin 2005 à 21:50
Insomniakk Messages postés 2 Date d'inscription lundi 27 novembre 2000 Statut Membre Dernière intervention 18 septembre 2005 - 18 sept. 2005 à 17:18
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/31989-class-sprite-avec-sdl

Insomniakk Messages postés 2 Date d'inscription lundi 27 novembre 2000 Statut Membre Dernière intervention 18 septembre 2005
18 sept. 2005 à 17:18
Bon, c'est bon, ça ne bug plus... (étrange...)

Ce qu'il manque dans ta classe, c'est un systeme de frame !
Insomniakk Messages postés 2 Date d'inscription lundi 27 novembre 2000 Statut Membre Dernière intervention 18 septembre 2005
18 sept. 2005 à 12:45
J'ai fait ça pour tester la classe:

sprit.SetPos(1, xsouris, ysouris);
sprit.affich(screen, -1);

Mais ça plante... Il me dit que c'est une erreur de segemntation...
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
17 juin 2005 à 23:52
Hmmm, parce que j'ai jamais fait ça, ça peut répondre à ta question ;) je parle plus par procuration que par expérience à vrai dire.
Par contre pour les gestionnaires de ressources, c'est pas bien méchant: tu as une classe Manager qui donne des "handle" sur les ressources à la demande et qui compte le nombre de handle qu'elle a donné. Si on demande une ressource qui n'existe pas, elle est créée (chargée), et si elle existait déjà, on retourne simplement un handle sur celle existante.
Quand un handle est détruit (appel du destructeur de celui-ci), il le dit à son manager "père". Quand le nombre de handles dans la nature d'une ressource est à 0, c'est que plus personne ne l'utilise: on la libère.

Il y a moyen de faire qq ch d'assez beau et de très générique avec un peu d'héritage et de template, pour pouvoir gérer avec le même set de classes des polices, des textures, des sons, des musiques, des scripts ...

L'idée pour l'utilisation ici, ce serait simplement d'avoir un manager qui centralise le chargement des textures et des masques, et qui s'occupe de fournir des handle sur tout ce beau monde: ça réduit drastiquement les temps de chargement!

Quant à la définition du handle, c'est le seul truc compliqué et ça dépend assez fort de l'usage que vous avez de la chose, et de la souplesse que vous voulez y donner. Ça peut être un pointeur sur la ressource possédée par le manager, ça peut être une instance de classe qui possède toutes les infos, copiées depuis la ressource, ça peut être une référence ...
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
17 juin 2005 à 23:45
Hey kirua pourquoi tu nous ferais pas un tuto la dessus avec le .tga ? :)
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
12 juin 2005 à 14:25
à mon avis tu dois sauver avec l'image (et séparer l'image du sprite, car les images sont des ressources communes, tu peux avoir plusieurs sprites qui exploitent la même image, et donc le même masque) un tableau de bits ou de booléens qui constituent le masque. tu le constitues au chargement de l'image (qui doit être unique et centralisé), et pr le fabriquer, beeeen, ça dépend de tes images! avec du targa (tga) il y a un octet alpha, avec les bmp il te faut soit un masque supplémentaire soit connaître la couleur ... à toi de définir! pas easy, je sais bien.

l'idéal, ce serait un gestionnaire de ressources qui donne accès aux images à la demande, et comme ça les sprites ne se soucient pas de savoir ça: c'est géré à part.
lglandeur Messages postés 28 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 20 janvier 2009
12 juin 2005 à 14:21
merci Kirua pour les sites, et je pense que ma prochaine maj comporteras le pixel perfect.

pour le pixel perfect j'aimerais savoir 2 chose:
1) si il y a un moyen sous sdl qui permet de savoir si un pixel est transparent ou non, sans faire de test de couleur
2) a quel moment je doit crée le masque pour perdre le moins de temps possible.

pour Pamaury mon e-mail: lglandeur@free.fr
Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
12 juin 2005 à 12:25
oui en effet c'est pas très dur il suffit de bien voir le problème . Le pixel perfect(j'avais déjà lu l'article) marche bien si on les image . Dans le cas de la SDL çà va mais dès qu'on met à l'échelle c'est mort .
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
12 juin 2005 à 10:50
Euh, le test mathématique est l'étape préalable du pixel perfect :) d'abord tu testes les boîtes: est-ce que les images se rentrent dedans, et après tu testes les pixels. Mais si t'es en 2D y a pas de problème (sauf dans le cas de la mise à l'échelle, très juste -> à éviter :p).

Boîte cercle il s'agit juste de voir si la distance de chaque côté de la boîte au centre du cercle est plus grande ou plus petite que le rayon du cercle, et comme tout est parralèle aux axes du repère, c'est pas trop dur, hmm ;)
Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
12 juin 2005 à 10:46
oui en effet c'est pas mal mais bon si tu n'a pas d'image par exemple(tu dessine avec OpenGL et msie à l'échelle par exemple) çà marchera pas donc autant savoir faire le test mathématique .

Pour le test boite-cercle je veux bien t'expliquer mais donne moi une adrese e-mail où je peux t'envoyer une image parce que sinon j'y arriverais pas .
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
12 juin 2005 à 10:12
Tu peux aussi essayer de gérer des collisions dites pixel-perfect, c'est-à-dire que tu gèrerais la transparene de tes images (deux pixels transparents ne se rentrent pas de dans ;)). Ça donne des effets plus prévisibles et réalistes pour le joueur + pas besoin de différencier cercle-boîte et boîte-boîte ou cercle-cercle.

Tutos:
http://www.ddj.com/documents/s=983/ddj9513a/
http://www.games-creators.org/wiki/Documentv3_198
lglandeur Messages postés 28 Date d'inscription samedi 11 juin 2005 Statut Membre Dernière intervention 20 janvier 2009
12 juin 2005 à 00:30
merci Pamaury pour l'astuce avec les valeur abs pour le test boite-boite, je n'y avait pas pensé.

par contre pourrais m'expliquais comment fonctionne la fonction isPointIn
Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
12 juin 2005 à 00:13
ton test boite-boite pourrait être plus rapide(et plus lisible):

if(ABS(rect[numSprite1].x-rect[numSprite2].x)>(rect[numSprite1].w/2+rect[numSprite2].w/2))
return false;
if(ABS(rect[numSprite1].y-rect[numSprite2].y)>(rect[numSprite1].h/2+rect[numSprite2].h/2))
return false;
return true;


et voilà le code pour une collision boite-cercle
int rad=MAX(rect[numSprite1].w,rect[numSprite1].h)/2;
int x=rect[numSprite1].x;
int y=rect[numSprite1].y;
int w=rect[numSprite2].w/2;
int h=rect[numSprite2].h/2;

if(isPointIn(x,y,rect[numSprite2].x,rect[numSprite2].y,w+rad,h))
return true;
if(isPointIn(x,y,rect[numSprite2].x,rect[numSprite2].y,w,h+rad))
return true;

rad*=rad;

int dx=rect[numSprite2].x+w-x;
int dy=rect[numSprite2].y+h-y;
if((dx*dx+dy*dy)<=rad)
return true;

dx-=2*w;
if((dx*dx+dy*dy)<=rad)
return true;

dy-=2*h;
if((dx*dx+dy*dy)<=rad)
return true;

dx+=2*w;
if((dx*dx+dy*dy)<=rad)
return true;

return false;
Rejoignez-nous