为什么我的 pygame 碰撞检测不起作用?

Why does my pygame collision detections not work?

我对 Python 和 Pygame 比较陌生。我正在制作一个圆圈出现在 window 上随机位置的游戏,您必须触摸它才能获得分数。我已将其编程为在您触摸圆圈时传送到另一个随机位置。问题是当我尝试检测圆圈和玩家之间的碰撞时,它基本上会不停地传送圆圈。我还制作了一个打印功能,当它检测到碰撞时打印 hi 并且它还不停地打印。我通常会尝试找出问题所在,但我真的看不出我做错了什么,我将不胜感激所有给予的帮助。

enter code here

import pygame
import random 
vel = 2 
pygame.init()
pygame.font.init()
fps = 60 
win = pygame.display.set_mode((900, 500), pygame.RESIZABLE) 

pygame.display.set_caption("Test")
#icon = pygame.image.load('icon.png')
#pygame.display.set_icon(icon)
background = pygame.image.load('Background.png') 
ghost = pygame.image.load("ghost.png") 
ghostrect = ghost.get_rect() 
circle = pygame.image.load("circle.png") 
circlerect = circle.get_rect()

def main():
    a = random.randint(0, 900)
    b = random.randint(0, 500)
    clock = pygame.time.Clock()
    run = True

    while run:
        keys_pressed = pygame.key.get_pressed()
        if keys_pressed[pygame.K_d] and ghostrect.x + 55 <= 900:
            ghostrect.x += vel
        if keys_pressed[pygame.K_a] and ghostrect.x + 5 >= 0:
            ghostrect.x -= vel
        if keys_pressed[pygame.K_s] and ghostrect.y + 63 <= 500:
            ghostrect.y += vel
        if keys_pressed[pygame.K_w] and ghostrect.y >= 0:
            ghostrect.y -= vel
        if circlerect.colliderect(ghostrect):
            a = random.randint(0, 900)
            b = random.randint(0, 500)

        win.blit(background, (0, 0))
        win.blit(circle, (a, b))
        win.blit(ghost, (ghostrect.x + 500, ghostrect.y + 210))
        pygame.display.update()
        clock.tick(fps)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

if __name__ == "__main__":
    main()

您还没有设置 ghostrect 的值。默认情况下,pygame.Rect对象的位置值为0。你也没有设置circlerect的值,所以它的位置也是在(0, 0)。

因此,现在 if circlerect.colliderect(ghostrect): 将永远 return 为真。 您需要做的就是给他们位置值来解决问题。

ghostrect一些位置。我选择了 (100, 100),完全由你决定。

 ghostrect = ghost.get_rect()
 #give the rect some position value
 ghostrect.x = 100
 ghostrect.y = 100

circlerect 随机位置而不是分配给 ab.

def main():
    #remove them
    #a = random.randint(0, 900) #this 
    #b = random.randint(0, 500) #and this
    circlerect.x = random.randint(0, 900)#add this
    circlerect.y = random.randint(0, 500)#and add this
    #...

    while run:
        #...
        if circlerect.colliderect(ghostrect):
            #remove this
            #a = random.randint(0, 900) #this 
            #b = random.randint(0, 500) #and this
    
            circlerect.x = random.randint(0, 900)#add this
            circlerect.y = random.randint(0, 500)#and add this

然后在这个位置画圆而不是ab

win.blit(circle, (circlerect.x, circlerect.y))