🙆♂️ 클래스화
저번 게시글에서 캐릭터를 추가하는데 너무 많은 코드가 늘어났습니다.
앞으로도 다양하게 추가해야할 부분들이 많을텐데 그 때마다 이런식으로 하기에는 너무 힘듭니다.
그렇기 때문에 클래스를 사용해서 겹치는 코드들은 간단하게 표현하도록 하겠습니다.
#클래스 생성
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()
오늘까지의 코드 입니다.
'앱 개발 > pygame' 카테고리의 다른 글
[pygame] 06. 총알 쏘기 (1) | 2022.09.22 |
---|---|
[pygame] 05. 캐릭터 움직이기 (0) | 2022.09.22 |
[pygame] 03. 캐릭터 넣기 (0) | 2022.09.17 |
[pygame] 02. 게임 초기 설정 2 (0) | 2022.09.13 |
[pygame] 01. 게임 초기화와 게임 초기 설정 (0) | 2022.09.05 |