Ă©laboration Pong

Bonjour Ă  tou.te.s,

Tout débutant, je me suis amusé à partir du tutoriel sur Pong, en créant des menus pour sélectionner le nombre de joueurs et la direction de la balle … Mais par rapport à un “vrai” pong, je me rends compte que le mouvement de la balle est complètement déterminé par son point de lancement, et ne varie pas selon l’impact avec la raquette. Auriez-vous des pistes pour améliorer ce point et rendre le jeu plus rigolo dans cette optique ? (je vais regarder si je peux m’inspirer du livre Code the Classic mais je suis aussi preneur de vos conseils !)

Merci !

Il faut que tu check quelle zone de la raquette la balle touche et que tu ajustes les abscisses et ordonnées en conséquence. voir inverser le sens de la balle quand tu es proche du bord de la raquette.

ok merci ! mais c’est possible avec la fonction gb.collide.Rectrect , ou je dois coder ça manuellement ?

Idéalement par rapport à ce que tu souhaites, il faut coder un rebond en fonction de 2 vecteurs: le déplacement de la balle et le déplacement de la raquette (qui a une surface de rebond droite, on ignorera dans un premier temps l’épaisseur de la raquette et le rebond spéciaux sur ses angles).
Je te donne un très bon lien vers un site qui explique un peu tout ça sur Python: https://code.vonc.fr/?a=85
et surtout ce lien: https://jeux.developpez.com/tutoriels/theorie-des-collisions/formes-complexes/

Dis moi si ça te permet de faire ce que tu veux.

Sinon tu as plus simple. Tu simules une surface de rebond courbe avec un angle à 90 quand la balle frappe au centre et selon la distance ente le point d’impact et le centre, un angle plus grand si la collision a lieu après le milieu par rapport à la direction de la balle ou inférieur à 90 si la balle touche la raquette avant le milieu (tu définis l’angle maximum par rapport au bord de la raquette et tu appliques un ratio en fonction de la distance).
Ce n’est clairement pas une application exacte de la physique mais ça permet de contrôler un peu la trajectoire de la balle et de rendre le jeu plus fun.

1 Like

merci ! la première solution me semble un peu complexe p/r à mon niveau, mais par contre je vais implanter la deuxième, d’abord sur un rebond dichotomique selon que la partie touchée soit gauche ou droite, puis avec une fonction linéaire de la distance au centre. on verra plus tard pour les effets :slight_smile:

par contre, est-ce que je laisse tomber la fonction gb.collide, ou est-ce qu’elle me sert dans un premier temps pour la détection, avant de préciser à l’intérieur le niveau d’impact ? je me dis que c’est peut-être plus simple comme ça …

Tu peux utiliser gb.collide. C’est bien pratique en règle générale.
Dans la cas du Pong, c’est vraiment comme tu veux mais tu peux utiliser un autre principe.
En fait tu peux vérifier tout simplement si balle.x <= position horizontale de la raquette (raquette.x) + largeur (raquette.largeur) et ne vérifier que dans ce cas si ta balle touche ou non la raquette en y.
Si tel est le cas, tu regardes oĂą elle touche par rapport au centre et tu calcules ton rebond en changeant la vitesse horizontale et la vitesse verticale.
Attention, ne fait pas comme moi la première fois, penses à changer tes valeurs de calculs en nombre décimaux pour éviter les effets bizarres. (Ca marcherait mais la balle aurait une trajectoire de personne ayant abusé de la boisson…)
Tu peux faire exactement la même chose en utilisant gb.collide et faire le calcul s’il y a collision. Je n’ai pas le détail des performance mais pour un Pong elles sont forcément dérisoires. C’est vraiment à toi de choisir ce que tu préfères.

Salut! J’ai un question, Je triez faire mon premiere joeux Pong, Je recherche pour solution avec finir a jouex comme tu sais “game over” chose. Comment a finir la loup?

Hello Monika, you can frite english if you prefere as translators can write some curious things sometimes. For gameover you can use a variable. You can see different examples, but the principe is that you change state when you start game and you change state then game is paused and you change when game is over.
So on your main loop you only call the procedure wich manage this state of the game.
For example if your current state is “running”, when you or computer has reach the miss limit, you change state to “gameover”. You do that you have to do and then you have to think to conditions to change it to “startscreen” or “init” to go to start screen and wait that player launch a new game or init a new game depending of how you want structure your game