[TIL] C# - 콘솔창 꾸미기 (2)

MINO·2024년 5월 1일
0
post-thumbnail

2024-05-01

퀘스트 구현을 담당하여 하루종일 고민하고 코드를 썼다 지웠다.
상속 클래스의 구조와 구현에 대한 궁금증이 생겨 튜터님께 질문하러 갔지만, 머리 속에 있는 것들을 정리하여 표현하기가 어려웠다.

라는 답변을 받았고, 가장 작은 단위에서부터 시작하다보니 구현하고자 했던 방향으로 로직을 짤 수 있었다.


콘솔창 꾸미기 함수화

지난 TIL 에서 구현한 애니메이션? 기능에 대한 추가 작업을 진행했다.

각자의 코드를 합치기 전에, 팀원들에게 간단히 기능과 구현 설명을 해주었는데 팀원들도 필요한 곳에 해당 코드를 적용하면 좋을 것 같아서
ConsoleUtility.cs 스크립트에 Animation( ) 를 추가했다.


구현하게 된 이유

처음 저 기능을 구현한 이유는
플레이어의 깎인 HP 를 휴식하기 를 통해 최대 HP 로 점차 증가시키는 것이었다.

다른 팀원이 사용하기 위해 커서 위치 값 (left, top) , 시작점(start), 목표치(target) 를 매개변수로 설정하였다.


구현 코드

internal static void Animation(int left, int top, int start, int target)
{
    // 시작점 -> 목표치까지 50ms 마다 1 씩 증가
    while(start < target)
    {
        Thread.Sleep(50);
        start++;
        Console.SetCursorPosition(left, top);
        Console.WriteLine($"{start}");
    }
}

문제점 1

ConsoleUtility.Animation(left, top, GameManager.player.Hp , 100) 을 호출하여 시작점부터 목표치까지 값이 점차 증가하는 애니메이션처럼 잘 출력되었다.

Animation ( ) 함수가 끝났을 때, GameManager.player.Hp 값이 target 값이 되는 것을 예상했지만 그렇지 않았다.


수정 1 및 문제점 2

참조값이 아닌, 값을 전달해줘서 그렇다고 판단하여 ref 키워드를 사용하였다.

internal static void Animation(int left, int top, ref int start, int target)
{
    // 시작점 -> 목표치까지 50ms 마다 1 씩 증가
    while(start < target)
    {
        Thread.Sleep(50);
        start++;
        Console.SetCursorPosition(left, top);
        Console.WriteLine($"{start}");
    }
}

그러나, start 매개 변수에 GameManager.player.Hp 를 ref 값으로 사용할 수 없다는 에러 코드가 발생했다.


수정 2

튜터님께 여쭤본 결과,

GameManager.player.Hp 에 값을 계속 업데이트 해주는 것은 자원 낭비이기도 하므로, 굳이 업데이트 해줄 필요 없이 숫자가 변하는 애니메이션만 보여주고, 마지막에 값만 목표치로 설정해주기로 했다.

그 결과, 원하던 결과를 얻을 수 있었다.

문제점 3

가능한 HP 값은 0~100 이기에, 자연스럽게 증가시키기 위해 50ms 마다 1씩 증가하게끔 값을 설정해주었다.

플레이어가 얻는 골드는 상한선이 없어, 0 Gold 에서 10000 Gold 로 증가하는 애니메이션을 실행하게 되면 500 초가 걸린다.


수정 3

매개 변수로 쓰레드를 잠시 멈추고 기다릴 시간 ms 와 증가하는 구간 seg 를 추가하였다.

프로그래머가 상황에 따라, 적절한 시간과 증감 구간을 입력하면
기대하는 애니메이션을 체험해 볼 수 있을 것이다.

internal static void Animation2(int left, int top, int start, int target, int seg, int t)
{
    // 시작점 -> 목표치까지 (t)ms 마다 seg 씩 증가
    while (start < target)
    {
        Thread.Sleep(t);
        start += seg;
        if (start > target)
            start = target;
        Console.SetCursorPosition(left, top);
        Console.WriteLine($"{start}");
    }
}

TIL 마무리

프로젝트의 필수 기능 및 선택 기능을 대부분 구현하였다.

팀원들과 코드를 합치며 팀원의 효율적인 코드 로직을 보며 신기하기도 하였고, 불안정하거나 예외가 있는 코드는 서로 찾아주기도 하였다.

개인 프로젝트로는 경험해보지 못할 이점 (소통의 중요성과 다른 개발자의 시선과 생각 등) 을 새삼 느꼈다.

같은 꿈을 향해 나아가는 예비 게임 개발 프로그래머들과 함께 팀 프로젝트를 진행하며 더욱 더 발전해야겠다.

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글