Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [WIP] Casse Brique C++ [Résolu]  (Lu 5946 fois)

0 Membres et 1 Invité sur ce sujet

Kaim

  • Jr. Member
  • **
  • Messages: 70
  • SFML 2
    • Voir le profil
[WIP] Casse Brique C++ [Résolu]
« le: Mai 14, 2012, 05:30:29 pm »
Bonjour !

Je me suis remis récemment à coder, et j'ai donc bien entamer la réalisation d'un casse brique, avec notre bibliothèque préférée. Jusque là, rien d'original ...

J'ai juste un petit soucis, et un problème d'ordre plus général, mais avant, quelques infos :

Organisation du programme :

La classe Jeu gère les évènements, provoque l'affichage régulier de toutes les briques, balle, etc ..
Le joueur est en fait juste un rectangle contrôlé par la souris (la classe jeu lui indique ou se placer)
La balle, bah voilà ... et idem pour les briques.

Le principe du truc : J'utilise des collisions cercle/rectangle entre balle et brique/joueur.
Le jeu test à chaque affichage les collisions balles/reste, et si il y  lieu, lance la fonction choc de la balle.
La balle rebondis, et c'est elle qui envoi le signal de choc à la brique.
Petite subtilité, j'ai fais en sorte que la balle ne puisse pas rebondir deux fois contre le même objets si elle n'a pas choqué contre autre chose avant (elle choquait, mais n'avait pas le temps de partir parfois, donc rechoquait). La détection des collisions et chocs fonctionne à merveille.

MAIS :

petit soucis : lorsque je casse une brique, certaines (aléatoire ?) scintillent une fois ! -> elle ne sont manifestement pas affichées pour une seule frame , mais là, bah je coince ...
-> problème connu ? (j'ai mis le frame limit à 400) ou alors j'ai vraiment un plantage quelque part ?

Mais on a aussi le problème : les rebonds !
Comment j'ai fais :
baballe choque sur brique -> on rebondis.
Si : le projeté du cendre de la balle est sur un segment horizontal (vertical), on inverse la vitesse horizontale (verticale respectivement) -> le point de choc est sur un segment.
Si ce n'est pas le cas, on est plus ou moins dans un angle :

(le schema est normalement en fichier joint, je ne sais pas trop comment ça marche  :-\ )

la balle arrive avec une vitesse rouge, de norme V. J'ajoute à ce vecteur le vecteur bleu (ici de coordonnées (1,1), de norme 2*V), on calcule le vecteur vert, vitesse finale de la balle, en lui redonnant une norme de V.
c'est pas trop mal, et ça règle le cas pathologique de la balle avec vitesse orange, mais qui tape dans le coin !

SAUF QUE : mettez deux briques à coté, et tapez dans le coin de l'une : la balle rebondis sur un angle, alors qu'elle est face à une droite  (comme ceci : _______|________ )

Comment faire pour avoir de jolis rebonds tout beaux ?? Voilà c'est mes deux problèmes du moments, j'ai nommé ce sujet WIP, car ce sera pas les derniers problèmes je pense, alors autant éviter le surnombre de sujets !

       
EDIT : les fichiers joins ne se voient pas à la prévisualisation, mais ça marche !

[attachment deleted by admin]
« Modifié: Mai 16, 2012, 01:04:42 pm par Kaim »
Programme buggé : pléonasme

http://courtois.cc/murphy/murphy_informatique.html#progsbugs

-> Viens (enfin) de passer en SFML 2 !

Koryushin

  • Jr. Member
  • **
  • Messages: 93
    • Voir le profil
Re : [WIP] Casse Brique C++
« Réponse #1 le: Mai 14, 2012, 06:32:18 pm »
Bonjour, pour le problème du rebond sur un coin je vois qu'une solution.
Si la balle tape un coin d'une brique, avant de la faire rebondir il faut tester si cette brique ne possède pas une voisine ( du coté du coin).  ;)
Et donc si elle a une voisine on considère que la balle tape un segment et non un coin.

Le premier problème j'ai pas compris ce que tu voulais dire. ???

Kaim

  • Jr. Member
  • **
  • Messages: 70
  • SFML 2
    • Voir le profil
Re : [WIP] Casse Brique C++
« Réponse #2 le: Mai 14, 2012, 07:18:02 pm »
En fait de manière plus ou moins aléatoire, quand je casse une brique, une autre disparaît et réapparait de suite après, elle scintille une seule fois...
Et j'ai beau chercher dans le code, il y a toujours quelque chose d'afficher, les fonctions de chocs et d'affichage sont totalement indépendantes ... De plus, chaque brique gère son propre affichage, donc si j'en casse une, il n'y a aucun effet sur les autres !

Pour ce qui est des rebonds, j'avais pensé à ça aussi, mais je trouve pas ma façon super réaliste, ça rebondis bizarrement parfois ... Il y a une meilleur manière de gérer ces rebonds spéciaux ?

(Merci pour la réponse rapide au passage !)

Est-il utile de poster une release ?

(Désolé pour mon délai de réponse, ma connexion internet est vacillante ...)

EDIT : Oulah, je crois connaitre l'origine du problème d'affichage, après plusieurs dizaines de test ...
En fait, quand je détruit ma brique, je l'enlève du tableau contenant toutes les briques, et c'est toujours celle qui prends sa place qui scintille ... c'est moche ....

EDIT2 : scintillement, morale de l'histoire :
Ne jamais interférer dans les affaires d'autrui :  ;)
la brique agissait sur le jeu pour qu'il la supprime -> immense bordel inomable, après réflexion ...   ::)
-> correction : la brique indique au jeu qu'elle doit être supprimée, et celui le fait quand c'est le moment !
-> pas de bordel ! Reste encore un problème : la collision mystère !  :o
-> c'est une brique qui par une série de rebords originaux, est purement et simplement détruite par la balle, mais celle-ci ne semble pas rebondir !
-> En bref, ce problème est réglé !
Mais si quelqu'un a une idée pour une collision sur les angles plus réaliste, je suis preneur !

EDIT3 : Les colisions avec plusieurs briques : cas pathologiques :

Le problème viens des deux images :
la 1ère, avec 2 briques :
la balle arrive : vitesse rouge, rebondis sur la brique de gauche -> vitesse verte
MAIS : elle n'as pas le temps de partir, et l'algo la fait choquer avec la 2ème brique.
J'ai eu une collision sur la face inférieure comme ça -> vitesse verticale inversée -> bleue

Et avec 3 briques, j'ose même pas imaginer le bazar que ça peut engendrer ....

J'avoue, je sèche complètement ... Aucunes idée de comment gérer le truc, même en supposant que je connaisse toutes les briques proches (en collision avec une balle plus grosse par exemple) ...
Je suis prêt à tout essayer, dès demain !

[attachment deleted by admin]
« Modifié: Mai 14, 2012, 10:51:29 pm par Kaim »
Programme buggé : pléonasme

http://courtois.cc/murphy/murphy_informatique.html#progsbugs

-> Viens (enfin) de passer en SFML 2 !

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : [WIP] Casse Brique C++
« Réponse #3 le: Mai 14, 2012, 10:55:14 pm »
Pour ton pb de collision, faut juste que le vecteur bleu sur ton schéma tu le transformes en le vecteur (0,1) quand il est sur l'angle...
de toute façon c'est pas logique que tu ne tapes que sur la brique de gauche dans ce cas, normallement tu tapes sur les 2 coins en meme temps.
Pour eviter que ça rebondisse une nouvelle fois sur la brique de droite et que ça parte 'dans' la brique de droite, tu peux aussi tester le produit scalaire entre le vecteur vitesse et la normale... si c'est positif, ça rebondit pas

edit :
je viens de voir ton edit 3... en fait c'est juste que tu gères mal les colisions (enfin c'est le cas le plus dur effectivement, je me souviens avoir galéré avec ça une fois). On peut pas t'aider vraiment plus avoir  la logique de ton code, en gros comment tu détectes une collision ?
Sinon tu peux fouiller ici http://code.google.com/codejam/contest/1460488/dashboard#s=a&a=3 , c'est le problème 4 du google code jam de cette année, c'est en gros très similaire (reflection sur des miroirs), j'imagine qu'il y a une tonne de solution qui doit circuler maintenant
« Modifié: Mai 14, 2012, 11:09:42 pm par lezebulon »

Kaim

  • Jr. Member
  • **
  • Messages: 70
  • SFML 2
    • Voir le profil
Re : [WIP] Casse Brique C++
« Réponse #4 le: Mai 15, 2012, 10:41:28 am »
Et bien, je détecte une collision avec la methode décrite ici :

http://www.siteduzero.com/tutoriel-3-254490-formes-plus-complexes.html#ss_part_4

J'ai essayé plusieurs trucs : la balle ne choque pas avec 2 briques sans se déplacer un peu, ou alors elle doit attendre un petit laps de temps avant de pouvoir rechoquer ..... mais c'est pas top !

Je vais regarder ton lien !

EDIT : Et transformer le vecteur bleu en (0,1) enlève le cas limite ou la balle arrive avec une vitesse de (-1, -1) -> elle doit être réfléchie dans ce cas, et ce ne serait plus le cas avec (0,1) ....

EDIT 2 : Possible solution :
Je vais tester quelque chose (mais ça nécessite pas mal de modifications donc ça va prendre un moment) ...
Je vais trouver toutes les briques à proximité de la balle, calculer la vitesse qu'elle aurait en choquant contre chacune d'elle, et en faire la moyenne !
ça semble résoudre pas mal de cas tordus ! à voir ...
En tout cas je vais essayer ça !
« Modifié: Mai 16, 2012, 12:57:58 pm par Kaim »
Programme buggé : pléonasme

http://courtois.cc/murphy/murphy_informatique.html#progsbugs

-> Viens (enfin) de passer en SFML 2 !

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : [WIP] Casse Brique C++
« Réponse #5 le: Mai 15, 2012, 08:02:29 pm »
Oui ton edit 2 c'est un peu ce que je voulais te dire avec le vecteur bleu à modifier : tu peux aussi plus simplement faire la moyenne des vecteurs normaux et prendre le resultat comme vecteur normal avec lequel faire ton rebond (ça revient au meme que ce que tu veux faire en moins de calculs)

Kaim

  • Jr. Member
  • **
  • Messages: 70
  • SFML 2
    • Voir le profil
Re : [WIP] Casse Brique C++
« Réponse #6 le: Mai 16, 2012, 12:57:23 pm »
C'est fait, et ça marche !!!  :D ;D
La moyenne des vecteurs normaux me semble moins intéressante, puisque qu'on retrouve des cas moches, avec une seule brique (j'avais déjà écarté la réflexion sur les angles) :
    vitesse verticale -> vitesse horizontale (la balle redescends pas)
    si la balle arrive comme la vitesse orange du premier dessins, ça donne une réflexion bizarre (la balle tourne autour de la brique)

Voilà donc un problème résolu, jusqu'au suivant !

EDIT : petite subtilité :
vérifiez que la somme des vitesse réfléchies n'est pas nulle :
ça arrive dans le cas des trois briques, si la balle ne choque qu'avec celle du haut et celle de gauche.
Dans ce cas, on détruit bien les briques, et la balle repart avec une vitesse simplement opposées à sa vitesse d'arrivée ! (Si jamais cette remarque sert à quelqu'un un jour  ;) )

Et il faut aussi donner une valeur minimale à la vitesse verticale, en valeur absolue -> il arrive que par cette méthode, la balle ait une vitesse quasi-horizontale.
« Modifié: Mai 16, 2012, 04:33:36 pm par Kaim »
Programme buggé : pléonasme

http://courtois.cc/murphy/murphy_informatique.html#progsbugs

-> Viens (enfin) de passer en SFML 2 !