2017-01-20 1 views
0

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) enter image description here

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() 

Répondre

1

Je voudrais essayer d'utiliser le scaled collision rect ou l'équivalent cercle:

pygame.sprite.collide_rect_ratio() détection de collision entre deux sprites , en utilisant des envois échelonnés à un ratio.

collide_rect_ratio(ratio) -> collided_callable

Une classe appelable qui vérifie les collisions entre deux sprites , en utilisant une version réduite des rects sprites.

Est créé avec un ratio, l'instance est alors destinée à être passée comme une fonction de rappel en collision aux * fonctions de collision. Un ratio est un nombre à virgule flottante - 1,0 est la même taille, 2,0 est deux fois plus grand, et 0,5 est la moitié de la taille.

Nouveau dans pygame 1.8.1

qui serait donné le 4ème paramètre à votre spritecollide fonction

+0

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

+0

@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