Animation Pygame通过变换图像来设置动画
我试图在pygame中创建一个矩形的动画,但我很难在给定的帧速率上设置它的动画Animation Pygame通过变换图像来设置动画,animation,pygame,Animation,Pygame,我试图在pygame中创建一个矩形的动画,但我很难在给定的帧速率上设置它的动画 class Muscle(pygame.sprite.Sprite): def __init__(self, screen, posX=200, posY=200, contraction=0.5, extension=1.5, length=10, thickness=5, min_len=0.2,max_len=1.5, power=20): super(Muscle, self).__init__()
class Muscle(pygame.sprite.Sprite):
def __init__(self, screen, posX=200, posY=200, contraction=0.5, extension=1.5, length=10, thickness=5, min_len=0.2,max_len=1.5, power=20):
super(Muscle, self).__init__()
self.screen = screen
self.contraction = contraction
self.relaxation = relaxation
self.length = length
self.thickness = thickness
if power < 1:
self.power = 1
power = 1
else:
self.power = power
self.image = pygame.Surface((length, thickness))
color_index = 5 * power
self.image.fill((255, color_index, color_index))
self.rect = self.image.get_rect()
self.rect.x = posX
self.rect.y = posY
def render(self):
self.screen.blit(self.image, (self.rect.x, self.rect.y))
def contract(self):
expected_width = self.length * self.contraction
counter = 0
while self.image.get_width() > expected_width:
self.image = pygame.transform.scale(self.image, (self.rect.width, self.image.get_height()))
self.rect.x += 1;
self.rect.width -= 2
self.render()
counter += 1
def extend(self):
expected_width = self.length * self.relaxation
counter = 0
while self.image.get_width() < expected_width:
self.image = pygame.transform.scale(self.image, (self.rect.width, self.image.get_height()))
self.rect.x -= 1;
self.rect.width += 2
self.render()
#print("Relaxation:" + str(counter))
counter += 1
类肌肉(pygame.sprite.sprite):
定义初始值(自身,屏幕,posX=200,posY=200,收缩=0.5,延伸=1.5,长度=10,厚度=5,最小长度=0.2,最大长度=1.5,功率=20):
超级(肌肉,自我)。\uuuuu初始
self.screen=屏幕
自我收缩
自我放松
self.length=长度
自身厚度=厚度
如果功率小于1:
自功率=1
功率=1
其他:
自我力量=力量
self.image=pygame.Surface((长度、厚度))
颜色指数=5*幂
self.image.fill((255,颜色索引,颜色索引))
self.rect=self.image.get_rect()
self.rect.x=posX
self.rect.y=posY
def渲染(自):
self.screen.blit(self.image,(self.rect.x,self.rect.y))
def合同(自我):
预期宽度=自我长度*自我收缩
计数器=0
而self.image.get_width()>预期的_宽度:
self.image=pygame.transform.scale(self.image,(self.rect.width,self.image.get_height())
自校正x+=1;
self.rect.width-=2
self.render()
计数器+=1
def扩展(自我):
预期宽度=自长度*自松弛
计数器=0
而self.image.get_width()
如果我分别调用contract和extend方法,它们会成功地调整矩形的图像大小,但我希望随着时间的推移执行它,而不会中断绘制环境和精灵的主循环。最简单的解决方案是每帧调用一次
extend
或contract
,但是,动画将受到帧速率限制
import pygame
class Muscle(pygame.sprite.Sprite):
def __init__(self, screen, posX=200, posY=200, contraction=0.5,
extension=1.5, length=40, thickness=20, min_len=0.2,max_len=1.5, power=20):
super(Muscle, self).__init__()
self.screen = screen
self.contracting = False # To check if the muscle is contracting or extending.
self.contraction = contraction
self.relaxation = 1
self.length = length
self.thickness = thickness
if power < 1:
self.power = 1
power = 1
else:
self.power = power
self.image = pygame.Surface((length, thickness))
color_index = 5 * power
self.image.fill((255, color_index, color_index))
self.rect = self.image.get_rect()
self.rect.x = posX
self.rect.y = posY
# This method gets called every frame.
def update(self):
if self.contracting:
self.contract()
else:
self.extend()
def render(self):
self.screen.blit(self.image, (self.rect.x, self.rect.y))
def contract(self):
expected_width = self.length * self.contraction
counter = 0
if self.image.get_width() > expected_width:
self.image = pygame.transform.scale(self.image, (self.rect.width, self.image.get_height()))
self.rect.x += 1
self.rect.width -= 2
self.render()
counter += 1
def extend(self):
expected_width = self.length * self.relaxation
counter = 0
if self.image.get_width() < expected_width:
self.image = pygame.transform.scale(self.image, (self.rect.width, self.image.get_height()))
self.rect.x -= 1
self.rect.width += 2
self.render()
counter += 1
def main():
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
muscle = Muscle(screen)
all_sprites = pygame.sprite.Group(muscle)
done = False
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
# Change the state of the muscle.
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_c:
muscle.contracting = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_c:
muscle.contracting = False
all_sprites.update()
screen.fill((30, 30, 30))
all_sprites.draw(screen)
pygame.display.flip()
clock.tick(30)
if __name__ == '__main__':
pygame.init()
main()
pygame.quit()
导入pygame
班级肌肉(pygame.sprite.sprite):
def u uu init uu uuuu(自,屏幕,posX=200,posY=200,收缩=0.5,
延伸率=1.5,长度=40,厚度=20,最小长度=0.2,最大长度=1.5,功率=20):
超级(肌肉,自我)。\uuuuu初始
self.screen=屏幕
self.contracting=False#检查肌肉是否收缩或伸展。
自我收缩
自我放松=1
self.length=长度
自身厚度=厚度
如果功率小于1:
自功率=1
功率=1
其他:
自我力量=力量
self.image=pygame.Surface((长度、厚度))
颜色指数=5*幂
self.image.fill((255,颜色索引,颜色索引))
self.rect=self.image.get_rect()
self.rect.x=posX
self.rect.y=posY
#此方法在每一帧都被调用。
def更新(自我):
如果自行订约:
self.contract()
其他:
self.extend()
def渲染(自):
self.screen.blit(self.image,(self.rect.x,self.rect.y))
def合同(自我):
预期宽度=自我长度*自我收缩
计数器=0
如果self.image.get_width()>预期的_宽度:
self.image=pygame.transform.scale(self.image,(self.rect.width,self.image.get_height())
self.rect.x+=1
self.rect.width-=2
self.render()
计数器+=1
def扩展(自我):
预期宽度=自长度*自松弛
计数器=0
如果self.image.get_width()
或者,您可以在一段时间间隔后调用
extend
或contract
。查看如何实现计时器。非常感谢您的帮助!