2017-07-11 2 views
-1

Je travaille actuellement avec pygame, et je veux créer plusieurs sprites et vérifier au moins deux collisions. J'ai eu l 'idée d' avoir deux boucles, mais ça a fini par être vraiment compliqué. Y a-t-il un autre moyen de l'essayer?Vérifier les collisions multiples sur les sprites dans pygame

+0

Bienvenue dans StackOverflow. Veuillez lire et suivre les consignes de publication dans la documentation d'aide. [sur le sujet] (http://stackoverflow.com/help/on-topic) et [comment demander] (http://stackoverflow.com/help/how-to-ask) s'appliquent ici. StackOverflow n'est pas un service de conception, de codage, de recherche ou de tutorat. – Prune

+0

Voir également les détails sur la publication d'un problème de codage: [Exemple minimal, complet, vérifiable] (http://stackoverflow.com/help/mcve). Nous ne pouvons pas vous aider efficacement tant que vous n'afficherez pas votre code MCVE et que vous ne décrivez pas précisément le problème. Nous devrions pouvoir coller votre code posté dans un fichier texte et reproduire le problème que vous avez décrit. – Prune

+0

Quel est votre jeu? Gérez simplement la position de vos objets et comparez-les. Si elles sont au même point, une collision apparaît. Vous pouvez également utiliser les couleurs pour vérifier la collision comme dans Unity. – WaLinke

Répondre

0

Utilisez pygame.sprite.spritecollide pour obtenir la liste des images-objets qui entrent en collision avec le lecteur, puis faites une boucle sur cette liste pour faire quelque chose avec les images-objets en collision.

Il existe également groupcollide que vous pouvez utiliser pour détecter les collisions entre deux groupes d'images-objets. Il renvoie un dictionnaire avec des sprites du groupe 1 en tant que clés et les sprites en collision du groupe 2 en tant que valeurs.

import sys 
import pygame as pg 
from pygame.math import Vector2 


class Player(pg.sprite.Sprite): 

    def __init__(self, pos, *groups): 
     super().__init__(*groups) 
     self.image = pg.Surface((120, 60)) 
     self.image.fill(pg.Color('dodgerblue')) 
     self.rect = self.image.get_rect(center=pos) 


class Enemy(pg.sprite.Sprite): 

    def __init__(self, pos, *groups): 
     super().__init__(*groups) 
     self.image = pg.Surface((120, 60)) 
     self.image.fill(pg.Color('sienna1')) 
     self.rect = self.image.get_rect(center=pos) 


def main(): 
    screen = pg.display.set_mode((640, 480)) 
    clock = pg.time.Clock() 
    all_sprites = pg.sprite.Group() 
    enemy_group = pg.sprite.Group(Enemy((200, 250)), Enemy((350, 250))) 
    all_sprites.add(enemy_group) 
    player = Player((100, 300), all_sprites) 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      elif event.type == pg.MOUSEMOTION: 
       player.rect.center = event.pos 

     all_sprites.update() 
     # Check which enemies collided with the player. 
     # spritecollide returns a list of the collided sprites. 
     collided_enemies = pg.sprite.spritecollide(player, enemy_group, False) 

     screen.fill((30, 30, 30)) 
     all_sprites.draw(screen) 
     for enemy in collided_enemies: 
      # Draw rects around the collided enemies. 
      pg.draw.rect(screen, (0, 190, 120), enemy.rect, 4) 

     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    pg.init() 
    main() 
    pg.quit() 
    sys.exit() 
+0

Merci beaucoup pour la réponse! Cela a beaucoup aidé !! Je suis nouveau sur pygame et j'ai parfois du mal à coder. Merci encore. –