Bonjour a toutes et a tous ,
J'ai une classe 'Spark' qui produit des etincelles , j'aurai voulu gerer les collisions entre ces étincelles et mon vaisseau héro , un peu comme je l'ai fait pour les lasers de mon vaisseau héro vers mon premier groupe d'aliens :
Voici ma classe Sparks :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 for alien in aliens: # aliens : 1 er groupe d'aliens # gestion collision du laser héro vers 1er groupe aliens if alien.visible: for laser in lasers: # lasers : liste lasers héros if laser.rect.x + laser.laser_w > alien.rect.x and laser.rect.x + laser.laser_w < alien.rect.x + \ alien.hitbox[2]: if laser.rect.y + laser.laser_h > alien.rect.y and laser.rect.y + laser.laser_h < alien.rect.y + \ alien.hitbox[3]: alien.hit() lasers.pop(lasers.index(laser))
sparks = [],
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 class Spark(): def __init__(self, loc, angle, speed, color, scale=1): self.loc = loc self.angle = angle self.speed = speed self.scale = scale self.color = color self.alive = True def calculate_movement(self, dt): return [math.cos(self.angle) * self.speed * dt, math.sin(self.angle) * self.speed * dt] def move(self, dt): movement = self.calculate_movement(dt) self.loc[0] += movement[0] self.loc[1] += movement[1] self.speed -= 0.1 if self.speed <= 0: self.alive = False def draw(self, surf): if self.alive: points = [ [self.loc[0] + math.cos(self.angle) * self.speed * self.scale, self.loc[1] + math.sin(self.angle) * self.speed * self.scale], [self.loc[0] + math.cos(self.angle + math.pi / 2) * self.speed * self.scale * 0.3, self.loc[1] + math.sin(self.angle + math.pi / 2) * self.speed * self.scale * 0.3], [self.loc[0] - math.cos(self.angle) * self.speed * self.scale * 3.5, self.loc[1] - math.sin(self.angle) * self.speed * self.scale * 3.5], [self.loc[0] + math.cos(self.angle - math.pi / 2) * self.speed * self.scale * 0.3, self.loc[1] - math.sin(self.angle + math.pi / 2) * self.speed * self.scale * 0.3], ] pygame.draw.polygon(surf, self.color, points)
Dans ma boucle :
Avec ce genre de forme produite par ma classe 'Spark' (des polygones) comment pourrai je gérer mes collisions , pas avec un rect du coup !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 for v in enemyspaceships: if v.health >= 1: sparks.append( Spark([v.rect.x+100, v.rect.y+100], math.radians(random.randint(0, 360)), random.randint(3, 6), (240, 195, 0), 2)) v.animate('paon') v.draw(win) else: explosesound.play() explosesound.set_volume(0.5) explosion = Explose(v.rect.x, v.rect.y, 'explose2', 300, 300) explosion_group.add(explosion) enemyspaceships.pop() spaceshipkills += 1 for i, spark in sorted(enumerate(sparks), reverse=True): # cette formule de tri permet d'avoir un indice devant chaque instance pour ensuite # supprimer les instance de la liste sparks avec pop() spark.move(1) spark.draw(win) if not spark.alive: sparks.pop(i)
D'avance je vous remercie
Partager