Core

Core.cs

  • 게임이 구동 되는 주축 클래스이다.
private bool isRun = true;
public bool IsRunning
{
    get { return isRun; }
    set { isRun = value; }
}
  • IsRunning을 통해 내부에서 게임을 종료 할 수단 제공.
public void init()
{
    character = Character.GetInst();
    itemInit();
}
  • 각종 Item들을 초기화한다.
// 계속 반복되는 메서드
public void Update()
{
    // Scene 진입
    currentScene.Enter();

    // 다음 Scene 지정
    Scene nextScene = currentScene.Exit();
    currentScene = nextScene;
}
  • 간단한 게임 구조이다
  • currentScene.Enter()를 통해 Scene에 진입
  • currentScene.Exit()을 통해 다음 Scene 반환
  • Update() 메서드 재 실행으로 계속 반복

StartScene

image-20250204164904307

StartScene.cs

Singleton

세부 Scene들은 Singleton으로 구현해 서로 땡겨다 쓸수 있도록 작성 했다.

internal class StartScene : Scene
{
        // Singleton
        private StartScene() { }
        private static StartScene? instance;
        public static StartScene GetInst()
        {
            if (instance == null)
                instance = new StartScene();
            return instance;
        }
    	// 싱글톤 객체 사용
        Character character = Character.GetInst();
}
  • Character 객체도 같은 방식으로 구성해서 위와 같은 방법으로 가져다 사용한다.
  • 생성자를 private으로 만들어, 외부에서 생성 할 수 없도록 구현.
  • instance 필드에는 자기 자신 객체를 가르킨다.

Enter()

public override void Enter()
{
    Clear();
    nextScene = this;


    Console.WriteLine("RPG 마을에 오신 여러분 환영합니다.");
    Console.WriteLine("이곳에서 던전으로 들어가기전 활동을 할 수 있습니다.\n");

    Console.WriteLine("1. 상태보기");
    Console.WriteLine("2. 인벤토리");
    Console.WriteLine("3. 상점");
    Console.WriteLine("4. 던전 들어가기");
    Console.WriteLine("5. 휴식");


    Console.WriteLine("\n\n0. 게임 종료");

    Console.WriteLine("\n원하시는 행동을 입력해주세요.\n");


    string result = Console.ReadLine();

    switch (result)
    {
        case "0":
            Clear();
            // 게임 종료
            Core.GetInst().IsRunning = false;
            break;
        case "1":
            // StatusScene
            nextScene = StatusScene.GetInst();
            break;
        case "2":
            // InventoryScene
            nextScene = InventoryScene.GetInst();
            break;
        case "3":
            // ShopScene
            nextScene = ShopScene.GetInst();
            break;
        case "4":
            // DungeonScene
            nextScene = DungeonScene.GetInst();
            break;
        case "5":
            // RestScene
            nextScene = RestScene.GetInst();
            break;

        case "debug":
            // DebugMode
            DebugMode();
            break;

        default:
            // 지금 Scene 재반환 및 화면 정리
            Console.WriteLine("올바른 값을 입력하세요.");
            Thread.Sleep(1000);
            break;
    }
}
  • 이번 게임은 반응형 게임으로 제작해, 위가 기본 틀이다.
  • 각 Scene에 접근하기 위해 Enter()메서드를 활용한다.
  • switch-case를 활용해 각각의 다른 Scene으로 이동한다.

Exit()

public override Scene Exit()
        {
            return nextScene;
        }
  • nextScene필드는 상위 객체인 Scene객체로부터 상속 받은 필드이다.
  • 다음 Scene을 지정해 반환해 준다.

StatusScene

image-20250204172848576

StatusScene.cs

switch (result)
{
    case "0":
        // StartScene
        nextScene = StartScene.GetInst();
        break;

    case "1":
        // 이름 변경
        Clear();
        Console.WriteLine("변경할 이름을 입력하세요.");
        character.Name = Console.ReadLine();

        Console.WriteLine($"이름이 '{character.Name}'로 변경되었습니다.");
        Thread.Sleep(1000);
        break;

    default:
        // 지금 Scene 재반환 및 화면 정리
        Console.WriteLine("올바른 값을 입력하세요.");
        Thread.Sleep(1000);
        break;
}
  • 해당 Scene에서 이름을 변경 할 수 있도록 제작.
  • Thread.Sleep()으로 화면이 초기화 되는 것에 딜레이 제공.

InventoryScene

image-20250204173040131

printItem()

private void printItem()
{
    Core core = Core.GetInst();
    // item 출력
    int count = 0;
    for (int i = 0; i < core.items.Count; i++)
    {
        // 장비 장착 옵션
        string equip = "   ";
        // 공격력 or 방어력
        string AorD = "";
        if (core.items[i].Own)
        {
            // 방어 장비
            if (core.items[i].Defense > 0)
            {
                AorD = $"방어력 +{core.items[i].Defense}";
            }
            // 공격 장비
            else if (core.items[i].Attack > 0)
            {
                AorD = $"공격력 +{core.items[i].Attack}";
            }
            // 장비 장착 유무
            if (core.items[i].Equip)
            {
                count++;
                equip = "[E]";
                Console.WriteLine($" -{equip}{core.items[i].Name} | {AorD} | {core.items[i].Description}");
            }


        }
    }
}
  • 장비 장착 유무를 통해 아이템을 출력한다.

EquipmentScene

EquipmentScene.cs

image-20250204173327359

SetItemToggle

private void SetItemToggle(int idx)
{
    Item item = core.items[idx];
    // 아이템 장착 토글
    bool equip = item.Equip ? false : true;

    Item prevItem;
    // 아이템 타입별 한종류만 장착
    if (item.ItemTYPE == ITEMTYPE.Weapon)
    {
        // 무기일 때
        prevItem = character.Weapon;
        if (prevItem != null)
        {
            // 이전 장비 해제
            MountItem(prevItem, false);
            character.Weapon = null;
        }

    }
    else if (item.ItemTYPE == ITEMTYPE.Armor)
    {
        // 갑옷일 때
        prevItem = character.Armor;
        if (prevItem != null)
        {
            // 이전 장비 해제
            MountItem(prevItem, false);
            character.Armor = null;
        }
    }

    MountItem(item, equip);
}
  • 아이템을 idx로 받아, 장착 또는 해제 하는 메서드이다.
  • ITEMTYPE.Weapon을 통해 무기, 방어구를 구분한다.
  • character.Weapon 또는 character.Armor를 통해 중복 착용을 막는다.

MountItem

public void MountItem(Item item, bool equip)
{
    // 아이템 성능 적용
    if (equip)
    {
        character.Attack += item.Attack;
        character.Defense += item.Defense;
    }
    else
    {
        character.Attack -= item.Attack;
        character.Defense -= item.Defense;
    }

    item.Equip = equip;

    if (item.ItemTYPE == ITEMTYPE.Weapon)
        character.Weapon = item;
    if (item.ItemTYPE == ITEMTYPE.Armor)
        character.Armor = item;
}
  • 장착 또는 해제의 경우에 아이템의 성능을 characer에 적용 시키는 메서드다.
  • 장착 때는 +, 해제 때는-
  • character.Weapon, 와 character.Armor에 착용 중인 무기와 방어구를 지정한다.

Item

Item.cs

  • 아이템 관리를 위해 만든 객체
  • 아이템들의 여러 요소들을 가진다.
internal class Item : Object
{
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    public int Defense { get; set; }
    public int Attack { get; set; }
    public string? Description { get; set; }
    public int Gold { get; set; }
    public bool Equip { get; set; }
    public bool Own {  get; set; }
    public ITEMTYPE ItemTYPE { get; set; }
}

ITEMTYPE

  • 개인 프로젝트를 하며, 이제껏 사용해 보지 못한 기능들을 사용해보기 위해, 사용해본 enum이다.
  • 무기, 방패 등 아이템 타입을 지정 할 enum 값들을 저장한다.
enum ITEMTYPE
{
    None,
    Weapon,
    Armor,
}

C#과 친해지기 위해 평소에 써보지 못했던 enum이나 singleton 등 여러 요소를 일부러 섞어 사용해봤다.

그럼에도 불구 하고 인터페이스는 아직도 개념 이해가 부족해 요번에는 사용하지 못했다.

다음 기회가 있겠지 뭐.

댓글남기기