Pygame 图像碰撞问题

3

我尝试制作一个塞尔达克隆游戏,现在想知道如何计算碰撞,有人可以告诉我该如何做吗?我已经尝试了colliderct,但它在这里根本无法工作,以下是我的代码:

import pygame
pygame.init()
display = pygame.display.set_mode((800,600))
white=(255,255,255)
black=(0,0,0)
x=50
y=50
width = 40
height = 60
vel = 5
playerimg= pygame.image.load('link1.jpg').convert()
def player(x,y):
    display.blit(playerimg,(x,y))
while True:
    pygame.time.delay(100)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            break
        keys = pygame.key.get_pressed()
    if keys[pygame.K_a]:
        x -= vel
    if keys[pygame.K_d]:
        x += vel
    if keys[pygame.K_w]:
        y -= vel
    if keys[pygame.K_s]:
        y += vel
    display.fill(white)
    player(x,y)
    pygame.draw.rect(display, (255,0,0), hitbox,2)
    pygame.display.update() 
pygame.quit()

你需要更加具体地说明。你想要做什么?你想要检测哪些物体的碰撞?无论如何,可以阅读 pygame.Rect / colliderect()。或者更好的是 pygame.sprite.Spritepygame.sprite.Grouppygame.sprite.spritecollide() - Rabbid76
2个回答

3

您可以使用"点击区域(hitboxes)"来实现这一点,其中一个重要的步骤是了解您的图像尺寸。有了这些信息之后,您可以进行以下操作:

hitbox=(x,y, 102,131) 
hitbox1=pygame.draw.rect(display, (255,0,0), hitbox,2)
if the_thing_it_hits.colliderect(hitbox) == True:
        print('ouch')

将这个代码放入while True:循环中,它应该就可以了。


1
你可以使用 pygame.Rectcolliderect() 进行碰撞测试。例如,你可以定义一个障碍物,并通过 get_rect()playerimg 获取矩形。测试这两个矩形是否发生了碰撞:
while True:
    # [...]

    hitbox = pygame.Rect(100, 100, 100, 100) 
    player_rect = playerimg.get_rect(topleft = (x, y))

    if player_rect.colliderect(hitbox):
        print("hit")

    display.fill(white)
    player(x,y)
    pygame.draw.rect(display, (255,0,0), hitbox,2)
    pygame.display.update() 

无论如何,我建议使用 pygame.sprite.Spritepygame.sprite.Grouppygame.sprite.spritecollide()


此外,你对QUIT事件的实现并不会退出游戏。
while True:
   for event in pygame.event.get():
       if event.type == pygame.QUIT:
           break
因为 break 语句只会中断事件循环,而不是应用程序循环。
可以使用变量代替:
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接