TIL 0112 TextRPG (팀) - 4 / 스킬 추가 기능 구현

강성원·2024년 1월 12일
0

TIL 오늘 배운 것

목록 보기
15/70

오늘 개발한 내용

직업별 클래스 구현

Player를 상속시켜서 직업들에 대한 클래스를 구현했다.

  • 그림으로 표현하면 이와 같다.
    바로 본론으로!

우선 메인쪽에서 Warrior를 선택하면 Warrior 클래스의 생성자를 호출한다. 인자로는 사용자가 입력한 이름이다.

switch (input)
{
    case "1":
        player = new Warrior(name);
    
    ,,,생략,,,
}

Warrior 클래스로 설명하기 위해 코드를 가져왔다.

internal class Warrior : Player
{
    public Warrior(string name) : base (1, name, PlayerClass.Worrior, 10, 5, 100, 100, 1500, 0)
    {
        CreateSkills();
    }

    public override void CreateSkills()
    {
        Skills = new List<Skill>() 
        {
            new Skill(this, "알파 스트라이크", 10, 2, "하나의 적을 공격합니다. / 공격력 * 2", 1),
            new Skill(this, "짱센 스트라이크", 20, 1, "둘의 적을 랜덤으로 공격합니다. / 공격력 * 1", 2)
        };
    }

    public override string GetClassName() { return "전사"; }
}
  • Warrior클래스와 같은 직업 클래스에서는 base 클래스의 생성자로 고정된 값을 인자로 주어서 클래스별 능력치의 차별화를 두었다.

  • 스킬을 생성해서 추가하는 CreateSkills도 오버라이딩을 시켜서 클래스마다 다른 스킬을 생성되게 했다.

Warrior 외에도 Magician, Archer, Thief, Deadbeat 클래스 모두 위와 동일한 내용이다.

  • 직업을 선택하면 상태창에서 능력치를 확인할 수 있다.

스킬 사용 시 Mp소모 구현

우선 코드 먼저

public int UseSkill(int originDamage)
{
    Owner.Mp -= Cost;                       // 마나 소모
    return originDamage * AtkMultiplier;    // 스킬 배수 계산 반영 데미지 반환
}

처음에는 스킬로 적을 때린다는 느낌으로 구현을 하고싶었다.

하지만 우리 팀이 만든 코드에서는 많은 부분을 바꿔야했기 때문에 스킬로 몬스터에게 가할 공격력을 배수로 올리는 방식을 택했다.

이 때문에 UseSkill 메서드 내부에서도 몬스터에게 직접 데미지를 넣지는 않고 플레이어의 공격력을 받아서 특정 수치를 곱해서 반환해주는 형식이 됐다.

이 메서드의 반환 값으로 이제 몬스터에게 데미지를 입히는 방식이다.

그리고 UseSkill메서드 내부에서 플레이어의 Mp를 차감하도록 했다.

현재 마나량에 따른 스킬 사용 가능 여부

우선 Skill 클래스에 스킬 사용이 가능한지 판단하는 메서드를 만들었다.

public bool IsAvailable()                   // 마나 잔여량으로 사용 가능 체크
{
    return Owner.Mp >= Cost;
}

이 메서드에서 현재 플레이어의 마나량과 스킬 마나 코스트를 비교해서 스킬 가능 여부를 반환해준다.

이 부분은 생각할 것도 없이 슥슥 해치워버렸다.

if (!player.Skills[skillNum-1].IsAvailable())
{
    isManaLack = true;
    continue;
}

그리고 스킬 선택 시 IsAvailable 메서드를 호출해서 코드 흐름을 제어했고,
isManaLack에 bool 값을 주어서 스킬을 사용할 수 없다는 내용을 출력해준다.

회고

내가 구현한 스킬 시스템은 확장성이 부족하다고 느껴진다.
스킬에는 공격 스킬만 있는 것이 아니라 힐이나 버프같은 상태에 관련된 것이나 쿨타임도 존재한다.
이번에는 조금 급하게 설계해서 더 확장 가능한 스킬 시스템을 만들지는 못한 것 같다.
스킬 시스템에 관해서는 스킬 매니저 등 관련된 것을 좀 더 찾아볼 필요가 있다.

그리고 좀 더 "스킬로 적을 때린다"는 느낌을 살리는 쪽의 코드로 만들어보고싶다.
지금은 스킬로 데미지를 올리는 방식이니.. 조금 이상한 방향이긴하다.
끝에오니까 개선할 점이 참 많아보인다.. 그래도 실력이 늘어났으니 뭔가 더 보이는 것이겠지.

오늘 팀원분이 UI 연출에 도움이 되는 클래스를 하나 만드셔서 게임 자체의 퀄리티도 올려주시고 나도 클래스의 메서드를 몇 군데 사용해봤는데, 코드의 가독성이 정말정말 좋아졌다.
전에는 코딩 자체에 도움이 되는 기능 구현에는 별 신경을 안썼는데, 이번에 있고 없고의 차이가 꽤 크다는 것을 느꼈다.
그리고 그 메서드를 사용할 때 기분이 좋다 ㅎㅎ..

이번 미니 프로젝트도 슬슬 막바지를 향해 달려가는데, 정신 놓지 말고 잘 마무리하도록 하자.

profile
개발은삼순이발

1개의 댓글

comment-user-thumbnail
2024년 1월 13일

신기하네요

답글 달기