강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

kimexetrme0603님의 프로필 이미지
kimexetrme0603

작성한 질문수

피드백 요청합니다!

작성

·

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방향 이동이 가능한 게임 개발에 대한 질문을 주셨군요! 코드를 잘 살펴본 결과, 몇 가지 개선사항을 제안드릴 수 있겠습니다.

  1. 캐릭터의 방향과 이동 상태 관리: 현재 캐릭터의 방향과 이동 상태를 개별적인 변수로 관리하고 있습니다. 이는 코드의 복잡도를 높일 수 있으므로 enum이나 상태 관리 클래스를 만들어서 이동 상태를 더 효율적으로 관리할 수 있습니다.

  2. 애니메이션 프레임 관리: 코드에서 애니메이션 프레임을 for 문으로 불러오고 있고, charani 변수를 활용해 현재 프레임을 관리하고 있습니다. 이 방법은 애니메이션 갱신 속도가 프레임레이트에 크게 종속되어 있어, 따로 애니메이션 속도를 조절하기 어렵습니다. 게임의 dt(delta time)를 계산하고 이것을 활용하여 보다 정교한 애니메이션 속도를 제어할 수 있습니다.

  3. 프레임 갱신과 논리 분리: 현재 rungame() 함수 안에서 게임의 논리 처리와 프레임 갱신이 동일한 루프에서 이루어지고 있습니다. 이를 논리 처리(logic update)와 화면 갱신(render update)으로 분리하여 독립적인 속도로 처리하는 것이 좋습니다.

  4. 입력 처리의 개선: 키 입력 처리 방식이 현재는 키가 눌릴 때마다 이동을 시작하고, 키에서 손을 떼면 멈추도록 설정되어 있습니다. 캐릭터의 이동이 자연스럽게 보이려면, 키가 눌린 상태를 지속적으로 체크하고, 이동 중인지 아닌지를 판단하는 논리를 추가하는 것이 중요합니다.

  5. 코드 최적화: pygame.image.load 같은 자원 로딩 작업은 게임의 초기화 단계에서 한 번만 수행하고, 게임 중에는 이를 재사용하는 것이 좋습니다. 리소스 로딩은 시간이 많이 소요되는 작업으로 게임 성능에 영향을 줄 수 있습니다.

이외에도 적절한 주석 추가, 함수 분리 및 모듈화, 혹은 코드에 예외 처리를 추가하는 것도 프로그램의 견고성을 높이는 데 도움이 됩니다. 게임 개발시 디버깅 과정에서 버그를 발견하고 해결하는 것이 중요함을 기억하시고, 각 단계에서 테스트를 철저히 수행해 보시길 바랍니다.

좀 더 자세한 설명이 가능할까요?

kimexetrme0603님의 프로필 이미지
kimexetrme0603

작성한 질문수

질문하기