Цикл игры работает несмотря на running = False

Рейтинг: -1Ответов: 1Опубликовано: 19.03.2023

в функции collide_func() имеются 2 хитбара которые появляются в зависимости от количества пойманных астеройдов плеером, после 3 пойманного астеройда running принимает значение False (запринтил и сам в этом убедился), но цикл игры тупо это игнорирует и даже после кучи надписей в консоли false, которые подтверджают значение переменной running продолжает работать.

код:

import random
import pygame
from pygame import mixer
from pygame import transform 
import json
import pygame.freetype

pygame.mixer.init()
pygame.mixer.music.load("space.ogg") 
pygame.mixer.music.play()


def draw_text(screen, text, size, x, y):
    font = pygame.font.SysFont('comicsansms', size)
    text = font.render(text, True, (255, 255, 255))
    text_rect = text.get_rect()
    text_rect.midtop = (x, y)
    screen.blit(text, text_rect)


WIDTH = 800
HEIGHT = 800
FPS = 60

bg = transform.scale(pygame.image.load('galaxy.jpg'), (WIDTH, HEIGHT))
black = (0, 0, 0)

score = 0

lost = 0

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Шутер")
clock = pygame.time.Clock()


class Ship(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = transform.scale(pygame.image.load('rocket.png'),(100, 100))  
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT - 10
        self.x = 0

    def update(self):
        self.speedx = 0
        ks = pygame.key.get_pressed()
        if ks[pygame.K_LEFT]:
            self.x = -15
            self.rect.x += self.x
        if ks[pygame.K_RIGHT]:
            self.x = 15
            self.rect.x += self.x
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0

    def vistrel(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        all_sprites.add(bullet)
        bullets.add(bullet)


class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = transform.scale(pygame.image.load('asteroid.png'),(70, 70))
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, 550)
        self.rect.y = 0
        self.speed_padenia = random.randint(1, 6)
        self.rect.y = random.randint(-100, -40)

    def update(self):
        global lost
        self.rect.y += self.speed_padenia
        if self.rect.top > HEIGHT:
            self.rect.x = random.randint(0, 800)
            self.rect.y = random.randrange(-100, -40)
            self.speed_padenia = random.randint(1, 7)
            lost += 1 


class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)

        self.image = transform.scale(pygame.image.load('bullet_lazer.png'),(30, 30))

        self.rect = self.image.get_rect()
        self.rect.bottom = y
        self.rect.centerx = x
        self.speed_puli = -10

    def update(self):
        self.rect.y += self.speed_puli

        if self.rect.bottom < 0:
            self.kill()


enemies = pygame.sprite.Group()
bullets = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()
hb = transform.scale(pygame.image.load('hp.png'),(200, 20))
hb1 = transform.scale(pygame.image.load('hp1.png'),(200, 20))
hb2  = transform.scale(pygame.image.load('hp2.png'),(200, 20))
player = Ship()
player_g = pygame.sprite.Group()
player_g.add(player)
all_sprites.add(player)
all_sprites.add(bullets)

pygame.sprite.groupcollide(enemies, bullets, True, True)

for i in range(5):
    enemy = Enemy()
    all_sprites.add(enemy)
    enemies.add(enemy)

collide = False

running = True

count_collide = 0


def collide_func():
    global count_collide
    if count_collide == 2:
        if pygame.sprite.groupcollide(enemies, player_g, True, False):
            running = False   
        else:
            screen.blit(hb2, (player.rect.x - 45, player.rect.y - 40))
    if count_collide == 1:
        if pygame.sprite.groupcollide(enemies, player_g, True, False):
            count_collide += 1
            screen.blit(hb2, (player.rect.x - 45, player.rect.y - 40))
        else:
            screen.blit(hb1, (player.rect.x - 45, player.rect.y - 40))
    if count_collide == 0:
        if pygame.sprite.groupcollide(enemies, player_g, True, False):
            count_collide += 1 
            screen.blit(hb1, (player.rect.x - 45, player.rect.y - 40))
        else:
            screen.blit(hb, (player.rect.x - 45, player.rect.y - 40))


while running != False:
    clock.tick(FPS)

    screen.blit(bg, (0, 0))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:

                pygame.mixer.music.load("fire.ogg")
                pygame.mixer.music.play()
                player.vistrel()

    if lost == 3:
        running = False

    collide_func()

    hits = pygame.sprite.groupcollide(enemies, bullets, True, True)
    for hit in hits:
        enemy = Enemy()
        all_sprites.add(enemy)
        enemies.add(enemy)
        score += 1 

    all_sprites.update()

    all_sprites.draw(screen)

    draw_text(screen, str(score), 30, WIDTH / 2, 10)
    draw_text(screen, 'Пропущено: ' + str(lost), 30, 100, 100)

    pygame.display.flip()

pygame.quit()

Ответы

▲ 1

Нету глобалки

def collide_func():
    global running
    global count_collide
    if count_collide == 2:
        if pygame.sprite.groupcollide(enemies, player_g, True, False):
            running = False   
        else:
            screen.blit(hb2, (player.rect.x - 45, player.rect.y - 40))
    if count_collide == 1:
        if pygame.sprite.groupcollide(enemies, player_g, True, False):
            count_collide += 1
            screen.blit(hb2, (player.rect.x - 45, player.rect.y - 40))
        else:
            screen.blit(hb1, (player.rect.x - 45, player.rect.y - 40))
    if count_collide == 0:
        if pygame.sprite.groupcollide(enemies, player_g, True, False):
            count_collide += 1 
            screen.blit(hb, (player.rect.x - 45, player.rect.y - 40))