Animation 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__()

我试图在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__()
    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
。查看如何实现计时器。

非常感谢您的帮助!