앱 개발/pygame

[pygame] 04. 코드 클래스화

내만 2022. 9. 19. 13:36
728x90
반응형

728x90
반응형

 

 

 

 

🙆‍♂️ 클래스화


저번 게시글에서 캐릭터를 추가하는데 너무 많은 코드가 늘어났습니다.

앞으로도 다양하게 추가해야할 부분들이 많을텐데 그 때마다 이런식으로 하기에는 너무 힘듭니다.

그렇기 때문에 클래스를 사용해서 겹치는 코드들은 간단하게 표현하도록 하겠습니다.

 

#클래스 생성
class createObj:
    def __init__(self):

함수를 선언하기 위해서는 class로 선언할 수 있습니다.

그리고 가장 먼저 __init__이라는 함수를 생성하는데 이는 생성자로 시작할 때 생성될 변수들을 넣어줍니다.

x,y 좌표가 필요할 것 같습니다.

 

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

이렇게 x좌표와 y좌표가 들어갈 값을 0으로 초기화 해주고 나중에 변경할 수 있습니다.

 

이제 가장 기본적인 이미지를 넣는 함수를 만들어야 합니다.

    def insertImg(self, addr):
        if addr[-3:] == 'png':
            self.obj = pygame.image.load(addr).convert_alpha()
        else:
            self.obj = pygame.image.load(addr)

insertImg라는 함수로 선언을 하고 주소값을 입력 받습니다.

만약 이미지 확장자가 png라면 .convert_alpha()를 붙일 수 있도록 처리하고 그렇지 않은 경우는 그냥 처리하도록 설정합니다.

#캐릭터 x길이, y길이 받아오기
        self.oX, self.oY = self.obj.get_size()

그리고 위에서 생성된 self.obj의 길이를 가져오는 코드도 짭니다. 이 코드는 추후에 위치를 설정할 때 사용합니다.

    #사진 사이즈 설정
    def setSize(self, oX, oY):
        self.obj = pygame.transform.scale(self.obj, (oX, oY))
        #캐릭터 x길이, y길이 받아오기
        self.oX, self.oY = self.obj.get_size()

그리고 만약 사진 사이즈가 마음에 들지 않아서 설정하는 함수를 설정합니다.

기존에 사용했었던 코드처럼 이용합니다.

 

    #blit
    def show(self):
        screen.blit(self.obj, (self.x, self.y))

그리고 screen.blit부분도 함수로 만들어서 이용합니다.

 

그래서 만든 class코드를 한번에 정리해보면

#클래스 생성
class createObj:
    #생성자
    def __init__(self):
        self.x = 0
        self.y = 0
    #캐릭터 입력
    def insertImg(self, addr):
        if addr[-3:] == 'png':
            self.obj = pygame.image.load(addr).convert_alpha()
        else:
            self.obj = pygame.image.load(addr)
        #캐릭터 x길이, y길이 받아오기
        self.oX, self.oY = self.obj.get_size()
        
    #사진 사이즈 설정
    def setSize(self, oX, oY):
        self.obj = pygame.transform.scale(self.obj, (oX, oY))
        #캐릭터 x길이, y길이 받아오기
        self.oX, self.oY = self.obj.get_size()
    
    #blit
    def show(self):
        screen.blit(self.obj, (self.x, self.y))

이렇습니다.

 

이제 만든 class를 이용해서 캐릭터를 불러오도록 하겠습니다.

 

#캐릭터 경로 설정
hero = pygame.image.load(r'image\blackEagle.png').convert_alpha()
#캐릭터 크기 설정
hero = pygame.transform.scale(hero, (40,70))
#캐릭터 x,y길이 가져오기
heroSizeX,heroSizeY = hero.get_size()
#캐릭터 위치 설정
heroX = round(size[0]/2) - round(heroSizeX/2) - 0.1
heroY = size[1] - 50 - heroSizeY

.
.
.

    #캐릭터 띄우기
    screen.blit(hero, (heroX,heroY))

기존의 코드를 class를 이용해서 다시 불러오도록 하면

 

hero = createObj()
#캐릭터 경로 설정
hero.insertImg(r'image\blackEagle.png')
#캐릭터 크기 설정
hero.setSize(40,70)
#캐릭터 위치 설정
hero.x = round(size[0]/2 - hero.oX/2)
hero.y = size[1] - 50 - hero.oY

.
.
.

    #캐릭터 띄우기
    hero.show()

이런식으로 사용할 수 있겠습니다.

 

실행해보면 여전히 잘 나오는 모습입니다.

 

 

 

import pygame

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


# 2. 게임 창 옵션 설정

#크기 설정
size = [800,1000]                         
screen = pygame.display.set_mode(size)

 #제목 설정
title = "Korea 1947"                    
pygame.display.set_caption(title)        



# 3. 게임 내 필요한 설정

#시계 만들기
clock = pygame.time.Clock()              

#배경 색 지정
gray = (80,80,80)                        
color = gray

#클래스 생성
class createObj:
    #생성자
    def __init__(self):
        self.x = 0
        self.y = 0
    #캐릭터 입력
    def insertImg(self, addr):
        if addr[-3:] == 'png':
            self.obj = pygame.image.load(addr).convert_alpha()
        else:
            self.obj = pygame.image.load(addr)
        #캐릭터 x길이, y길이 받아오기
        self.oX, self.oY = self.obj.get_size()
        
    #사진 사이즈 설정
    def setSize(self, oX, oY):
        self.obj = pygame.transform.scale(self.obj, (oX, oY))
        #캐릭터 x길이, y길이 받아오기
        self.oX, self.oY = self.obj.get_size()
    
    #blit
    def show(self):
        screen.blit(self.obj, (self.x, self.y))

hero = createObj()
#캐릭터 경로 설정
hero.insertImg(r'image\blackEagle.png')
#캐릭터 크기 설정
hero.setSize(40,70)
#캐릭터 위치 설정
hero.x = round(size[0]/2 - hero.oX/2)
hero.y = size[1] - 50 - hero.oY



# 4. 메인 이벤트
#버튼 누르면 XB값이 0이되어 종료
XB = 1
#XB가 1이 아니라면 while문 종료
while XB == 1:
    
    # 4-1. FPS 설정
    
    #FPS 설정 초당 반응 수
    clock.tick(60)                       


    # 4-2. 각종 입력 감지
    
    #입력 감지
    for event in pygame.event.get():
        #입력이 들어오면 종료
        if event.type == pygame.QUIT:
            XB=0
    
    
    
    # 4.3 입력과 시간에 따른 변화

    
    
    # 4-4 그리기
    
    #화면 색 채우기
    screen.fill(color)
    
    #캐릭터 띄우기
    hero.show()
    
    

    # 4-5 업데이트
    
    #screen 상태 업데이트
    pygame.display.flip()                
    
    
    

# 5 게임 종료 
pygame.quit()

오늘까지의 코드 입니다.

728x90
반응형