最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

python - Switching Through Frames too fast - Stack Overflow

programmeradmin6浏览0评论

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 badges
Add a comment  | 

1 Answer 1

Reset to default -1

You'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
发布评论

评论列表(0)

  1. 暂无评论