Обнаружение точки столкновения с Pygame

Я делаю игру с Pygame. Для этой игры мне нужно уметь определять не только столкновение двух прямоугольников, но и точку столкновения между ними. Я просмотрел документацию, но, похоже, не нашел ответов.

Возможно ли что-то подобное?

См. также:  Сельдерей | Ошибка Flask: ожидается объект, подобный байтам, найден AsyncResult
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Ryan Fredez

    Вы можете использовать Rect.clip:

    обрезает прямоугольник внутри другого

    clip(Rect) -> Rect

    Возвращает новый прямоугольник, который обрезается полностью внутри аргумента Rect. Если два прямоугольника изначально не перекрываются, возвращается Rect с размером 0.

    Вот пример:

    import pygame
    import random
    
    class Stuff(pygame.sprite.Sprite):
        def __init__(self, pos, color, *args):
            super().__init__(*args)
            self.image = pygame.Surface((30, 30))
            self.image.fill(color)
            self.rect = self.image.get_rect(center=pos)
            self.pos = pygame.Vector2(pos)
    
        def update(self):
            self.rect.center = self.pos
    
    def main():
        pygame.init()
        screen = pygame.display.set_mode((500, 500))
        screen_rect = screen.get_rect()
        font = pygame.font.SysFont(None, 26)
        clock = pygame.time.Clock()
        sprites = pygame.sprite.Group()
        blocks = pygame.sprite.Group()
    
        movement = {
            pygame.K_UP:    ( 0, -1),
            pygame.K_DOWN:  ( 0,  1),
            pygame.K_LEFT:  (-1,  0),
            pygame.K_RIGHT: ( 1,  0)
        }
    
        for _ in range(15):
            x, y = random.randint(0, 500), random.randint(0, 500)
            color = random.choice(['green', 'yellow'])
            Stuff((x, y), pygame.Color(color), sprites, blocks)
    
        player = Stuff(screen_rect.center, pygame.Color('dodgerblue'))
        sprites.add(player)
    
        dt = 0
        while True:
            events = pygame.event.get()
            for e in events:
                if e.type == pygame.QUIT:
                    return
    
            pressed = pygame.key.get_pressed()
            move = pygame.Vector2()
            for dir in (movement[key] for key in movement if pressed[key]):
                move += dir
            if move.length() > 0: move.normalize_ip()
            player.pos += move * dt/5
    
            sprites.update()
            screen.fill(pygame.Color('black'))
            sprites.draw(screen)
    
            for block in pygame.sprite.spritecollide(player, blocks, False):
                clip = player.rect.clip(block.rect)
                pygame.draw.rect(screen, pygame.Color('red'), clip)
                hits = [edge for edge in ['bottom', 'top', 'left', 'right'] if getattr(clip, edge) == getattr(player.rect, edge)]
                text = font.render(f'Collision at {", ".join(hits)}', True, pygame.Color('white'))
                screen.blit(text, (20, 20))
    
            pygame.display.flip()
            dt = clock.tick(60)
    
    if __name__ == '__main__':
        main()
    

    введите здесь описание изображения

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: