Python 用Pygame检测碰撞点
我正在和Pygame做一个游戏。对于这个游戏,我不仅需要能够检测到两个矩形发生碰撞,还需要检测它们之间的碰撞点。我看了文档,但似乎找不到任何答案 这样做可能吗?您可以使用: 在另一个矩形内裁剪矩形Python 用Pygame检测碰撞点,python,pygame,collision-detection,Python,Pygame,Collision Detection,我正在和Pygame做一个游戏。对于这个游戏,我不仅需要能够检测到两个矩形发生碰撞,还需要检测它们之间的碰撞点。我看了文档,但似乎找不到任何答案 这样做可能吗?您可以使用: 在另一个矩形内裁剪矩形 clip(Rect)->Rect 返回一个新矩形,该矩形被裁剪为完全位于参数Rect内。如果两个矩形开始时没有重叠,则返回一个大小为0的矩形 下面是一个例子: import pygame import random class Stuff(pygame.sprite.Sprite): def
clip(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()