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
Répondre
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()
Merci beaucoup pour la réponse! Cela a beaucoup aidé !! Je suis nouveau sur pygame et j'ai parfois du mal à coder. Merci encore. –
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
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
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