为什么我的 pygame 代码中的生命计数没有下降?

Why isn't the count for lives going down my pygame code?

所以我正在做一个项目,我必须制作一个游戏,给用户三个生命,每次 beamrect 的矩形与玩家的碰撞时,它会减去一个生命并将它们放在原来的位置。当 lives == 0 时:会出现死亡画面。但是由于某种原因,即使我确保每次玩家矩形(是 zonicrect)和光束矩形发生碰撞时,它都会从 life 变量中减去 1,但死亡屏幕并没有显示。

# Your header should go here, each comment should be initialed -DK
import pygame, sys
import os
# https://youtu.be/jO6qQDNa2UY
pygame.init()
FPS = 60
# Useful Variables
  # Size

size = height, width = 900, 500
zonhw = zheight, zwidth = 70, 70
scale2 = height2, width2 = 600, 300
lscale = lheight, lwidth = 80, 80
beamsz = bheight, bwidth = 50,25
platz = pheight, pwidth = 10, 70
  # RGB 
white = (255, 255, 255)
black = (0,0,0)
blue = (0, 0, 128)
green = (0, 255, 0)
brown = (165,42,42)
  # Speed
VEL = 5
beamspeed = 3
  # Position
laserpos = posx, posy = 500,250
  #other
i = 0
life = 3
score = 0


# graphics
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Zonic bootleg")
font = pygame.font.Font('freesansbold.ttf', 32)
zonic = pygame.image.load(os.path.join("image","zonic.gif"))
zonic = pygame.transform.scale(zonic, zonhw)
bg =  pygame.image.load(os.path.join("image","sonic-back.jpg"))
bg = pygame.transform.scale(bg, size)
gg = pygame.image.load(os.path.join("image","gg.jpg"))
gg= pygame.transform.scale(gg, size)
lazerz = pygame.image.load(os.path.join("image","Lazerz.gif"))
lazerz = pygame.transform.scale(lazerz, lscale)
beam = pygame.image.load(os.path.join("image","laserbeam.jpg"))
beam = pygame.transform.scale(beam, beamsz)
lives = pygame.image.load(os.path.join("image","health.png"))
lives = pygame.transform.scale(lives,(40,40))
# zoncz = pygame.image.load(os.path.join("image","zoncz.png"))
# zoncz = pygame.transform.scale(zoncz, scale2)




#coalitions 
def collider(life,beamrect,zonicrect,lazerect): 
  beamrect.x -= beamspeed
  if zonicrect.colliderect(beamrect):
    beamrect.x = lazerect.x+21
    zonicrect.x = 0
    
  if beamrect.x <-60:
    #screen.blit(beam, (posx, posy))
    beamrect.x += 550
  
def updating(score, beamrect):
  if beamrect.x == 0:
    score += 1



#Death
def death():
  while life <= 0:
    death = font.render("Death", True, white)
    screen.fill(black)
    screen.blit(death,(250, 250))
  
# zonic movement
def KWS(keyvar, zonicrect,flip):
  
  if keyvar[pygame.K_RIGHT]:  # right
    zonicrect.x += VEL
    flip = False
  if zonicrect.x > 500:
    zonicrect.x -= VEL
    
  if keyvar[pygame.K_LEFT] and zonicrect.x + VEL > 0:  # left
    zonicrect.x -= VEL
    flip = True
  
def flipx(flip,zonicrect):
  if flip:
    screen.blit(pygame.transform.flip(zonic,True,False),(zonicrect.x,zonicrect.y))
  if flip == False:
      screen.blit(pygame.transform.flip(zonic,False,False),(zonicrect.x,zonicrect.y))

  

    
# text = font.render('Lives: {0}'.format(life), True, green, blue)
def heart(beamrect,zonicrect,lazerect):
    x = 1
    i = -33
    while life >= x:
      x +=1 
      i+=32
      screen.blit(lives, (2+i,0))

# draw
def drawingfunc(zonicrect,lazerect, beamrect,flip, zonczrect):
    #screen.blit(death,(0,0))
    screen.blit(bg, (0, 0))
    heart(beamrect,zonicrect,lazerect)
    flipx(flip,zonicrect)
    #screen.blit(zonic,(zonicrect.x, zonicrect.y))
    screen.blit(beam, (beamrect.x, beamrect.y+15))
    screen.blit(lazerz, (lazerect.x+21,lazerect.y))
    # score = font.render('Score: ') 
    # screen.blit(zonic, (zonczrect.x, zonczrect.y))
    sore = font.render("Score: {0}".format(score), True, black, white)
    screen.blit(sore, (30, 70))
    pygame.draw.rect(screen, brown, pygame.Rect(200, 200, 100, 50))
    pygame.display.update()


   
          


# mainloop and refresh rate
def main():
    jump = False
    jumpCount = 0
    jumpMax = 15
    flip = False
    zonicrect = pygame.Rect(10, 250, zheight, zwidth)
    lazerect = pygame.Rect(posx, posy, lheight, lwidth)
    beamrect = pygame.Rect(posx, posy, bheight, bwidth)
    zonczrect = pygame.Rect(50, 25, height2, width2)
    
    # (30,0,32,32)
    # livesrect = pygame.Rect(0,0,10,10)
    
    
    
      
    
    clock = pygame.time.Clock()
    run = True
    while run:
        clock.tick(FPS)
         
        
        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
            if event.type == pygame.KEYDOWN:
              if not jump and event.key == pygame.K_SPACE:
                  jump = True
                  jumpCount = jumpMax 
  
        
        death()
        collider(life,beamrect,zonicrect,lazerect)
        keyspressed = pygame.key.get_pressed()
        KWS(keyspressed, zonicrect,flip)
        updating(score, beamrect)        
        drawingfunc(zonicrect,lazerect, beamrect,flip, zonczrect)
        flipx(flip, zonicrect)
        
        if jump:
            zonicrect.y -= jumpCount
            if jumpCount > -jumpMax:                                                              
              jumpCount -= 1                                                              
            else:
              jump = False

    pygame.quit()                                                              
                                                              

# calling function NOTE: needs to always be at the end of file
if __name__ == "__main__":
  main()

解决方案

在您的 death 函数中,您忘记了在循环底部调用 pygame.display.update()。这就是为什么即使 life 小于或等于 0 也看不到死亡屏幕的原因。此外,您需要在 death 函数中添加一个事件循环,以便 window 在循环为 运行.

时继续响应事件

所以改变这个:

def death():
    while life <= 0:
        death = font.render("Death", True, white)
        screen.fill(black)
        screen.blit(death, (250, 250))

为此:

def death():
    while life <= 0:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit(0)

        death = font.render("Death", True, white)
        screen.fill(black)
        screen.blit(death, (250, 250))
        pygame.display.update()

完整修改代码

# Your header should go here, each comment should be initialed -DK
import pygame, sys
import os

# https://youtu.be/jO6qQDNa2UY
pygame.init()
FPS = 60
# Useful Variables
# Size

size = height, width = 900, 500
zonhw = zheight, zwidth = 70, 70
scale2 = height2, width2 = 600, 300
lscale = lheight, lwidth = 80, 80
beamsz = bheight, bwidth = 50, 25
platz = pheight, pwidth = 10, 70
# RGB
white = (255, 255, 255)
black = (0, 0, 0)
blue = (0, 0, 128)
green = (0, 255, 0)
brown = (165, 42, 42)
# Speed
VEL = 5
beamspeed = 3
# Position
laserpos = posx, posy = 500, 250
# other
i = 0
life = 3
score = 0

# graphics
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Zonic bootleg")
font = pygame.font.Font('freesansbold.ttf', 32)
zonic = pygame.image.load(os.path.join("image", "zonic.gif"))
zonic = pygame.transform.scale(zonic, zonhw)
bg = pygame.image.load(os.path.join("image", "sonic-back.jpg"))
bg = pygame.transform.scale(bg, size)
gg = pygame.image.load(os.path.join("image", "gg.jpg"))
gg = pygame.transform.scale(gg, size)
lazerz = pygame.image.load(os.path.join("image", "Lazerz.gif"))
lazerz = pygame.transform.scale(lazerz, lscale)
beam = pygame.image.load(os.path.join("image", "laserbeam.jpg"))
beam = pygame.transform.scale(beam, beamsz)
lives = pygame.image.load(os.path.join("image", "health.png"))
lives = pygame.transform.scale(lives, (40, 40))


# zoncz = pygame.image.load(os.path.join("image","zoncz.png"))
# zoncz = pygame.transform.scale(zoncz, scale2)


# coalitions
def collider(life, beamrect, zonicrect, lazerect):
    beamrect.x -= beamspeed
    if zonicrect.colliderect(beamrect):
        beamrect.x = lazerect.x + 21
        zonicrect.x = 0

    if beamrect.x < -60:
        # screen.blit(beam, (posx, posy))
        beamrect.x += 550


def updating(score, beamrect):
    if beamrect.x == 0:
        score += 1


# Death
def death():
    while life <= 0:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit(0)

        death = font.render("Death", True, white)
        screen.fill(black)
        screen.blit(death, (250, 250))
        pygame.display.update()


# zonic movement
def KWS(keyvar, zonicrect, flip):
    if keyvar[pygame.K_RIGHT]:  # right
        zonicrect.x += VEL
        flip = False
    if zonicrect.x > 500:
        zonicrect.x -= VEL

    if keyvar[pygame.K_LEFT] and zonicrect.x + VEL > 0:  # left
        zonicrect.x -= VEL
        flip = True


def flipx(flip, zonicrect):
    if flip:
        screen.blit(pygame.transform.flip(zonic, True, False), (zonicrect.x, zonicrect.y))
    if flip == False:
        screen.blit(pygame.transform.flip(zonic, False, False), (zonicrect.x, zonicrect.y))


# text = font.render('Lives: {0}'.format(life), True, green, blue)
def heart(beamrect, zonicrect, lazerect):
    x = 1
    i = -33
    while life >= x:
        x += 1
        i += 32
        screen.blit(lives, (2 + i, 0))


# draw
def drawingfunc(zonicrect, lazerect, beamrect, flip, zonczrect):
    # screen.blit(death,(0,0))
    screen.blit(bg, (0, 0))
    heart(beamrect, zonicrect, lazerect)
    flipx(flip, zonicrect)
    # screen.blit(zonic,(zonicrect.x, zonicrect.y))
    screen.blit(beam, (beamrect.x, beamrect.y + 15))
    screen.blit(lazerz, (lazerect.x + 21, lazerect.y))
    # score = font.render('Score: ') 
    # screen.blit(zonic, (zonczrect.x, zonczrect.y))
    sore = font.render("Score: {0}".format(score), True, black, white)
    screen.blit(sore, (30, 70))
    pygame.draw.rect(screen, brown, pygame.Rect(200, 200, 100, 50))
    pygame.display.update()


# mainloop and refresh rate
def main():
    jump = False
    jumpCount = 0
    jumpMax = 15
    flip = False
    zonicrect = pygame.Rect(10, 250, zheight, zwidth)
    lazerect = pygame.Rect(posx, posy, lheight, lwidth)
    beamrect = pygame.Rect(posx, posy, bheight, bwidth)
    zonczrect = pygame.Rect(50, 25, height2, width2)

    # (30,0,32,32)
    # livesrect = pygame.Rect(0,0,10,10)

    clock = pygame.time.Clock()
    run = True
    while run:
        clock.tick(FPS)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
            if event.type == pygame.KEYDOWN:
                if not jump and event.key == pygame.K_SPACE:
                    jump = True
                    jumpCount = jumpMax

        death()
        collider(life, beamrect, zonicrect, lazerect)
        keyspressed = pygame.key.get_pressed()
        KWS(keyspressed, zonicrect, flip)
        updating(score, beamrect)
        drawingfunc(zonicrect, lazerect, beamrect, flip, zonczrect)
        flipx(flip, zonicrect)

        if jump:
            zonicrect.y -= jumpCount
            if jumpCount > -jumpMax:
                jumpCount -= 1
            else:
                jump = False

    pygame.quit()
    sys.exit(0)


# calling function NOTE: needs to always be at the end of file
if __name__ == "__main__":
    main()