2017-10-20 25 views
1

J'essaye de créer une animation d'un rectangle dans pygame mais j'ai du mal à l'animer sur la fréquence d'images donnée.Pygame animant l'image en la transformant

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 

Si j'appelle le contrat et étendre les méthodes séparément, ils l'image redimensionnez du rectangle avec succès, mais je voudrais l'exécuter au fil du temps, sans interrompre ma boucle principale qui tire l'environnement et l'image-objet.

Répondre

1

La solution la plus simple serait d'appeler extend ou contract une fois par trame, mais l'animation serait alors liée à la fréquence d'images.

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

Vous pouvez appeler extend ou contract après un certain intervalle de temps. Découvrez these answers pour voir comment vous pouvez mettre en œuvre une minuterie.

+1

Merci beaucoup pour votre aide! –