게임개발

TRPG(2)

연습생_동동 2022. 1. 17. 21:51

우선 다시 프로젝트를 켜보자

저번에 삼다선지가 매끄럽지 않았는데

우선은 기능 구현부터 먼저 하고 고쳐보자

하이코어 타입의 팽이에 기본 정보를 담을 생성자를 만들고

어택 함수를 만들었다

팽이 클래스의 어택 함수는 virtual로 가상화를 시켜주었다

여기서 어택함수에 일정 확률로 추가 공격을 해야하기 때문에

랜덤 기능을 만들어야한다

랜덤함수와 랜덤 계산의 기준을 받기위한 현재 시간 받는 헤더를 가져옴
각각 특수 효과의 발동 오버라이딩

이제 플레이어의 팽이는 만들었으니 적을 생성해보자

라고 생각하고 작업에 들어가기 전 선택지정이 왜 버벅거렸는지 알게 되었다

바로 _getch()의 크기는 1바이트인데 키보드의 화살표는 2바이트라

2번 입력을 받는다는 것

따라서 체크 또한 두번해주어야 제대로 돌아간다

이렇게 고쳐주니 아주 부드럽게 돌아간다

어쨌든! 이제는 진짜로 적을 만들어보자

랜덤 이름이 들어갈 스트링 상수 선언
한글이 다 2바이트로 처리가 안되서 엉망이라 배열로 하나씩 담았다
이름을 랜덤으로 조합

음 잘나온다

플레이어를 통해 팽이의 공격력과 체력들 받을 수 있도록 함수에 추가를 해주고

랜덤으로 팽이의 타입을 결정해준다

이제 플레이어의 수준에 맞춰 공격력과 체력을 설정해줘야 하는데

기존에는 플레이어 팽이 공격력, 체력에 랜덤으로 +-를 하려 했으나

생각해보니 팽이의 타입이 있어 상점에서 팽이의 부품을 통한 장비교체가 아닌

팽이의 업그레이드를 통한 강화로 설정을 바꾸고

그 업그레이드를 할때마다 레벨을 올려 플레이어 팽이 레벨을 기준으로 적의 수준을 정하는 것으로 바꿨다

팽이 클래스에 레벨 변수 선언 및 0으로 정의
업그레이드를 할때마다 레벨을 올림
각 팽이의 타입마다 스텟 플러스
팽이 클래스에 레벨만큼 적을 업그레이드하는 함수 생성
적 팽이 레벨까지 완성

코드가 잘 적용되는지 확인하기 위해 무조건 +만 나오게 하고 

적으로 설정된 레벨, 플레이어 레벨, 공격력, 체력, 적의 실 적용된 레벨, 공격력, 체력을 출력했다

내가 계획한대로 된다면 플레이어 레벨 +0,1,2 중 하나가 되고 적의 타입에 맞춰 공격력과 체력이 올라갈 것이다

완벽히 적용이 되었다

플레이어는 미들타입으로 설정했고, 적은 하이타입으로 랜덤 생성 된 뒤 레벨만큼 업그레이드가 되었다

그럼 이제 대망의 배틀 시스템을 구축할 차례다

내가 구현하고 싶은 배틀 씬 모양

그냥 이대로 넣을 수 있으면 좋겠지만 아쉽게도 정보를 받아와 출력해야하는 부분들이 있기 때문에

수정을 해주어야 한다

우선 팽이 클래스에 팽이 타입을 담을 string과 그 타입을 참조할 수 있는 함수를 만들어주고

각 자식 클래스들의 생성자에 코어타입을 입력하도록 추가한다

처음에는 적한테 명성이 필요 없다 생각해서 만들지 않았지만 배틀 시 적 명성도 표기할 것이기 때문에

플레이어 클래스에 있던 명성을 캐릭터 클래스로 옮겼다

명성 세팅은 레벨과 동일하게

반환형에 따라 매개변수를 달리하여 정보를 가져오는 오버로딩을 했다

정보를 다 받아서 입력하도록 처리해뒀는데 문제는 공격, 방어, 회피를 선택하는 부분에서 생겼다

함수 포인터 변수를 선언해 함수 포인터 변수를 매개변수로 삼는 choice 함수로 새로 오버로딩해도 될 것 같은데

솔직히 많이 비효율적인 느낌이 든다

아예 공격, 방어, 회피 부분 위치에 choice 함수를 넣어 이곳만 바꾸다가

엔터로 행동을 선택하면 그때 다시 배틀 씬을 불러오는 식으로 갔으면 좋겠는데.. 방법이 없나?

구글 검색을 하던 도중 재밌는 정보를 얻었다

커서 위치를 조정하여 출력이 가능하다는 것!

정말 편하다!

이 함수의 장점은 커서의 위치를 조절해 덮어쓰기가 가능하다는 것이다

즉 Choice함수로 삼다선지를 구현할때 그 맵을 다 구현할 필요 없이 ▶만 덮어씌어주면 된다는 것!

기왕 하는거 전체적인 디자인을 바꿔봤다

훨씬 깔끔하네

배틀 중 직접 싸우는 것은 각 캐릭터에 생성된 팽이들이다

배틀의 결과에 영향을 받는 것은 플레이어다

배틀은 각 캐릭터와 팽이의 정보에 모두 접근이 가능해야한다

그동안 각 캐릭터 클래스에 팽이의 정보를 가져오는 함수를 넣고 팽이에 직접 접근은

허용을 안했으나 배틀을 하는데 있어서 팽이에 직접 접근하는 것이 코드를 짜는데 용이한 듯 하여

팽이를 public으로 옮겼다

그렇게 배틀을 구현하려던 중 문득 이 게임에 공격, 방어, 회피를 이용해 싸운다면

팽이의 타입과 그에 따른 특수 능력이 의미가 있는가하는 생각이 들었다

공격과 부스트, 항복으로 바꾸고 그에 따른 설명을 출력하도록 했다

이젠 진짜로 기능을 구현할 차례다

다른거 생각나도 미루고 일단 기능부터 하겠다

플레이어가 공격을 선택 했을 때 공격했다는 것을 먼저 출력하고

플래이어가 가지고 있는 팽이로 적이 가지고 있는 팽이를 공격한다

플레이어가 선택을 모두 마친 이후에는 DelayConsol로 딜레이를 걸어준다

얼만큼 데미지를 받았는지는 Hit함수에 넣어줄 것이기 때문에

팽이 클래스의 공격 함수는 추가 할 필요가 없다

다만 하이코어 클래스의 경우 특수 능력이 발동 되었을 때 그것을 출력해줘야 하기 때문에

특수능력 발동 했을때만 출력을 추가해주었다

음... 이게 머릿속으로만 생각하다보니 조금 꼬이는것 같은데 전체적인 출력 순서를 좀 적어보자

1. 기본 : 공격버튼->

a가 b를 공격했다!\n b는 x의 데미지를 입었다

 

2. 하이코어 특수능력 발동 : 공격버튼

-> a가 b를 공격했다!\n b는 x의 데미지를 입었다

->특수능력 발동! 한번 더 공격!\n b는 x의 데미지를 입었다

 

3. 미들 혹은 로우코어 특능 발동 : 공격버튼

 -> a가 b를 공격했다!\n b는 x의 데미지를 입었다

 ->특수능력 발동! 회복(반격)했다!\n b는 y만큼 회복했다 (a는 x의 데미지를 입었다)

 

4. 하이코어 & 미들(로우)코어 특는 발동 : 공격버튼

-> a가 b를 공격했다!\n b는 x의 데미지를 입었다

->특수능력 발동! 회복(반격)했다!\n b는 y만큼 회복했다 (a는 x의 데미지를 입었다)

->특수능력 발동! 한번 더 공격!\n b는 x의 데미지를 입었다

->특수능력 발동! 회복(반격)했다!\n b는 y만큼 회복했다 (a는 x의 데미지를 입었다)

 

ex)로우코어 vs 로우코어의 경우 반격에 반격은 불가하도록 설정해야한다

ex)하이코어 vs 로우코어의 경우 반격으로 하이코어가 하이코어를 공격 시에

    하이코어의 특수능력이 발동되지 않도록 해야한다

 

역시 사람은 시각적으로 보이게 정리를 해야한다

이렇게 정리를 하고 보니 기존의 코드를 조금 수정해야 할 필요가 있어 보인다

기존에는 각 캐릭터의 팽이를 public으로 하고 팽이 클래스에서 전투를 처리했으나

각 팽이 클래스에 공격 및 데미지 받는 것을 처리하면 플레이어와 적에 대한 정보를 받아올 수 없다

즉, 다시 팽이 클래스를 private로 바꾸고 전투에 대한 건 각 캐릭터의 클래스에서 처리를 해야하겠다

다음 블로그에서 전투씬을 마무리해야겠다

 

'게임개발' 카테고리의 다른 글

Unity) 롤토체스 같은 게임 - 스테이지 데이터  (0) 2024.08.25
Unity) 롤토체스 같은 게임 - 프로젝트 세팅  (0) 2024.08.25
TRPG(1)  (0) 2022.01.14