본 강좌에 쓰인 예제파일은 첨부 파일로 제공하니, 첨부파일(freedinosprite.zip)을 다운받아서 사용해도 된다.
2. Sprite 클래스 생성
Sprite는pygame.sprite.sprite클래스를 상속받아 사용한다.
Sprite 클래스를 상속받아 생성한 뒤, 연속하여 움직일 이미지를 이미지 리스트에 넣어서 순서대로 구현해준다.
순서대로 구현하는 것은 update() 메서드를 오버라이딩해서 사용한다.
오버라이딩(Overriding)이란 상위 클래스에 이미 정의되어 있는 메서드를 같은 이름의 메서드로 다시 정의해서 사용하는 것을 말한다.
classAnimatedSprite(pygame.sprite.Sprite):
def__init__(self, position):
super(AnimatedSprite,self).__init__()
# 이미지를 Rect안에 넣기 위해 Rect의 크기 지정 # 이미지의 크기와 같게 하거나, 크기를 다르게 한다면 pygame.transform.scale을 사용하여 rect 안에 # 이미지를 맞추도록 한다. size = (680,472)
# 여러장의 이미지를 리스트로 저장한다. 이미지 경로는 자신들의 경로를 사용한다. images = [] images.append(pygame.image.load('freedinosprite/png/Idle_01.png')) images.append(pygame.image.load('freedinosprite/png/Idle_02.png')) images.append(pygame.image.load('freedinosprite/png/Idle_03.png')) images.append(pygame.image.load('freedinosprite/png/Idle_04.png')) images.append(pygame.image.load('freedinosprite/png/Idle_05.png')) images.append(pygame.image.load('freedinosprite/png/Idle_06.png')) images.append(pygame.image.load('freedinosprite/png/Idle_07.png')) images.append(pygame.image.load('freedinosprite/png/Idle_08.png')) images.append(pygame.image.load('freedinosprite/png/Idle_09.png')) images.append(pygame.image.load('freedinosprite/png/Idle_10.png'))
# rect 만들기 self.rect = pygame.Rect(position, size)
# Rect 크기와 Image 크기 맞추기. pygame.transform.scale self.images = [pygame.transform.scale(image, size) for imageinimages]
# 캐릭터의 첫번째 이미지 self.index =0 self.image = images[self.index] # 'image' is the current image of the animation.
def update(self): # update를 통해 캐릭터의 이미지가 계속 반복해서 나타나도록 한다. self.index +=1
ifself.index >= len(self.images): self.index =0
self.image = self.images[self.index]
3. Game loop를 적용하여 자동으로 움직이는 캐릭터 만들기 전체 코드
importpygame
# 스크린 전체 크기 지정
SCREEN_WIDTH =1020 SCREEN_HEIGHT =480
# pygame 초기화
pygame.init()
# 스크린 객체 저장 SCREEN = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("pygame Sprite")
# FPS를 위한 Clock 생성 clock = pygame.time.Clock()
FPS =60
BACKGROUND_COLOR = pygame.Color('white')
classAnimatedSprite(pygame.sprite.Sprite):
def__init__(self, position):
super(AnimatedSprite,self).__init__()
# 이미지를 Rect안에 넣기 위해 Rect의 크기 지정 # 이미지의 크기와 같게 하거나, 크기를 다르게 한다면 pygame.transform.scale을 사용하여 rect 안에 # 이미지를 맞추도록 한다. size = (680,472)
# 여러장의 이미지를 리스트로 저장한다. 이미지 경로는 자신들의 경로를 사용한다. images = [] images.append(pygame.image.load('freedinosprite/png/Idle_01.png')) images.append(pygame.image.load('freedinosprite/png/Idle_02.png')) images.append(pygame.image.load('freedinosprite/png/Idle_03.png')) images.append(pygame.image.load('freedinosprite/png/Idle_04.png')) images.append(pygame.image.load('freedinosprite/png/Idle_05.png')) images.append(pygame.image.load('freedinosprite/png/Idle_06.png')) images.append(pygame.image.load('freedinosprite/png/Idle_07.png')) images.append(pygame.image.load('freedinosprite/png/Idle_08.png')) images.append(pygame.image.load('freedinosprite/png/Idle_09.png')) images.append(pygame.image.load('freedinosprite/png/Idle_10.png'))
# rect 만들기 self.rect = pygame.Rect(position, size)
# Rect 크기와 Image 크기 맞추기. pygame.transform.scale self.images = [pygame.transform.scale(image, size) for imageinimages]
# 캐릭터의 첫번째 이미지 self.index =0 self.image = images[self.index] # 'image' is the current image of the animation.
def update(self): # update를 통해 캐릭터의 이미지가 계속 반복해서 나타나도록 한다. self.index +=1
ifself.index >= len(self.images): self.index =0
self.image = self.images[self.index]
defmain():
# player 생성 player = AnimatedSprite(position=(100,8)) # 생성된 player를 그룹에 넣기 all_sprites = pygame.sprite.Group(player)
# all_sprites 그룹안에 든 모든 Sprite update all_sprites.update() # 배경색 SCREEN.fill(BACKGROUND_COLOR) # 모든 sprite 화면에 그려주기 all_sprites.draw(SCREEN) pygame.display.update()
clock.tick(FPS)
if__name__ =='__main__': main()
4. 실행 결과
결과를 보면 캐릭터가 너무 빨리 움직인다. 즉, 10장의 그림을 FPS = 60의 시간으로 재생을 하므로 1초에 6번을 반복하기 때문에 자연스럽다기보다는 너무 빠르게 움직인다.
따라서 FPS에 관계없이 이미지들이 1초에 한번씩 loop를 돌도록 코드를 추가하는 것은 다음 강좌에서 살펴본다.