当玩家与怪物发生碰撞时,生命并没有减少

时间:2020-02-04 16:49:57

标签: python python-3.x pygame

我现在已经在游戏中添加了生命,仅使用文本时效果很好。但是,由于我将其更改为图像,因此无法正常工作。当玩家与怪物碰撞时,图像(3颗心)正在显示,但没有减少。 更新:现在包括完整的游戏循环!

class Player(object):
    def __init__(self, pos):
        self.rect = pygame.Rect(pos[0], pos[1]+32, 32, 32)
        self.image = playerImg
        self.lives = 3
def life_dis(screen,x,y,lives,img):
    for i in range(lives):
        img_rect = img.get_rect()
        img_rect.x = x+37*i
        img_rect.y = y
        screen.blit(img, img_rect)
def game_loop():
    global walls, players, monsters, finishes, currentLevel
    level = 1 #Starting level
    running = True
    while running:
        clock.tick(60)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                pygame.quit()
                quit()

        screen.fill(blue)        
        level_dis(level)

        #Move the player if an arrow key is pressed
        key = pygame.key.get_pressed()
        if key[pygame.K_LEFT]:
            player.move(-2, 0)
        if key[pygame.K_RIGHT]:
            player.move(2, 0)
        if key[pygame.K_UP]:
            player.move(0, -2)
        if key[pygame.K_DOWN]:
            player.move(0, 2)

        #Move monster
        for monster in monsters:
            monster.move()

        #Moving to next level/win
        for player in players:
            for finish in finishes:
                if player.rect.colliderect(finish.rect):
                    if currentLevel < Highest_level:
                        currentLevel +=1
                        level +=1
                        walls, players, monsters, finishes = load_level(currentLevel)
                    else:
                        win()
                        level = 1
                        #lives = 3

        #Getting caught by the monster
        for player in players:
            for monster in monsters:
                if player.rect.colliderect(monster.rect):
                    load_current_level()
                    player.lives -=1
                    if player.lives == 0:
                        game_over()
                        level = 1
                        #lives = 3

        #Draw the scene
        screen.blit(background, (0,32))
        for wall in walls:
            #pygame.draw.rect(screen, green, wall.rect)
            screen.blit(wall.image, wall.rect)
        for player in players:
            #pygame.draw.rect(screen, orange, player.rect)
            screen.blit(player.image, player.rect)
        for monster in monsters:
            #pygame.draw.rect(screen, bright_green, monster.rect)
            screen.blit(monster.image, monster.rect)
        for finish in finishes:
            #pygame.draw.rect(screen, red, finish.rect)
            screen.blit(finish.image, finish.rect)
        life_dis(screen,500,0,player.lives,lifeImg)
        pygame.display.update()

这是代码中的片段,显示了我如何设置“生活”。我可能还没有在正确的地方声明什么!我也不认为这是一个显示更新的事情,因为一旦怪物给了你3次游戏就应该结束游戏,但事实并非如此。预先感谢您的帮助,如果需要,我可以提供完整的代码。

2 个答案:

答案 0 :(得分:0)

由于您说的是文本形式,所以我怀疑这是屏幕更新问题。如果您的心脏在每个循环未重绘的屏幕上被遮住,即使您通过pygame.diaplsy.update(),心脏的旧图像也将保留在屏幕上。

在将屏幕上的所有内容都重置之前,尝试使用screen.fill()。

答案 1 :(得分:0)

我现在已经解决了!我从播放器类中删除了self.lives = 3,而是改用了全局变量lives = 3。然后,我将player.lives更改为lives,加上在主游戏循环中位于global下的lives,现在一切正常! 感谢您的建议,因为它们确实帮助我解决了这个问题。但是,我仍然想知道为什么它以前不起作用。我是否做错了什么,或者仅仅是由于我的游戏无法正常运行而导致的。再次感谢!

相关问题