본문 바로가기
  • 식초 한잔 할래..?
공부/게임 공부

TextRPG 중앙관리형으로 인터페이스 주기

by 돼지피그푸곰 2025. 10. 15.

 

오늘은 각 Scene을 병합하고, UI를 개선하는 작업을 했습니다.

 

우선 첫 번째로 제 머릿속에는 Scene별로 Unity처럼 장면 전환하는 구도가 어느 정도 잡혀 있었고, 그걸 첫째 날에 공유를 했지만, 팀원 모두가 완전히 이해한 느낌은 아니었습니다.

 

다만 merge하는 과정에서 제가 고치면 되니까 괜찮겠지 싶었습니다.

 

다만 본인이 만든 코드가 제대로 작동하는지 실행을 원하는 팀원들이 있어서, 이 부분에 대해 어떻게 설명을 해야 할까 약간 어려움이 있었습니다.

 

확실히 초반에 구조를 담당한 만큼 제대로 구조에 대한 설명과 지켜야할 규칙 등을 확실히 정하고 갔어야 한다는 느낌이 듭니다.

때문에 이해를 위해 간단한 구조체를 만들었습니다.

 

현재 만들고 있는 프로젝트의 구조입니다.

 

프로젝트의 분량 자체는 굉작히 작습니다. 혼자서 하면 아마 반나절이면 다 만들 수 있는 양일거에요. 때문에 미래에 있을 협업을 제대로 공부하는 시간을 갖자는게 이번 팀 프로젝트의 궁극적 목표로서, 구조에 대한 이해와 확장성 있는 방식을 택해서 코드를 짜 보았습니다.

 

저 같은 경우도 구조체에 대 해서 완벽히 이해하지를 못했기 때문에 좋은 기회라 생각하고 하고 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
using System;
using Tema8Project.Data;
using TxtRPG.Data;
 
namespace TxtRPG.Game
{
    public interface Iscene
    {
        object Run(GameData data);
    }
}
cs

 

 

그런 의미로 GamaManager가 장면 전환을 담당하고 있고, 코드를 간단하게 만들기 위해 Iscene이라는 클래스를 하나 만들어서 각 Scene들에게 상속시켜 주었습니다.

 

각 Scene들은 Iscene이 정한 규칙에 따라 함수를 만들어야 하는데, Battle함수를 만드는 과정에서 새로운 매개변수인 Monster와 기존에 가지고 있던 방대한 자료를 브랜치에 새로 병함하면서 Item, Inventory라는 매개변수가 새로 생기게 되었습니다.

 

때문에 처음 Iscene의 규칙대로 함수를 만들면

Run(Player player, Monster monter Item item Inventory inven) 이런식으로 매우 길어졌을 것입니다.

때문에 매개변수들을 모아둔 Data에 있는 클래스들을 관리해줄 클래스인 GameData클래스를 하나 만들어서 위와 같이 object Run(GameData data);

한 줄만 넣으면 되게 만들어 주었습니다.

 

각자가 만든 코드를 받아서 병합하는걸 담당했으며, 대부분이 경로 문제로 오류가 났었기 때문에, 그 오류를 해결하는 과정에서 구조체에 대한 이해가 꽤나 많이 상승한 것 같습니다.

 

그 다음으로 남는 시간에는 UIManager를 만들었습니다.

 

이미 모두가 어느 정도 다 만진 TitleScene을 테스트 삼아서 UIManager를 만들어 보았고, 대부분 처음 써 보는 기능들이었습니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        public static void PrintCenter(string text)
        {
            int width = Console.WindowWidth;
            int displayLength = 0;
 
            foreach (char c in text)
            {
                
                if(( c >= 0xAC00 && c <= 0xD7A3|| ( c > 127))
                {
                    displayLength += 2;
                }
                else
                {
                    displayLength += 1;
                }
            }
            int padding = Math.Max((width - displayLength) / 20);
            Console.SetCursorPosition(padding, Console.CursorTop);
            
 
 
cs

            

 

중앙정렬해주는 UI입니다. 이렇게 만들어 놓고 사용할 때는 UIManager.PrintCenter() 로 ConsoleWrite처럼 사용하면 자동으로 중앙정렬이 되고, 그 외에도 색 지정, 타이틀 등의 규격화 등을 만들었습니다.

 

만들다 보니 욕심이 생겨서, 창을 움직일 때도 가운데 정렬이 되도록 만들어 봤습니다. 

Console.SetCursorPosition(promptPos, Console.CursorTop);

주로 이용한건 커서 위치 조정하는 것과, 그 커서를 어디에다가 할지에 대한 위치 조정입니다.

 int promptPos = Math.Max((Console.WindowWidth / 2) - 2, 0);

전체 윈도우 창의 반 정도 사이즈를 한 후에 위치를 조정했습니다.

 

다만 이렇게 하면 출력 후 창을 움직일 때 다시 가운데 정렬이 깨집니다.

때문에 while문을 이용해서 창의 크기를 계속해서 감시하고, 계속 화면 안에 있는 정보들을 지웠다 썼다 하게 했습니다.

 

창의 크기가 바뀌면 화면 안에 있는 글들이 지워지고 다시 자동정렬로 표시가 되죠.

 

하지만 무언가를 입력하는 순간 이 기능이 멈추거나, 멈추지 못하게 하려면 입력이 안되는 버그가 발생했습니다.

 

해결은 못했습니다.

 

 

대부분의 시간을 받은 코드 병합, 정리, UI개선, git 관리 등으로 사용한 것 같습니다.

덕분에 구조체에 대한 이해는 확실히 되는 하루였습니다.

 

왜 존댓말을 쓰고 있죠

'공부 > 게임 공부' 카테고리의 다른 글

간단한 [TextRPG] 만들기  (0) 2025.10.21
Text RPG의 콘솔창 항상 중앙정렬 시키기  (1) 2025.10.16
팀 프로젝트 구조 설계  (1) 2025.10.14
C#으로 간단한 게임 만들기  (0) 2025.10.13
Text-RPG 만들어 보기  (1) 2025.10.02