所以我的精灵表过快地转换为我喜欢的,我希望它移动得慢一点。理想情况下,我希望我的角色移动得很慢(步伐很好)但是现在他左右移动并且向上移动非常快。 这是我的代码:
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')
有什么想法吗?我愿意接受任何有用的事情!
答案 0 :(得分:0)
有两种可能性。计时器或计数器。
你可以有一个frameCounter乘数,它会使精灵动画变慢。但这并不是很灵活,取决于更新的调用量。
更好的解决方案是拥有一个计时器。如果添加要更新的参数,该参数表示自上次调用以来经过的时间量,则可以将其存储在变量中。有了这个,你可以每隔50ms换到下一帧。
def update(delta):
self.frameTicks += delta
if (self.frameTicks > 50):
self.frameTicks = 0
self.nextFrame()
查看pygame的Clock模块,了解获得时间的方法。
除此之外,我建议完全删除剪辑操作,因为它们会使您的代码更难阅读。在这样的小程序中,您可以创建已经切割的子表面列表,因此您唯一需要的是当前帧索引。