Hello !
Je suis en train de rédiger un tuto sur Pygame, et le TD est de faire un Pong (choix perso hein )
Tout est codé, et je suis passé aux tests. Tout est presque correct, sauf … le déplacement de la balle
Les collisions sont correctes, oui, mais y a un truc problématique :
comme ma balle décide de se déplacer après une collision
petit schéma pour expliquer :
et le code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import pygame from pygame.locals import * from constantes import * from math import cos, acos, sqrt class Balle: def __init__(self, ecran: pygame.Surface): self.ecran = ecran self.vect_dir = [-VITESSE_BALLE, VITESSE_BALLE] self.image = pygame.image.load("images/balle.png").convert_alpha() self.b_large = self.image.get_width() # la taille de notre balle en x self.b_haut = self.image.get_height() # et la taille en y self.pos = [(self.ecran.get_width() - self.b_large) // 2, (self.ecran.get_height() - self.b_haut) // 2] def move(self, raquette): tmp = self.pos[0] + self.vect_dir[0] * VITESSE_BALLE, self.pos[1] + self.vect_dir[1] * VITESSE_BALLE if raquette.collide_with_me(tmp, (self.b_large, self.b_haut)) or self.pos[0] <= 0 or self.pos[1] <= 0 \ or self.pos[0] + self.b_large >= self.ecran.get_width() or self.pos[1] + self.b_haut >= self.ecran.get_height(): # on a collidé soit avec la raquette, soit avec un des 4 murs :) hypothenuse = sqrt(pow(abs(self.pos[1] - tmp[1]), 2) + pow(abs(self.pos[0] - tmp[0]), 2)) # calcul vectoriel, vu en seconde # juste au cas où ;) : hypothenuse = hypothenuse if hypothenuse > 0 else 1 angle = acos((abs(self.pos[1] - tmp[1]) / hypothenuse) * (3.1415926535897 / 180)) # on met bien l'angle en radians ! beta = 0 if (self.pos[0] <= 0 or self.pos[0] + self.b_large >= self.ecran.get_width() or raquette.collide_with_me(tmp, (self.b_large, self.b_haut))) else 90 angle = -angle + 2 * beta # inversion de l'angle avec l'ajout de 2*beta const = -cos(angle) if angle < 0 else cos(angle) self.vect_dir[0] *= const self.vect_dir[1] *= const # dans tous les cas on déplace la balle ! self.pos[0] += self.vect_dir[0] self.pos[1] += self.vect_dir[1] def render(self): self.ecran.blit(self.image, tuple(self.pos)) |
merci de votre aide !
+0
-0