본문 바로가기
개발 일지

파이게임으로 RPG 만들기 #03. 카메라

by PrintedLove 2021. 5. 6.

 

안녕하세요. Printed 입니다. 벌써 세 번째 일지네요!

이번 일지에서는 고정되어있던 시점을 자유롭게 해줄 카메라 기능을 추가해 보았습니다!

 

영상 먼저 보시죠!

 

 

카메라 기능 자체는 단순합니다.

출력 화면 부분의 좌표를 캐릭터 좌표에 따라 움직이게금 조정해준게 다입니다.

 

오히려, 코드 자체는 로그라이크 맵을 위한 랜덤 바닥 타일 생성 함수가 더 잡아먹었습니다...

 

# 맵 데이터 생성 함수
def createMapData():
    ground_baseheight = 16
    ground_interval = 0      # 바닥 간 간격
    ground_maxsize = random.randrange(13, 24)     # 바닥 최대 크기
    ground_maxsize_count = 0
    ground_size = random.randrange(2, 5)             # 바닥 단위 크기
    ground_size_count = 0
    ground_height = ground_baseheight + random.randrange(-2, 3)           # 바닥 높이
    ground_heightChange = 0
    ground_mode_stack = 1       # 큰 크기 스택 (큰 크기 1~4개 생성 후 작은 크기 1개 생성)
    ground_mode_stackMax = random.randrange(2, 6)

    for i in range(TILE_MAPSIZE[0] - 1):
        if ground_interval > 0:         # 바닥 간격 띄우기
            floor_map[i] = -1
            ground_interval -= 1
        else:
            if ground_maxsize_count < ground_maxsize:
                if ground_size_count < ground_size:
                    if ground_maxsize_count == 0 and ground_size > 2:                     # 바닥 시작 처리
                        floor_map[i] = ground_height + ground_heightChange + random.choice([0, 1])
                        ground_size_count += 1
                    else:
                        floor_map[i] = ground_height + ground_heightChange
                        ground_size_count += 1
                else:
                    if ground_maxsize_count == ground_maxsize - 1:      # 바닥 끝 처리
                        if floor_map[i - 2] == floor_map[i - 1]:
                            floor_map[i] = ground_height + ground_heightChange + random.choice([0, 1])
                        else:
                            floor_map[i] = floor_map[i - 1]

                        ground_size_count += 1
                    else:
                        ground_size_count = 0
                        ground_size = random.randrange(2, 5)
                        ground_heightChange += random.choice([0, 1])
                        
                        if abs(ground_heightChange) > 2:
                            ground_heightChange -= ground_heightChange // 3

                        floor_map[i] = ground_height + ground_heightChange

                ground_maxsize_count += 1
            else:               # 바닥 완성시 다음 바닥 크기 및 간격 크기 처리
                if ground_mode_stack < ground_mode_stackMax:    # 큰 크기
                    ground_mode_stack += 1

                    if ground_mode_stack == 1:
                        ground_interval = random.randrange(2, 6)
                    else:
                        ground_interval = random.randrange(1, 4)

                    ground_maxsize = random.randrange(13, 25)
                    ground_size = random.randrange(2, 9)
                else:                                           # 작은 크기
                    ground_mode_stack = 0
                    ground_mode_stackMax = random.randrange(2, 6)
                    ground_interval = random.randrange(2, 6)
                    ground_maxsize = random.randrange(4, 9)
                    ground_size = random.randrange(2, 5)

                ground_height = ground_baseheight + random.randrange(-1, 1)
                ground_heightChange = 0
                ground_maxsize_count = 0
                ground_size_count = 0

 

이 함수로 생성된 1차원 높이 데이터를 이전 일지에서 만든 맵 이미지 생성 함수가 받아 바닥 타일의 통짜 이미지를 만들어 냅니다.

타일 형식으로 하나하나 그릴 수도 있었는데, 최대한 프레임당 연산을 줄여보려고 게임 실행과 동시에 단 한번의 계산으로 바닥을 그려보고자 만든 함수들입니다.

지금 다시 보면... 성능 차이가 의미 있을 정도로 크게 나지는 않는것 같네요.

 

자세한 코드는 아래 깃허브 링크에서 확인하실 수 있습니다!

 

PrintedLove/Python-pygame-RPG-tutorial

파이게임 라이브러리로 만드는 RPG 프로젝트. 블로그에서 개발일지를 확인하실 수 있습니다. - PrintedLove/Python-pygame-RPG-tutorial

github.com

 

댓글