Sprite(스프라이트) 사용하기
페이지정보
내용
Sprite(스프라이트)
Sprite는 게임에서 나타내는 모든 캐릭터, 장애물등을 표현할 때 사용하는 Surface이다.
우리가 이전에는 각 캐릭터의 충돌이나 위치등을 모두 직접 계산하는 식을 만들어서 사용하였다. 하지만 Sprite를 사용하면 Sprite 그룹을 만들어서 모두 한꺼번에 움직이게 하거나 Sprite들끼리의 충돌등을 알아낼 수 있다.
또한 Sprite를 사용하여 캐릭터가 자연스럽게 움직이는 것을 연출할 수 있다. 물론 이 모든 것들을 Sprite없이도 만들 수 있지만, Sprite를 사용하는 방법을 알아본다.
1. 캐릭터의 연속동작을 나타내는 이미지 준비
캐릭터가 자연스럽게 움직이는 것을 표현하기 위해서는 각 동작을 나타내는 이미지가 있어야 한다.
아래의 사이트에 가면 Sprite를 위한 많은 Free 소스들이 있으니 마음에 드는 것을 사용해도 되고,
본 강좌에 쓰인 예제파일은 첨부 파일로 제공하니, 첨부파일(freedinosprite.zip)을 다운받아서 사용해도 된다.
2. Sprite 클래스 생성
Sprite는 pygame.sprite.sprite 클래스를 상속받아 사용한다.
Sprite 클래스를 상속받아 생성한 뒤, 연속하여 움직일 이미지를 이미지 리스트에 넣어서 순서대로 구현해준다.
순서대로 구현하는 것은 update() 메서드를 오버라이딩해서 사용한다.
오버라이딩(Overriding)이란 상위 클래스에 이미 정의되어 있는 메서드를 같은 이름의 메서드로 다시 정의해서 사용하는 것을 말한다.
class AnimatedSprite(pygame.sprite.Sprite):
def __init__(self, position): super(AnimatedSprite, self).__init__()
# 이미지를 Rect안에 넣기 위해 Rect의 크기 지정
# 여러장의 이미지를 리스트로 저장한다. 이미지 경로는 자신들의 경로를 사용한다.
# rect 만들기
# 캐릭터의 첫번째 이미지
if self.index >= len(self.images): self.image = self.images[self.index] |
3. Game loop를 적용하여 자동으로 움직이는 캐릭터 만들기 전체 코드
import pygame
SCREEN_WIDTH = 1020
# pygame 초기화 pygame.init()
# 스크린 객체 저장
# FPS를 위한 Clock 생성 FPS = 60
BACKGROUND_COLOR = pygame.Color('white')
class AnimatedSprite(pygame.sprite.Sprite):
def __init__(self, position): super(AnimatedSprite, self).__init__()
# 이미지를 Rect안에 넣기 위해 Rect의 크기 지정
# 여러장의 이미지를 리스트로 저장한다. 이미지 경로는 자신들의 경로를 사용한다.
# rect 만들기
# 캐릭터의 첫번째 이미지
if self.index >= len(self.images): self.image = self.images[self.index]
# player 생성
running = True
# all_sprites 그룹안에 든 모든 Sprite update clock.tick(FPS)
if __name__ == '__main__': |
4. 실행 결과
결과를 보면 캐릭터가 너무 빨리 움직인다. 즉, 10장의 그림을 FPS = 60의 시간으로 재생을 하므로 1초에 6번을 반복하기 때문에 자연스럽다기보다는 너무 빠르게 움직인다.
따라서 FPS에 관계없이 이미지들이 1초에 한번씩 loop를 돌도록 코드를 추가하는 것은 다음 강좌에서 살펴본다.
https://www.jbmpa.com/pygame/20
첨부파일
- freedinosprite.zip (5.8M) 161 다운로드 | DATE : 2020-04-05 18:20:36