Pour la détection de collision je connais quelque technique comme le bounding boxe ou le pixel perfect, sinon c´est technique ne sont peut être pas les meilleurs pour un labyrinthe.
http://games-creators.org/wiki/Détection_pixel-perfect_des_collisions_2D
Moi je me rappelle pour un jeu je stockais ma map dans un tableau de int (chaque sprite un numéro )et tous les chiffres négatifs correspondait à des objtes infranchissable. Il me suffisait donc de tester a chaque fois que mon personnage avançait s´il tombé sur une case de poids négatif.
Salut !
Pour ma part, je fais un FPS en ce moment et en ce qui concerne les collisions, je n´ai utilisé que les mathématiques : en gros je calcule le coefficient directeur de chaque mur, je le considère dans le repère optimal, puis je calcule la distance entre l´abscisse théorique de mon joueur contre le mur et sa position réelle. Ensuite je le repositionne et le résultat et PARFAIT ! Je ´glisse´ véritablement contre mes murs, qu´ils soient inclinés ou pas.
Bonsoir, je viens re rencontrer un probleme avec les collisions.
Prenons un pong, la balle rebondit en X quand elle est comprise entre 10 et 30 de coordonnées, disons.
Admettons qu´on lui rajoute de la vitesse, elle peut arriver a balle-=40;
Si balle.x=31, on lui enleve 40, ca fait -1, on s´est teleporté derierre la raquette.
En ecrivent ces lignes, j´ai trouvé la solution, si la balle est a droite de la raquette aux bonnes coor X, et que le tours d´apres, elle est a gauche de la raquette au bonnes coor X, on fait repasser la balle a droite de la raquette et on fait la collision.
Je testerais ca demain je pense, si j´arrive pas a l´appliquer, je reviendrais poster, mais je devrais y arriver ![]()
Pour un pong (comme un casse brique), il est évident qu´il est inutile de faire une vraie collision : on regarde simplement si la balle a franchi la ligne que réprésente la raquette. Si c´est le cas, alors soit on fait rebondir si on est en face de la raquette, soit on fait perdre le point si on ne l´est pas.
Sinon, ton probleme de tabulation est connu.
Une méthode pour éviter cela :
- Eviter que la vitesse d´un objet ne dépasse sa largueur (tu vois ce que je veux dire, meme si c´est un abus de langage)
Si tu te vois obligé de faire cela, alors subdivise le mouvement.
C´est a dire :
ta balle fait 30 pixels de large. tu as envie de la faire bouger de 40 pixels.
Fait le en 2 temps :
20 + 20 par exemple ! Comme si tu faisais 2 frames au lieu d´une ! Sauf que tu n´es pas obligé de réafficher entre les 2 : ainsi, tu calcules 2 mouvements, mais tu n´affiches que le final.
Comme ça, tu te ramenes au bon cas ou il n´y a pas eu tabulation.
Moi je n´ai toujours pas compris la gestion des colisions 2d en C avec la SDL?Je suis aller sur le site game creator mais je n´ai pas compris ![]()
kikou
il faut que tu sache au moment ou tu veux tester la colision (1) la position de ton objet (2) la position de tout les murs (dans le cas d´un labyrinthe). Ensuite c´est a toi de verifier que ton objet n´est pas colé a un mur ou pire, si il ne l´a pas traversé.
il n´y a pas de technique speciale a SDL, c´est a toi d´implémenter une fonction de test qui te dira si ton objet est en colision.
prenons le cas simple d´une boule dans un labirynthe:
ton labyrinthe est stocké sous forme d´un tableau de droite.
ta balle est stockée avec un centre (x,y) et un diametre.
à chaque mvt de la balle tu vérifie qu´aucune droite ne coupe ta balle. (pas trop compliqué). puis si il y a colision, tu change la direction de la balle (ou tu la stop...).
je sais pas si c´est tres clair...
En tout cas, pour ce genre de probleme (en 2d), tu fais un petit dessin et généralement tu arrive assez facilement a voir ce qu´il faut tester.
Oui mais son labyrinthe est peut-être constitué de droites inclinées, s´il doit l´adapter à une image bitmap. Et dans ce cas, un système correct de collision demande un peu plus de réflexion...
non pas forcement. une fonction qui verifie qu´une droite coupe un cercle peut-etre valable pour les droite ni verticale ni horyzontale...
Mais s´il veut faire glisser son cercle contre la droite? (enfin, je trouve que c´est la meilleure collision qu´on puisse réaliser)
Je pense que j´ai une solution, c´est que dans ma fonction de deplacemment, je fais dire les coordonné "interdite" donc je dis
deplacer(image) que si image n´est pas a certaine coordonné.
Ca peut marcher non?Je pense que c´est une mauvaise idée mais bon...
En fait, le système de collision que tu vas réaliser dépend de ce que tu veux faire faire à ta balle. Si tu veux qu´elle glisse contre les murs, l´algorithme est assez compliqué (mais je peux t´aider !) , mais si tu veux seulement qu´elle s´arrête :
- tu stockes le contenu des variables X et Y dans oldX et oldY avant le code de déplacement de la balle
- et quand la balle est dans une zone ´interdite´, alors tu mets le contenu de oldX et oldY dans X et Y, ce qui replace la balle à son ancienne position.
Cette technique est en quelque sorte le hello world de la collision ![]()
Merci Fvirtman, j´y avais vraiment pas pensé de separer en deux voire plus les deplacement pour pas traverser la raquette.
Ca va etre plus facile ainsi ![]()
Ok merci beaucoup Pxnet, je testerais sa demain apres midi ^^ mais o fait, c´est pas une balle moi, c´est juste un petit sprite ^^ Merci beaucoup; au fait, vous pensez qu´il faut que fasse un topic pour mon jeu quand?
quand tu auras 2-3 images de présentation; si le moteur n´est pas pres c´est trop tot. (a mon avis)
pour le moment tu peux poser tes question ici (ça répond assez vite).
Methode de Fvirtman appliquée, la vitesse de la balle peut aller de 600 en 600, ca fonctionne quand meme, j´ai decomposé de 20 en 20, en 4 lignres de code, le tours est joué ^^
J´ai un autre probleme pour mon jeu, quand je deplace mon sprite, il laisse une trace des couleur qui compose le sprite a lecran c´est tres moche...Pour le deplacemment je fais:
Si evenement clavier == UP(fleche du haut)
{
position_sprite.y--;
}
blit()
flip()
Si ca ne vous vas pas je peut vous donner le code exact.
Merci tous le monde.
C´est tout à fait normal il faut que tu nettois l´écran, et reconstruise l´image. Le simple appel de la fonction SDL_FillRect(screen, &rect, 0); dans ta boucle principale devrait suffrir à enrayer ton problème.
Non ca ne regle pas mon probleme, le background est noir, tu es sur que le troisieme parametre de la fonction est bien "0" normallement "0" c´est le noir donc...Moi je veux que mon sprite puisse se balader sur mon image donc il ne faut pas metrte du noir sinon ca m´efface mon image...Ta pas une solution?
Merci beaucoup,
Mais non, tu met le noir, puis ton image !
SDL_FillRect(...);
//Deplacement de l´image
SDL_BlitSurface(image);
SDL_Flip();
Oui oui sa marche mais c´est parce que j´avais oublié un break dans un swich
mais sinon la j´ai toujours un probleme,
je me suis fait un menu de presentation et quand je lance le jeu, ca maffiche en eclair le menu ca nattend meme pas que l´on rentre une lettre(h dans mon jeu) et sa va directemment au jeu.Par contre le jeu marche
vou savez pourquoi ou vous voulez mon code?