2017-10-20 2 views
1

파이 게임에서 사각형의 애니메이션을 만들려고하는데 주어진 프레임 속도로 애니메이션을 만들려고 애 쓰고 있습니다. 내가 계약을 호출하고 별도의 방법을 확장 할 경우파이 게임 애니메이션 이미지 변환하기

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 

, 그들은 성공적으로 사각형의 이미지 크기를 조정,하지만 난 환경과 스프라이트를 끌어 내 메인 루프를 중단하지 않고, 시간이 지남에 따라이를 수행하고 싶습니다.

답변

1

가장 간단한 해결책은 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() 

또는 일부 시간 간격 후 extend 또는 contract를 호출 할 수 있습니다. these answers을 확인하여 타이머를 구현하는 방법을 확인하십시오.

+1

도움 주셔서 대단히 감사합니다! –