Sprite(스프라이트) 사용하기 > Pygame - python GUI module

본문 바로가기

사이트 내 전체검색

이전으로Pygame - python GUI module

Sprite(스프라이트) 사용하기

페이지정보

글쓴이 관리자 조회 27,672 조회 날짜 20-03-11 14:39 / U:20-04-05 19:23
댓글 0댓글

SNS 공유

  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기

내용

Sprite(스프라이트)

 

 

Sprite는 게임에서 나타내는 모든 캐릭터, 장애물등을 표현할 때 사용하는 Surface이다.

 

우리가 이전에는 각 캐릭터의 충돌이나 위치등을 모두 직접 계산하는 식을 만들어서 사용하였다. 하지만 Sprite를 사용하면 Sprite 그룹을 만들어서 모두 한꺼번에 움직이게 하거나 Sprite들끼리의 충돌등을 알아낼 수 있다.

 

또한 Sprite를 사용하여 캐릭터가 자연스럽게 움직이는 것을 연출할 수 있다. 물론 이 모든 것들을 Sprite없이도 만들 수 있지만, Sprite를 사용하는 방법을 알아본다.

 

 

 

1. 캐릭터의 연속동작을 나타내는 이미지 준비

 

캐릭터가 자연스럽게 움직이는 것을 표현하기 위해서는 각 동작을 나타내는 이미지가 있어야 한다. 

 

아래의 사이트에 가면 Sprite를 위한 많은 Free 소스들이 있으니 마음에 드는 것을 사용해도 되고, 

https://www.gameart2d.com/

 

본 강좌에 쓰인 예제파일은 첨부 파일로 제공하니, 첨부파일(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의 크기 지정
        # 이미지의 크기와 같게 하거나, 크기를 다르게 한다면 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 image in images]

 

        # 캐릭터의 첫번째 이미지
        self.index = 0
        self.image = images[self.index]  # 'image' is the current image of the animation.


    def update(self):
        # update를 통해 캐릭터의 이미지가 계속 반복해서 나타나도록 한다.
        self.index += 1

 

        if self.index >= len(self.images):
            self.index = 0

        self.image = self.images[self.index]

 

 

 

3. Game loop를 적용하여 자동으로 움직이는 캐릭터 만들기 전체 코드

 

import pygame


# 스크린 전체 크기 지정

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

 

class AnimatedSprite(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 image in images]

 

        # 캐릭터의 첫번째 이미지
        self.index = 0
        self.image = images[self.index]  # 'image' is the current image of the animation.


    def update(self):
        # update를 통해 캐릭터의 이미지가 계속 반복해서 나타나도록 한다.
        self.index += 1

 

        if self.index >= len(self.images):
            self.index = 0

        self.image = self.images[self.index]


def main():

    # player 생성
    player = AnimatedSprite(position=(100, 8))
    # 생성된 player를 그룹에 넣기
    all_sprites = pygame.sprite.Group(player)  

 

    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

       

        # 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. 실행 결과

 

2921044682_1586125354.0761.gif

 

결과를 보면 캐릭터가 너무 빨리 움직인다. 즉, 10장의 그림을 FPS = 60의 시간으로 재생을 하므로 1초에 6번을 반복하기 때문에 자연스럽다기보다는 너무 빠르게 움직인다.

따라서 FPS에 관계없이 이미지들이 1초에 한번씩 loop를 돌도록 코드를 추가하는 것은 다음 강좌에서 살펴본다.

 

https://www.jbmpa.com/pygame/20

 

첨부파일

댓글목록

댓글이 없습니다

게시물 검색
총 22 건 , 1 페이지
올서베이넷
무료 온라인 설문 사이트
OVITII
웹 프레젠테이션 도구
Copyright © JBMPA.com All rights reserved.
사이트 언어 선택
PC 보기