Gestion collision pour polygone (pygame)
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 :
Code:
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)) |
Voici ma classe Sparks :
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
| 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) |
sparks = [],
Dans ma boucle :
Code:
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) |
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 !
D'avance je vous remercie