작성
·
69
0
오늘은 제가 캐릭터를 2.5d 풍으로 8방향으로 움직일 수 있는 게임을 만들었습니다!
캐릭터가 움직이는 방향은 8가지이며, 애니메이션 세트도 8개를 만들었습니다!
앞/뒤로 움직일 때는 원근법을 통해 이미지를 확대/축소할 수도 있습니다!
이 프로그램이 더 견고해지려면 어떻게 해야 되나요?
import pygame
import sys
WHITE=(255,255,255)
screenx=1280
screeny=720
originalchar=None
def drawobject(obj,x,y):
global screen
screen.blit(obj,(x,y))
def initgame():
global screen,fps,bg,iback,ileft,iright,ifront,mleft,mright,mfront,mback
pygame.init()
screen=pygame.display.set_mode((screenx,screeny))
bg=pygame.image.load('리소스/background.png')
iback=True
ifront=False
ileft=False
iright=False
mleft=False
mright=False
mback=False
mfront=False
pygame.display.set_caption('제목 뭐하지')
fps=pygame.time.Clock()
def initchar():
global charidle,charidlel,charidler,charidlef,charidlelf,charidlerf,charidlelb,charidlerb,charmoveright,charmoveleft,charmoveback,charmovefront,charmovelf,charmoverf,charmovelb,charmoverb
charidle=pygame.image.load('리소스/char/charidle.png')
charidlel=pygame.image.load('리소스/char/charidleleft.png')
charidler=pygame.image.load('리소스/char/charidleright.png')
charidlef=pygame.image.load('리소스/char/charidlefront.png')
charidlelf=pygame.image.load('리소스/char/charidlefl.png')
charidlerf=pygame.image.load('리소스/char/charidlerf.png')
charidlelb=pygame.image.load('리소스/char/charidlelb.png')
charidlerb=pygame.image.load('리소스/char/charidlerb.png')
charmoveright=[]
charmoveleft=[]
charmoveback=[]
charmovefront=[]
charmovelf=[]
charmoverf=[]
charmovelb=[]
charmoverb=[]
for i in range(0,26):
charmoveright.append(pygame.image.load('리소스/char/charmoveright/{}.png'.format(str(i))))
charmoveleft.append(pygame.image.load('리소스/char/charmoveleft/{}.png'.format(str(i))))
charmoveback.append(pygame.image.load('리소스/char/charmoveback/{}.png'.format(str(i))))
charmovefront.append(pygame.image.load('리소스/char/charmovefront/{}.png'.format(str(i))))
charmovelf.append(pygame.image.load('리소스/char/charmovelf/{}.png'.format(str(i))))
charmoverf.append(pygame.image.load('리소스/char/charmoverf/{}.png'.format(str(i))))
charmovelb.append(pygame.image.load('리소스/char/charmovelb/{}.png'.format(str(i))))
charmoverb.append(pygame.image.load('리소스/char/charmoverb/{}.png'.format(str(i))))
def rungame():
global screen,fps,bg,charidle,charidlel,charidler,mleft,mright,mfront,mback,iback,ileft,iright,ifront,originalchar
charsize=charidle.get_rect().size
charwidth=charsize[0]
charheight=charsize[1]
x=screenx/2
y=screeny-charheight
charX=0
charY=0
changecharsize=0
charani=0
done=False
while not done:
for event in pygame.event.get():
if event.type in [pygame.QUIT]:
pygame.quit()
sys.exit()
if event.type in [pygame.KEYDOWN]:
if event.key==pygame.K_LEFT:
mleft=True
mright=False
iback=False
ileft=False
iright=False
ifront=False
charX-=12
elif event.key==pygame.K_RIGHT:
mleft=False
mright=True
iback=False
ileft=False
iright=False
ifront=False
charX+=12
elif event.key==pygame.K_UP:
mfront=True
mback=False
iback=False
ifront=False
ileft=False
iright=False
charY-=0.25
changecharsize-=8
elif event.key==pygame.K_DOWN:
mfront=False
mback=True
iback=False
ifront=False
ileft=False
iright=False
charY+=0.25
changecharsize+=8
if event.type in [pygame.KEYUP]:
if event.key==pygame.K_LEFT:
mleft=False
mright=False
mfront=False
mback=False
ileft=True
iright=False
charX=0
elif event.key==pygame.K_RIGHT:
mleft=False
mright=False
mfront=False
mback=False
ileft=False
iright=True
charX=0
elif event.key==pygame.K_UP:
mleft=False
mright=False
mfront=False
mback=False
ifront=True
iback=False
charY=0
changecharsize=0
elif event.key==pygame.K_DOWN:
mleft=False
mright=False
mfront=False
mback=False
ifront=False
iback=True
charY=0
changecharsize=0
drawobject(bg,0,0)
x+=charX
if x<-120:
x=-120
elif x>screenx-charwidth+120:
x=screenx-charwidth+120
y+=charY
if y<535-charheight:
y=535-charheight
changecharsize=0
elif y>720-charheight:
y=720-charheight
changecharsize=0
charwidth+=changecharsize
charheight+=changecharsize
if charani>25:
charani=6
if mleft==True:
if mfront==True:
char=charmovelf[charani]
elif mback==True:
char=charmovelb[charani]
else:
char=charmoveleft[charani]
charani+=1
elif mright==True:
if mfront==True:
char=charmoverf[charani]
elif mback==True:
char=charmoverb[charani]
else:
char=charmoveright[charani]
charani+=1
elif mfront==True:
if mleft==True:
char=charmovelf[charani]
elif mleft==True:
char=charmoverf[charani]
else:
char=charmovefront[charani]
charani+=1
elif mback==True:
if mleft==True:
char=charmovelb[charani]
elif mleft==True:
char=charmoverb[charani]
else:
char=charmoveback[charani]
charani+=1
else:
if iback==True:
if ileft==True:
char=charidlelb
elif iright==True:
char=charidlerb
else:
char=charidle
elif ileft==True:
if ifront==True:
char=charidlelf
elif iback==True:
char=charidlelb
else:
char=charidlel
elif iright==True:
if ifront==True:
char=charidlerf
elif iback==True:
char=charidlerb
else:
char=charidler
elif ifront==True:
if ileft==True:
char=charidlelf
elif iright==True:
char=charidlerf
else:
char=charidlef
charani=0
originalchar=char.copy()
if charwidth != 360 or charheight != 360:
char = pygame.transform.smoothscale(originalchar,(charwidth, charheight))
drawobject(char,x,y)
pygame.display.update()
fps.tick(60)
pygame.quit()
initgame()
initchar()
rungame()
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. kimexetrme0603님의 2.5D 스타일로 8방향 이동이 가능한 게임 개발에 대한 질문을 주셨군요! 코드를 잘 살펴본 결과, 몇 가지 개선사항을 제안드릴 수 있겠습니다.
캐릭터의 방향과 이동 상태 관리: 현재 캐릭터의 방향과 이동 상태를 개별적인 변수로 관리하고 있습니다. 이는 코드의 복잡도를 높일 수 있으므로 enum
이나 상태 관리 클래스를 만들어서 이동 상태를 더 효율적으로 관리할 수 있습니다.
애니메이션 프레임 관리: 코드에서 애니메이션 프레임을 for
문으로 불러오고 있고, charani
변수를 활용해 현재 프레임을 관리하고 있습니다. 이 방법은 애니메이션 갱신 속도가 프레임레이트에 크게 종속되어 있어, 따로 애니메이션 속도를 조절하기 어렵습니다. 게임의 dt
(delta time)를 계산하고 이것을 활용하여 보다 정교한 애니메이션 속도를 제어할 수 있습니다.
프레임 갱신과 논리 분리: 현재 rungame()
함수 안에서 게임의 논리 처리와 프레임 갱신이 동일한 루프에서 이루어지고 있습니다. 이를 논리 처리(logic update)와 화면 갱신(render update)으로 분리하여 독립적인 속도로 처리하는 것이 좋습니다.
입력 처리의 개선: 키 입력 처리 방식이 현재는 키가 눌릴 때마다 이동을 시작하고, 키에서 손을 떼면 멈추도록 설정되어 있습니다. 캐릭터의 이동이 자연스럽게 보이려면, 키가 눌린 상태를 지속적으로 체크하고, 이동 중인지 아닌지를 판단하는 논리를 추가하는 것이 중요합니다.
코드 최적화: pygame.image.load
같은 자원 로딩 작업은 게임의 초기화 단계에서 한 번만 수행하고, 게임 중에는 이를 재사용하는 것이 좋습니다. 리소스 로딩은 시간이 많이 소요되는 작업으로 게임 성능에 영향을 줄 수 있습니다.
이외에도 적절한 주석 추가, 함수 분리 및 모듈화, 혹은 코드에 예외 처리를 추가하는 것도 프로그램의 견고성을 높이는 데 도움이 됩니다. 게임 개발시 디버깅 과정에서 버그를 발견하고 해결하는 것이 중요함을 기억하시고, 각 단계에서 테스트를 철저히 수행해 보시길 바랍니다.
좀 더 자세한 설명이 가능할까요?