C#/텍스트 게임 "Shelter"

팀 프로젝트 - 캐릭터 생성하기

홍삼맛 2023. 11. 16. 16:15

📌 팀 프로젝트

  • 개인 과제를 마치고, 일주일 간 팀 프로젝트로 같이 협업하는 기간을 주었다
  • 그런데 나는 다음주에 동원 훈련이 예정돼 있어, 3일에 시간안에 필수 기능을 구현해야 한다.

 

📌 캐릭터 생성

📄 CreateCharacterScene.cs

// 캐릭터 생성 씬
public class CreateCharacterScene : Scene
{
    // 단계별 캐릭 생성
    private enum CreateStep
    {
        Name,
        Job,
        Exit
    }
    
    private CreateStep currentStep = CreateStep.Name;  // 현 단계
    private string errorMessage = string.Empty;        // 에러 메세지
    private string createName = string.Empty;	       // 이름 생성
    private Character selectedJob;                     // 선택된 직업
}
  • CreateStep 열거형을 만들어 단계별로 생성 할 수 있는 기반을 만든다.
  • 올바른 입력을 아닐 시 errorMessage 출력
  • 지금 생성할 기능은 이름 짓기와 직업 선택 
// 팀원이 만든 매서드 오버라이드
public override void EnterScene()
{
    do
    {
        DrawStep();
    }
    while (ManageInput());
}

// 키 조작 관리
private bool ManageInput()
{
    switch (currentStep)
    {
    	// 이름 짓기 단계
        case CreateStep.Name:
            ReadName();
            break;
        // 직업 선택 단계
        case CreateStep.Job:
            ReadJob();
            break;
        default:
            throw new ArgumentOutOfRangeException();
    }
    
    bool isExit = (currentStep != CreateStep.Exit);
    return isExit;
}
  • 처음 씬에 진입 시, do-while을 통해 currentStep에 따라서 DrawStep을 불러온다.
  • ManageInput에서도 currentStep에 따라서 캐릭 생성에 필요한 Read 매서드를 불러온다.
  • 그리고 현 단계가 CreateStep.Exit에 도달할 시, do-while문에서 탈출. 다음 씬으로 넘어간다.
// 올바른 이름을 입력했는지 체크하고, 이름을 변경합니다.
public void OnNameChanged(string? name)
{
    if (string.IsNullOrEmpty(name))
    {
        errorMessage = "오류: 이름을 입력해 주세요.";
        return;
    }
    
    if (Renderer.GetPrintingLength(name) > 10)
    {
        errorMessage = "오류: 이름이 너무 깁니다. 10글자 이내로 작성해 주세요.";
        return;
    }

    // 이름 결정
    createName = name;
    NextStep();
}

// 올바른 직업을 선택했는지 체크하고, 직업을 선택합니다.
public void OnJobChanged(string? job)
{
    if (string.IsNullOrEmpty(job))
    {
        errorMessage = "오류: 숫자를 입력해 주세요.";
        return;
    }

    bool isInt = Int32.TryParse(job, out int idx);
    
    if (!isInt)
    {
        errorMessage = "오류: 숫자가 아닌 문자를 입력했습니다. 다시 입력해 주세요.";
        return;
    }
    
    if (idx < 0 || idx > 2)
    {
        errorMessage = "오류: 선택지 범위 내의 숫자를 입력해 주세요.";
        return;
    }
    
    // 직업 결정
    selectedJob = jobs[idx];
    NextStep();
}

// 다음 단계로 넘어가기
private void NextStep()
{
    errorMessage = string.Empty;
    currentStep += 1;
    
    // 끝 단계 도달 시 캐릭 생성
    if (currentStep == CreateStep.Exit)
    {
        CreateCharacter();
    }
}
  • ReadName, ReadJob에서 입력한 문자에 따라 올바르게 입력했는지 OnNameChanged, OnJobChanged에서 확인
  • 기본적으로 그냥 빈 문자열 입력시 예외 처리 하였고, 이름은 특정 길이 이상이면 제한을 두거나, 직업은 특정 숫자를 입력하지 않을 시 예외 처리를 두었다
  • 올바르게 입력 시, 캐릭터 이름, 직업을 결정하고 NextStep으로 넘어간다.
  • 기본적으로 열거형 멤버에 연결된 상수 값은 int 형식인걸 활용해 하나씩 더하여 단계를 올리고, 마지막 단계에 도달 시, 캐릭터를 생성한다.

 

💡 결과 화면

캐릭터 이름 짓기

 

캐릭터 직업 선택

 

캐릭터 생성 결과