Pygame - 改变精灵表的速度

时间:2014-11-18 17:11:57

标签: pygame

所以我的精灵表过快地转换为我喜欢的,我希望它移动得慢一点。理想情况下,我希望我的角色移动得很慢(步伐很好)但是现在他左右移动并且向上移动非常快。 这是我的代码:

import pygame

class Serge(pygame.sprite.Sprite):
    def __init__(self, position):
        self.sheet = pygame.image.load('picture.png')
        self.sheet.set_clip(pygame.Rect(0, 0, 100, 150))
    self.image = self.sheet.subsurface(self.sheet.get_clip())
    self.rect = self.image.get_rect()
    self.rect.topleft = position
    self.frame = 0
    self.left_states = { 0: (0, 150, 100, 150), 1: (100, 150, 100, 150), 2: (300, 150, 100, 150) }
    self.right_states = { 0: (0, 300, 100, 150), 1: (100, 300, 100, 150), 2: (300, 300, 100, 150) }
    self.down_states = { 0: (0, 450, 100, 150), 1: (100, 450, 100, 150), 2: (300, 450, 100, 150) }
    self.up_states = { 0: (0, 0, 100, 150), 1: (100, 0, 100, 150), 2: (310, 0, 100, 150) }

def get_frame(self, frame_set):
    self.frame += 1
    if self.frame > (len(frame_set) - 1):
        self.frame = 0
    return frame_set[self.frame]

def clip(self, clipped_rect):
    if type(clipped_rect) is dict:
        self.sheet.set_clip(pygame.Rect(self.get_frame(clipped_rect)))
    else:
        self.sheet.set_clip(pygame.Rect(clipped_rect))
    return clipped_rect

def update(self, direction):
    if direction == 'right':
        self.clip(self.left_states)
        self.rect.x += 1
    if direction == 'left':
        self.clip(self.right_states)
        self.rect.x -= 1
    if direction == 'up':
        self.clip(self.up_states)
        self.rect.y -= 1
    if direction == 'down':
        self.clip(self.down_states)
        self.rect.y += 1

    if direction == 'stand_left':
        self.clip(self.left_states[0])
    if direction == 'stand_right':
        self.clip(self.right_states[0])
    if direction == 'stand_up':
        self.clip(self.up_states[0])
    if direction == 'stand_down':
        self.clip(self.down_states[0])

    self.image = self.sheet.subsurface(self.sheet.get_clip())

def handle_event(self, event):
    if event.type == pygame.QUIT:
        game_over = True

    if event.type == pygame.KEYDOWN:

        if event.key == pygame.K_LEFT:
            self.update('left')
        if event.key == pygame.K_RIGHT:
            self.update('right')
        if event.key == pygame.K_UP:
            self.update('up')
        if event.key == pygame.K_DOWN:
            self.update('down')

    if event.type == pygame.KEYUP:  

        if event.key == pygame.K_LEFT:
            self.update('stand_left')            
        if event.key == pygame.K_RIGHT:
            self.update('stand_right')
        if event.key == pygame.K_UP:
            self.update('stand_up')
        if event.key == pygame.K_DOWN:
            self.update('stand_down')

有什么想法吗?我愿意接受任何有用的事情!

1 个答案:

答案 0 :(得分:0)

有两种可能性。计时器或计数器。

你可以有一个frameCounter乘数,它会使精灵动画变慢。但这并不是很灵活,取决于更新的调用量。

更好的解决方案是拥有一个计时器。如果添加要更新的参数,该参数表示自上次调用以来经过的时间量,则可以将其存储在变量中。有了这个,你可以每隔50ms换到下一帧。

 def update(delta):
      self.frameTicks += delta
      if (self.frameTicks > 50):
          self.frameTicks = 0
          self.nextFrame()

查看pygame的Clock模块,了解获得时间的方法。

除此之外,我建议完全删除剪辑操作,因为它们会使您的代码更难阅读。在这样的小程序中,您可以创建已经切割的子表面列表,因此您唯一需要的是当前帧索引。