Вы можете использовать pygame.time.get_ticks()
, чтобы использовать время для управления продолжительностью отображения кадра
start_time = pygame.time.get_ticks()
while running:
current_time = pygame.time.get_ticks()
if current_time - start_time >= expected_delay_in_ms:
change_frame_in_animation()
start_time = current_time
Я создаю start_time
до while running
, но вы должны создать его при запуске анимации.
Вы также можете использовать pygame.time.set_timer()
для создания собственного события каждые несколько миллисекунд.И затем вы можете использовать это событие, чтобы изменить кадр в анимации
pygame.time.set_timer(pygame.USEREVENT+1, expected_delay_in_ms)
while running:
for event in pygame.event.get():
if event.type = pygame.USEREVENT+1:
change_frame_in_animation()
Я использую pygame.time.set_timer()
до while running
, но вы должны использовать его при запуске анимации.
РЕДАКТИРОВАТЬ: Используя ваш новый код, это может быть (но я не могу проверить это)
В self.__init__
Я определяю
self.frame_delay = 200 # 200 milliseconds
Когда игрок умретЯ установил self.start_delay = 0
- он должен отображать первый кадр без задержки.
def hit(self):
if self.health > 0:
self.health -= 1
else:
self.explosions = True
self.start_delay = 0 # or pygame.time.get_ticks()
В draw
Я использую self.start_delay
для сравнения с current_time
и self.frame_delay
if self.explosions == True:
current_time = pygame.time.get_ticks()
if current_time - self.start_delay >= self.frame_delay:
self.start_delay = current_time
print("I exploded")
self.canshoot = False
self.dead = True
self.explosionc = (self.explosionc + 1) % 6
if self.vel > 0: # ???
win.blit(Expl[self.explosionc],(self.x,self.y))
self.visible = False
Я рассчитываю следующий кадр с
self.explosionc = (self.explosionc + 1) % 6
Я не знаю только, почему вы используете if self.vel > 0:
Полный код
class Player(pygame.sprite.Sprite):
def __init__(self,x,y,width,height):
self.x = x
self.y = y
self.width = width
self.height = height
self.vel = 5
self.health = 10
self.visible = True
self.explosions = False
self.explosionc = 0
self.hitbox = (self.x + 5,self.y + 10,60,60)
self.canshoot = True
self.dead = False
self.frame_delay = 200 # 200 milliseconds
def draw(self,win):
global bgvel
if self.y > 600:
win.blit(EFTNA,(self.x,self.y))
for enemy in enemies:
enemy.vel = 2
#bgvel = 1
elif self.y <= 600 and self.y > 400:
win.blit(EFTAL,(self.x,self.y))
for enemy in enemies:
enemy.vel = 3
#bgvel = 2
elif self.y <= 400 and self.y > 350:
win.blit(EFTAM,(self.x,self.y))
for enemy in enemies:
enemy.vel = 4
#bgvel = 3
elif self.y <= 450:
win.blit(EFTAH,(self.x,self.y))
for enemy in enemies:
enemy.vel = 5
#bgvel = 4
self.hitbox = (self.x + 5,self.y + 10,60,60)
#pygame.draw.rect(win,(255,0,0),self.hitbox,2)
if self.y + self.height > HEIGHT:
self.y -= self.vel
if self.x < 0:
self.x += self.vel
if self.x + self.width > WIDTH:
self.x -= self.vel
if self.explosions == True:
current_time = pygame.time.get_ticks()
if current_time - self.start_delay >= self.frame_delay:
self.start_delay = current_time
print("I exploded")
self.canshoot = False
self.dead = True
self.explosionc = (self.explosionc + 1) % 6
if self.vel > 0: # ???
win.blit(Expl[self.explosionc],(self.x,self.y))
self.visible = False
def hit(self):
if self.health > 0:
self.health -= 1
else:
self.explosions = True
self.start_delay = 0 # or pygame.time.get_ticks()