본문 바로가기
Python/Pygame

[Pygame] Python(파이썬)으로 비행기 게임만들기 - (3) 클래스와 함수로 분리해보기

by 잭피 2022. 12. 7.

클래스와 함수로 분리하면 무엇이 좋을까요? 
바로 중복되는 코드를 없앨 수 있고, 코드의 재사용을 더 잘할 수 있어요 
이번 시간에는 2강에서 작성했던 코드를 함수와 클래스로 분리해보는 시간을 가져볼게요

# 2강 - 비행기 띄우기

import pygame

# 1. 게임 초기화
pygame.init()

# 2. 게임창 옵션 설정
size = [500, 700]
screen = pygame.display.set_mode(size)

title = "미사일 게임"

pygame.display.set_caption(title)

# 3. 게임 내 필요한 설정
clock = pygame.time.Clock() # FPS를 위한 변수

plane = pygame.image.load("/Users/js/Desktop/수업자료/python/비행기.png").convert_alpha()
plane = pygame.transform.scale(plane, (80, 80))

# 중앙으로 
ss_x, ss_y = plane.get_size()
plane_x = round(size[0]/2) - ss_x / 2
plane_y = size[1] - ss_y - 15

# 검정색 배경화면 
black = (0,0,0)

# 4. 메인 이벤트
SB = 0
while SB == 0:

    # 4-1. FPS 설정
    clock.tick(60) # 1초에 60번 while문 반복
    
    # 4-2. 각종 입력 감지 
    for event in pygame.event.get():# 키보드나 마우스의 동작을 받아옴
        if event.type == pygame.QUIT: # 게임 종료
            SB = 1
    
    # 4-3. 입력, 시간에 따른 변화
    # 4-4. 그리기
    screen.fill(black)
    screen.blit(plane, (plane_x, plane_y))
    
    # 4-5. 업데이트
    pygame.display.flip()
    
# 5. 게임 종료 
pygame.quit()

1. 이미지를 관리하는 클래스 작성

위에서 작성한 코드 중에서 이미지 불러오기, 이미지 크기 조절하기, 이미지 그리기를 관리해주는 코드를 클래스로 분리해볼게요

(1) 클래스 정의

우선 클래스를 정의해볼까요?

# 우선 클래스 이름을 정해서 정의해봅시다
class imageManager:

이 클래스는 어떤 기능이 있을까요?

  1. 이미지 불러오기
  2. 이미지 크기 조절하고 중앙으로 움직이기
  3. 이미지 보여주기

이렇게 3가지 기능으로 정의해볼 수 있어요

 

(2) 함수 정의

함수에 대해 배웠죠?

이런 기능들은 함수로 만들어야합니다

그리고 그 함수들 전체를 클래스로 관리할 수 있어요

그럼 이제 클래스에 포함되는 함수 기능 명세서를 작성해볼까요?

class imageManager:
	# 생성자 초기화 (클래스를 만들 때 항상 먼저 정의해줍니다)
	def __init__(self):
	# (a) 이미지를 가져와서 위치를 저장합니다
	def put_img(self, address):
	# (b) 이미지 크기를 조절하고 위치를 저장합니다
	def change_size(self, sx, sy):
	# (c) 이미지를 보여줍니다
	def show(self):

이렇게 4가지 함수로 기능을 분리할 수 있어요

(3) 클래스로 이동해야 하는 코드 살펴보기

전체 코드에서 클래스로 옮겨야하는 코드를 볼까요?

import pygame
pygame.init()
size = [500, 700]
screen = pygame.display.set_mode(size)

title = "미사일 게임"
pygame.display.set_caption(title)

### (a) 이미지를 가져와서 위치를 저장합니다
plane = pygame.image.load("/Users/js/Desktop/수업자료/python/비행기.png").convert_alpha()
ss_x, ss_y = plane.get_size()

### (b) 이미지 크기를 조절하고 위치를 저장합니다
plane = pygame.transform.scale(plane, (80, 80))
plane_x = round(size[0]/2) - ss_x / 2
plane_y = size[1] - ss_y - 15

black = (0,0,0)

SB = 0
while SB == 0:
    clock.tick(60) 
    for event in pygame.event.get():
        if event.type == pygame.QUIT: 
            SB = 1
    
		### (c) 이미지를 보여줍니다
    screen.fill(black)
    screen.blit(plane, (plane_x, plane_y))
   
    pygame.display.flip()
    
pygame.quit()

(4) a, b, c의 기능을 함수로 옮기고 클래스로 관리하기

위에서 이동해야하는 코드를 옮겨볼까요?

class imageManager:
    def __init__(self):
        self.x = 0
        self.y = 0

  	# (a) 이미지를 가져와서 위치를 저장합니다
    def put_img(self, address):
        self.image = pygame.image.load(address).convert_alpha()
        self.sx, self.sy = self.image.get_size() 

		### (b) 이미지 크기를 조절하고 위치를 저장합니다
    def change_size(self, sx, sy):
        self.image = pygame.transform.scale(self.image, (sx, sy))
        self.sx, self.sy = self.image.get_size()
	
		### (c) 이미지를 보여줍니다
    def show(self):
        screen.blit(self.image, (self.x, self.y))

💡 이제 만든 클래스를 사용하여 전체 코드를 변경해봅시다

 

(5) 클래스 사용

(a) 이미지를 가져와서 위치를 저장합니다

ss = imageManager()
ss.put_img("/Users/js/Desktop/수업자료/python/비행기.png")

(b) 이미지 크기를 조절하고 위치를 저장합니다

ss.change_size(80, 80)
ss.x = round(size[0]/2) - ss.sx / 2
ss.y = size[1] - ss.sy - 15

(c) 이미지를 보여줍니다

ss.show()

전체 코드

# 3강 - 클래스를 사용하여 비행기 띄우기
import pygame

# 클래스를 사용해보자
## 클래스는 따로 있는 변수나 함수를 하나의 이름으로 묶어줍니다
class imageManager:
    def __init__(self):
        self.x = 0
        self.y = 0
    def put_img(self, address):
        if address[-3:] == "png":
            self.image = pygame.image.load(address).convert_alpha()
        else:
            self.image = pygame.image.load(address)
        self.sx, self.sy = self.image.get_size() 
    def change_size(self, sx, sy):
        self.image = pygame.transform.scale(self.image, (sx, sy))
        self.sx, self.sy = self.image.get_size()
    def show(self):
        screen.blit(self.image, (self.x, self.y))

# 1. 게임 초기화
pygame.init()

# 2. 게임창 옵션 설정
size = [500, 700]
screen = pygame.display.set_mode(size)

title = "미사일 게임"

pygame.display.set_caption(title)

# 3. 게임 내 필요한 설정
clock = pygame.time.Clock() # FPS를 위한 변수

########## 클래스를 이용해 변환 #############
ss = imageManager()
ss.put_img("/Users/js/Desktop/수업자료/python/비행기.png")
ss.change_size(80, 80)
ss.x = round(size[0]/2) - ss.sx / 2
ss.y = size[1] - ss.sy - 15

black = (0,0,0)

# 4. 메인 이벤트
SB = 0
while SB == 0:

    # 4-1. FPS 설정
    clock.tick(60) # 1초에 60번 while문 반복
    
    # 4-2. 각종 입력 감지 
    for event in pygame.event.get():# 키보드나 마우스의 동작을 받아옴
        if event.type == pygame.QUIT: # 게임 종료
            SB = 1
    
    # 4-3. 입력, 시간에 따른 변화

    # 4-4. 그리기
    screen.fill(black)
    ss.show()
    
    # 4-5. 업데이트
    pygame.display.flip()
    
# 5. 게임 종료 
pygame.quit()

댓글