Pygame Hitboxs闪烁

问题描述

我正在尝试使用pygame制作游戏,我几乎完成了,但是我想使正在绘制在墙上的对象的框不闪烁,这些红色框在整个游戏中都会闪烁,我不希望它们最后,我要在if条件下调用playercollide函数在这里,每当我创建新的碰撞器时,我每次都必须在if条件中添加函数,我想要的是collider对象自动调用函数,而无需我在对撞机对象的每个实例的if语句中调用它。请指导我如何操作。

def redrawGameWindow():
    win.blit(bg,(-50,-200))
    man.draw(win)
    #man.drawhitBox(win)
    pygame.display.update()


#mainloop

man = player(200,410,64,64)
run = True
while run:
    collider1 = wall(500,400,200,True)
    collider2 = wall(200,100,50,False)
    collider3 = wall(700,False)
    collider4 = wall(900,True)
    clock.tick(60)
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()
    x,y = man.x,man.y

    if keys[pygame.K_a] and man.x > man.vel:
        x -= man.vel
        man.left = True
        man.right = False
    elif keys[pygame.K_d] and man.x < scrWidth - man.width - man.vel:
        x += man.vel
        man.right = True
        man.left = False
    elif keys[pygame.K_w] and man.y > man.vel:
        y -= man.vel
        man.left = False
        man.right = False
    elif keys[pygame.K_s] and man.y < scrHeight - man.height - man.vel:
        y+= man.vel
        man.left = False
        man.right = False
    else:
        man.right = False
        man.left = False
        man.walkCount = 0

    man.hitBox(15,31,17)
    player_rect = pygame.Rect(x,y,55)
    if collider2.playerCollide(player_rect) == False and collider1.playerCollide(player_rect) == False and collider3.playerCollide(player_rect) == False and collider4.playerCollide(player_rect) == False:
        man.x,man.y = x,y
    redrawGameWindow()
pygame.quit()

解决方法

此问题是由于多次调用pygame.display.update()引起的。从类pygame.display.update()中删除对wall的调用,并在pygame.display.update()的末尾只做1个redrawGameWindow
但是,必须在绘制框之前绘制背景,否则背景将覆盖框:

def redrawGameWindow():
    # win.blit(bg,(-50,-200)) <--- DELETE
    man.draw(win)
    #man.drawhitbox(win)
    pygame.display.update()
run = True
while run:
    win.blit(bg,-200)) # <--- ADD

    collider1 = wall(500,400,200,True)
    collider2 = wall(200,100,50,False)
    collider3 = wall(700,False)
    collider4 = wall(900,True)

    # [...]

    redrawGameWindow()

通过创建对撞机列表来简化代码:

colliders = [
   wall(500,True),wall(200,False),wall(700,wall(900,True)] 
player_rect = pygame.Rect(x,y,55)
if not any(c.playerCollide(player_rect) for c in colliders):
    man.x,man.y = x,y