使用 Pygame 检测碰撞点

2024-03-03

我正在用 Pygame 制作游戏。对于这个游戏,我不仅需要能够检测到两个矩形发生碰撞,还需要能够检测到它们之间的碰撞点。我查看了文档,但似乎找不到任何答案。

这样的事情可能吗?


您可以使用Rect.clip https://www.pygame.org/docs/ref/rect.html#pygame.Rect.clip:

在另一个矩形内裁剪一个矩形

clip(Rect) -> Rect

返回一个新的矩形,该矩形被裁剪为完全位于参数 Rect 内。如果两个矩形一开始就不重叠,则返回大小为 0 的 Rect。

这是一个例子:

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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Pygame 检测碰撞点 的相关文章

随机推荐