Je suis actuellement en train de faire le jeu Space Invaders en Python avec pygame.Détection de collision de bouclier de barrière pour le jeu de Space Invaders en Python avec pygame
J'ai actuellement 3 barrières de base qui sont tous construits avec des blocs de 1 x 1 pixel (qui 'étendent' le pygame.sprite.Sprite class
). Pour la détection de collision, je vérifie si un missile est entré en collision avec la barrière. Pour l'instant, tout fonctionne, quand je tire et frappe l'une des barrières, le pixel qui a été touché est éliminé. Maintenant, la chose qui me dérange est que dans les Space Invaders d'origine, lorsque le missile du vaisseau (ou un missile extraterrestre d'ailleurs) atteint la barrière, il provoque une «explosion» qui affecte plusieurs pixels de la barrière. Je voudrais implémenter ce dans mon code python/pygame. Comment pourrais-je m'y prendre?
Voici mon code de détection de collision dans ma classe de missiles (ce étend la pygame.sprite.Sprite):
baseBarrier_hit_list = pygame.sprite.spritecollide(self, all_baseBarrier_group, True)
for pixel in baseBarrier_hit_list:
self.kill() # I kill the missile after collision so that the other barrier pixels are unaffected.
break #so that the other pixels in the column are unaffected.
Je pensais que des pixels « artificiellement » en ajoutant « au hasard » à la baseBarrier_hit_list mais je suis incapable d'ajouter des éléments à la baseBarrier_hit_list.
Voici un lien vidéo des envahisseurs de l'espace d'origine pour voir ce que je veux dire: https://www.youtube.com/watch?v=axlx3o0codc
Voici également un lien vers une version python/pygame Space Invaders qui montre qu'un seul pixel est affecté lors de la collision se produit entre le missile et la barrière de base. (Notez que ce n'est pas ma version du jeu). https://www.youtube.com/watch?v=_2yUP3WMDRc
EDIT: (voir commentaire pour l'explication de l'image)
EDIT: La suggestion de TemporalWolf a travaillé. C'est le code que j'ai ajouté à ma fonction. Passer un False à la fonction empêche la destruction des sprites.
shield_hit_list_random = pygame.sprite.spritecollide(self, all_blockShields_group, False, pygame.sprite.collide_rect_ratio(2))
Ensuite, je tue au hasard les quelques sprites du groupe shield_hit_list_random
comme ceci:
for shield in shield_hit_list_random:
pourcentage =randint(0,3)
if pourcentage == 2:
shield.kill()
pygame.sprite.spritecollide (auto, all_blockShields_group, vrai, pygame.sprite.collide_rect_ratio (3)) fonctionne. Je reçois 3 fois les pixels détruits d'un missile. Mais comment randomiser les dégâts du sprite (je veux dire par là que je ne l'ai pas comme un rectangle). Voir les photos. – Eric
@Eric Je ferais deux contrôles de collision -> un interne, ratio 3 où ils meurent tous, et un externe, ratio 5 où seulement un 30% aléatoire meurt ... quelque chose comme ça. – TemporalWolf