2017-09-26 3 views
0

Je fais un jeu avec Python et PyGame et je voudrais mettre en place un système de ligne de visée où les ennemis peuvent vous détecter quand vous êtes dans la longueur ou la largeur d'entre eux (ce sont des Rects). Quel est le moyen le plus efficace de vérifier cela? Voilà ce que j'ai si c'est une aide ...Python/PyGame Comment puis-je vérifier si un rect est directement au-dessus ou à côté d'un autre rect dans les quatre directions?

class FOV: 
def view_left_top(ax,ay,bx,by,bh): 
    return ax < bx and ay < (by + bh) and ay > by 

def view_left_bottom(ax,ay,ah,bx,by,bh): 
    return ax < bx and ay < (by + bh) and (ay + ah) > by 

def view_right_top(ax,ay,aw,bx,by,bw,bh): 
    return ax + aw > bx + bw and ay < (by + bh) and ay > by 

def view_right_bottom(ax,ay,aw,ah,bx,by,bw,bh): 
    return ax + aw > bx + bw and ay < (by + bh) and (ay + ah) > by 

def view_top_x(ax,ay,bx,by,bw): 
    return ay < by and ax > bx and ax < (bx + bw) 

def view_top_y(ax,ay,aw,bx,by,bw): 
    return ay < by and (ax + aw) > bx and ax < (bx + bw) 

def view_bottom_x(ax,ay,bx,by,bw): 
    return ay > by and ax > bx and ax < (bx + bw) 

def view_bottom_y(ax,ay,aw,bx,by,bw): 
    return ay > by and (ax + aw) > bx and ax < (bx + bw) 

Répondre

0

Vous pouvez utiliser la méthode pygame.Rect.colliderect (Rect) pour tester si deux rectangles se chevauchent.

import pygame 

class Player: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 
     self.rect = pygame.Rect(x, y, 32, 32) #x, y, width, height 
    def update(self, screen, entities): 
     pygame.draw.rect(screen, (255, 0, 0), self.rect) #Draws red square 

     for e in entities: 
      if self.rect.colliderect(e.rect): 
       is_colliding = True 
       break 
      else: 
       is_colliding = False 
+0

Merci pour la réponse, mais je la détection de collision traitées mais ce que je cherche c'est si le Rect passe devant l'autre Rect. Bien que ce que vous m'avez donné pour la détection de collision soit beaucoup plus efficace que ce que j'avais pour vous. –

0

J'ai fini par gérer au moins nettoyer un peu en combinant certaines de ces fonctions en une seule fonction et un « si » déclaration