Вам не нужны темы вообще.Не усложняйте свою жизнь.
Вам просто нужно по-другому подумать о том, как работает ваша игра.Это работает в цикле;в вашем случае он работает на скорости 60 кадров в секунду.
Так что если вы хотите что-то делать со временем, у вас есть разные варианты:
1) Создайте переменную, увеличивайте ее каждый кадр, и как только она достигнет 60, вы знаете, что прошла 1 секунда (просто, но не надежно, так как вы зависите от постоянной частоты кадров)
2) Используйте события.В pygame вы можете создавать пользовательские события, которые вы можете запускать вручную или периодически, и обрабатывать их в своем основном цикле, как встроенные в Pygame события (работает хорошо для простых случаев использования, но количество событий, которые вы можете создать, ограничено)
3) Создайте переменную и сохраните в ней отметку времени.Временной отметкой может быть системное время или что-то еще, например, количество тактов с момента запуска вашей игры (например, с помощью pygame.time.get_ticks
в pygame. Затем каждый кадр сравнивает его с текущим системным временем или тактами, чтобы вычислить, сколько времени прошло *).1012 *
Я немного обновил ваш код. Обратите внимание, как я разделил различные проблемы на разные части кода:
- Класс игрока заботится только о себе (позиция, движение, hp), а не как весь экран управляется
- Класс GUI заботится только о рисовании графического интерфейса
- Основному циклу не важно, что находится на экране
Я просто уменьшаю hp чуть-чуть каждый кадр (в основном это вариант варианта 1, который я перечислил выше), это достаточно хороший подход к вашей проблеме.
#-*- coding-utf8 -*-
import pygame
import threading
import time
import os
os.environ['SDL_VIDEO_CENTERED'] = '1'
pygame.init()
SIZE = (1200, 600)
screen = pygame.display.set_mode(SIZE)
clock = pygame.time.Clock()
class GUI(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((1200, 600))
self.image.set_colorkey((12,34,56))
self.image.fill((12,34,56))
self.rect = self.image.get_rect()
self.player = None
def update(self):
self.image.fill((12,34,56))
if self.player:
pygame.draw.rect(self.image, (50, 0, 0), pygame.Rect(10, 10, self.player.hp * 3, 10))
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((50, 100))
self.image.fill((255,255,0))
self.rect = self.image.get_rect(topleft=(100, 100))
self.hp = 100
def update(self):
pressed = pygame.key.get_pressed()
if pressed[pygame.K_w]: self.rect.move_ip( 0, -1)
if pressed[pygame.K_s]: self.rect.move_ip( 0, 1)
if pressed[pygame.K_a]: self.rect.move_ip(-1, 0)
if pressed[pygame.K_d]: self.rect.move_ip( 1, 0)
self.hp -= 0.05
p1 = Player()
gui = GUI()
gui.player = p1
sprites = pygame.sprite.Group(p1, gui)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
exit()
screen.fill((0,0,0))
sprites.update()
sprites.draw(screen)
pygame.display.flip()
clock.tick(60)