My character is switching through frames extremely fast and I dont know why. Ive tried changing the self.animation_speed but it doesnt do anything besides stalling when the game starts. can someone give me a fix?
get_frect is a floating point of get_rect its really useful. It comes from the pygame module addon called 'pygame-ce'
import pygame
from random import randint
from os.path import isfile, join
pygame.init()
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.idle_spritesheet = pygame.image.load(join('images', 'Unarmed_Idle', 'Unarmed_Idle_full.png')).convert_alpha()
self.walk_spritesheet = pygame.image.load(join('images', 'Unarmed_Walk', 'Unarmed_Walk_full.png')).convert_alpha()
self.run_spritesheet = pygame.image.load(join('images', 'Unarmed_Run', 'Unarmed_Run_Full.png')).convert_alpha()
self.frame_width = 64
self.frame_height = 64
scale = (120,120)
# Idle Frames List
idle_frame_count = {
'idledown': 12,
'idleleft': 12,
'idleright': 12,
'idleup': 3
}
# Walk Frames List
walk_frame_count = {
'walkdown': 6,
'walkleft': 6,
'walkright': 6,
'walkup': 6
}
# Run Frames List
run_frame_count = {
'rundown': 8,
'runleft': 8,
'runright': 8,
'runup': 8
}
# List of Animations with properties
self.animation_list = {
'idle': {'down': [],'left': [], 'right': [], 'up': []},
'walk': {'down': [],'left': [], 'right': [], 'up': []},
'run': {'down': [], 'left': [], 'right': [], 'up': []}
}
x_offset = 0
# Idle
for i in range(idle_frame_count['idledown']):
frames = self.idle_spritesheet.subsurface((x_offset, 0, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['idle']['down'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(idle_frame_count['idleleft']):
frames = self.idle_spritesheet.subsurface((x_offset, 64, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['idle']['left'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(idle_frame_count['idleright']):
frames = self.idle_spritesheet.subsurface((x_offset, 128, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['idle']['right'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(idle_frame_count['idleup']):
frames = self.idle_spritesheet.subsurface((x_offset, 192, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['idle']['up'].append(frames)
x_offset += self.frame_width
# Walk
x_offset = 0
for i in range(walk_frame_count['walkdown']):
frames = self.walk_spritesheet.subsurface((x_offset, 0, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['walk']['down'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(walk_frame_count['walkleft']):
frames = self.walk_spritesheet.subsurface((x_offset, 64, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['walk']['left'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(walk_frame_count['walkright']):
frames = self.walk_spritesheet.subsurface((x_offset, 128, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['walk']['right'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(walk_frame_count['walkup']):
frames = self.walk_spritesheet.subsurface((x_offset, 192, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['walk']['up'].append(frames)
x_offset += self.frame_width
# Run
x_offset = 0
for i in range(run_frame_count['rundown']):
frames = self.run_spritesheet.subsurface((x_offset, 0, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['run']['down'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(run_frame_count['runleft']):
frames = self.run_spritesheet.subsurface((x_offset, 64, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['run']['left'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(run_frame_count['runright']):
frames = self.run_spritesheet.subsurface((x_offset, 128, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['run']['right'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(run_frame_count['runup']):
frames = self.run_spritesheet.subsurface((x_offset, 192, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['run']['up'].append(frames)
x_offset += self.frame_width
x_offset = 0
self.action = 'idle'
self.direction = 'right'
self.current_frame = 0
self.image = self.animation_list[self.action][self.direction][self.current_frame]
self.rect = self.image.get_frect(center=(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2))
self.animation_speed = 0.3
self.last_update = pygame.time.get_ticks()
self.speed = 0.3
def update(self):
now = pygame.time.get_ticks()
keys = pygame.key.get_pressed()
moving = False
if keys[pygame.K_RIGHT]:
self.action = 'walk'; self.direction = 'right'; moving = True
self.rect.x += self.speed
elif keys[pygame.K_LEFT]:
self.action = 'walk'; self.direction = 'left'; moving = True
self.rect.x -= self.speed
elif keys[pygame.K_UP]:
self.action = 'walk'; self.direction = 'up'; moving = True
self.rect.y -= self.speed
elif keys[pygame.K_DOWN]:
self.action = 'walk'; self.direction = 'down'; moving = True
self.rect.y += self.speed
else: self.action = 'idle'
if now - self.last_update > self.animation_speed * 1000:
now = self.last_update
frames = self.animation_list[self.action][self.direction]
self.current_frame = (self.current_frame + 1) % len(frames)
self.image = frames[self.current_frame]
WINDOW_WIDTH, WINDOW_HEIGHT = 900, 600
screen = pygame.display.set_mode((WINDOW_HEIGHT, WINDOW_HEIGHT))
pygame.display.set_caption('Male Top-Down SpriteSheet Test')
run = True
clock = pygame.time.Clock()
player = Player()
all_sprites = pygame.sprite.Group(player)
while run:
dt = clock.tick() / 1000
screen.fill('black')
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
all_sprites.update()
all_sprites.draw(screen)
pygame.display.update()
pygame.quit()
exit()
I tried changing self.animation_speed but it stalls until it starts. I have tried changing the framerate but it makes the character teleport when moving etc etc.
My character is switching through frames extremely fast and I dont know why. Ive tried changing the self.animation_speed but it doesnt do anything besides stalling when the game starts. can someone give me a fix?
get_frect is a floating point of get_rect its really useful. It comes from the pygame module addon called 'pygame-ce'
import pygame
from random import randint
from os.path import isfile, join
pygame.init()
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.idle_spritesheet = pygame.image.load(join('images', 'Unarmed_Idle', 'Unarmed_Idle_full.png')).convert_alpha()
self.walk_spritesheet = pygame.image.load(join('images', 'Unarmed_Walk', 'Unarmed_Walk_full.png')).convert_alpha()
self.run_spritesheet = pygame.image.load(join('images', 'Unarmed_Run', 'Unarmed_Run_Full.png')).convert_alpha()
self.frame_width = 64
self.frame_height = 64
scale = (120,120)
# Idle Frames List
idle_frame_count = {
'idledown': 12,
'idleleft': 12,
'idleright': 12,
'idleup': 3
}
# Walk Frames List
walk_frame_count = {
'walkdown': 6,
'walkleft': 6,
'walkright': 6,
'walkup': 6
}
# Run Frames List
run_frame_count = {
'rundown': 8,
'runleft': 8,
'runright': 8,
'runup': 8
}
# List of Animations with properties
self.animation_list = {
'idle': {'down': [],'left': [], 'right': [], 'up': []},
'walk': {'down': [],'left': [], 'right': [], 'up': []},
'run': {'down': [], 'left': [], 'right': [], 'up': []}
}
x_offset = 0
# Idle
for i in range(idle_frame_count['idledown']):
frames = self.idle_spritesheet.subsurface((x_offset, 0, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['idle']['down'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(idle_frame_count['idleleft']):
frames = self.idle_spritesheet.subsurface((x_offset, 64, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['idle']['left'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(idle_frame_count['idleright']):
frames = self.idle_spritesheet.subsurface((x_offset, 128, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['idle']['right'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(idle_frame_count['idleup']):
frames = self.idle_spritesheet.subsurface((x_offset, 192, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['idle']['up'].append(frames)
x_offset += self.frame_width
# Walk
x_offset = 0
for i in range(walk_frame_count['walkdown']):
frames = self.walk_spritesheet.subsurface((x_offset, 0, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['walk']['down'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(walk_frame_count['walkleft']):
frames = self.walk_spritesheet.subsurface((x_offset, 64, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['walk']['left'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(walk_frame_count['walkright']):
frames = self.walk_spritesheet.subsurface((x_offset, 128, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['walk']['right'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(walk_frame_count['walkup']):
frames = self.walk_spritesheet.subsurface((x_offset, 192, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['walk']['up'].append(frames)
x_offset += self.frame_width
# Run
x_offset = 0
for i in range(run_frame_count['rundown']):
frames = self.run_spritesheet.subsurface((x_offset, 0, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['run']['down'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(run_frame_count['runleft']):
frames = self.run_spritesheet.subsurface((x_offset, 64, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['run']['left'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(run_frame_count['runright']):
frames = self.run_spritesheet.subsurface((x_offset, 128, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['run']['right'].append(frames)
x_offset += self.frame_width
x_offset = 0
for i in range(run_frame_count['runup']):
frames = self.run_spritesheet.subsurface((x_offset, 192, self.frame_width, self.frame_height))
frames = pygame.transform.scale(frames, scale)
self.animation_list['run']['up'].append(frames)
x_offset += self.frame_width
x_offset = 0
self.action = 'idle'
self.direction = 'right'
self.current_frame = 0
self.image = self.animation_list[self.action][self.direction][self.current_frame]
self.rect = self.image.get_frect(center=(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2))
self.animation_speed = 0.3
self.last_update = pygame.time.get_ticks()
self.speed = 0.3
def update(self):
now = pygame.time.get_ticks()
keys = pygame.key.get_pressed()
moving = False
if keys[pygame.K_RIGHT]:
self.action = 'walk'; self.direction = 'right'; moving = True
self.rect.x += self.speed
elif keys[pygame.K_LEFT]:
self.action = 'walk'; self.direction = 'left'; moving = True
self.rect.x -= self.speed
elif keys[pygame.K_UP]:
self.action = 'walk'; self.direction = 'up'; moving = True
self.rect.y -= self.speed
elif keys[pygame.K_DOWN]:
self.action = 'walk'; self.direction = 'down'; moving = True
self.rect.y += self.speed
else: self.action = 'idle'
if now - self.last_update > self.animation_speed * 1000:
now = self.last_update
frames = self.animation_list[self.action][self.direction]
self.current_frame = (self.current_frame + 1) % len(frames)
self.image = frames[self.current_frame]
WINDOW_WIDTH, WINDOW_HEIGHT = 900, 600
screen = pygame.display.set_mode((WINDOW_HEIGHT, WINDOW_HEIGHT))
pygame.display.set_caption('Male Top-Down SpriteSheet Test')
run = True
clock = pygame.time.Clock()
player = Player()
all_sprites = pygame.sprite.Group(player)
while run:
dt = clock.tick() / 1000
screen.fill('black')
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
all_sprites.update()
all_sprites.draw(screen)
pygame.display.update()
pygame.quit()
exit()
I tried changing self.animation_speed but it stalls until it starts. I have tried changing the framerate but it makes the character teleport when moving etc etc.
Share Improve this question edited Mar 18 at 5:35 Rabbid76 211k30 gold badges159 silver badges200 bronze badges asked Mar 18 at 5:24 EtteEtte 72 bronze badges1 Answer
Reset to default -1You're simply never updating self.last_update
, so the Player.update()
is always animating the frame. It's short-circuiting the animation_speed timer.
Probably the line:
now = self.last_update
is meant to be:
self.last_update = now