Цикл игры работает несмотря на running = False
в функции 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()
Источник: Stack Overflow на русском