Peter a suggéré, et vous avez aussi pensé à elle, qu'il est plus facile de travailler avec Rects au lieu de positions lorsqu'ils traitent avec la détection de collision.
je prendrais un peu plus loin: toujours travailler avec Sprites! Avec Sprites, vous avez accès à toutes ces fonctions de détection de collision très pratiques dans pygame.sprite
Et si jamais vous décidez de déplacer cette image, il est beaucoup plus facile de mettre à jour la position et d'animer. Il contient également la surface de l'image, le tout dans un seul objet. Sans oublier le sprite Groupes!
Sprites ont également un attribut .rect
, de sorte que vous pouvez toujours faire manipulation rect bas niveau si vous voulez avec mysprite.rect
Cela dit, voici comment vous pouvez obtenir un sprite de votre image:
image_one = pygame.sprite.Sprite()
image_one.image = pygame.image.load("image_one.png").convert()
image_one.rect = pygame.Rect((image_x, image_y), image_one.image.get_size())
créer plus sprites pour image_two
, _three
, etc. ou créer une fonction (ou, mieux encore, sous-classe Sprite
), position de réception et nom de fichier comme arguments, de sorte que vous pouvez créer sprites dans une seule ligne comme:
image_two = MySprite(filename, x, y)
que vous pouvez désormais équiper en option les regrouper:
my_images = pygame.sprite.Group(image_one, image_two, image_three)
Le dessin est aussi facile que:
my_images.draw(screen)
Ce sera blit toutes les images à la fois, un chacun dans leur propres positions! Cool hein?
Créons un Sprite « faux » pour le curseur de la souris:
mouse = pygame.sprite.Sprite()
mouse.rect = pygame.Rect(pygame.mouse.get_pos(), (1, 1))
Je l'ai fait un sprite 1x1 il entrer en collision uniquement sur hotspot de la souris. Notez qu'il n'a pas d'attribut .image
(d'où le pseudo "sprite"), mais pygame s'en fout puisque nous n'allons pas le dessiner de toute façon.
Et maintenant la meilleure partie:
imagehit = pygame.sprite.spritecollideany(mouse, my_images)
print imagehit
En une seule ligne vous avez testé une collision contre toutes les images, et vous savez non seulement si la souris est entré en collision avec tout, mais aussi que l'on c'est fait! Il est vraiment payant d'utiliser Sprites;)
Excellente aide! J'ai trouvé un moyen encore plus simple de le résoudre. Lorsque vous "blit" une image à un écran, il renvoie un Rect. Vous affectez simplement une variable égale à ce rect, à savoir: FirstL_Rect = screen.blit (image_one, (185,400)), puis effectuez une détection de collision à l'aide de la fonction "colliderect". Vous pouvez également transformer votre mous einto rect en: mousecoords = pygame.mouse.get_pos() coordinateRect = Rect (mots de passe [0], mousecoords [1], 10, 10) – Parseltongue
Nice one. Je n'avais pas réalisé que le blitting renvoyait un Rect. C'est très utile à savoir. –
@Parseltongue: vous n'avez pas besoin d'utiliser le rect renvoyé par '.blit()': 'image_one' est un * Surface *, et en tant que tel vous pouvez toujours obtenir son rect avec' image_one.get_rect() '. Pas besoin de bliter du tout;) – MestreLion