개요

체력 계산 함수를 외부에 구현하고 CHealthBarUI에서는 함수포인터만 전달하여 호출하는 식으로 구현했습니다. 

처음엔 체력계산 함수를 Player의 virtual function으로 구현 하였습니다.

하지만 이후 캐릭터마다 체력계산 함수의 종류나 계산 방식 등이 다를 수 있을 것이라 생각하였고 

Strategy Pattern을 적용하게 되었습니다.

또 계산식에서 필요한 private변수들이 많아질 것으로 예상하였습니다. 

때문에 클래스나 구조체로 구현하여 Player의 인스턴스를 전달하는 Strategy Pattern의 전형적인 방식을 사용하기보다는 

Player의 함수 포인터를 사용하는 식으로 변형하였습니다.

추상클래스로 인터페이스를 제공하는 장점을 버리게 되었지만 private변수 참조 용이, 은닉화의 장점을 취할 수 있었습니다.


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*-----------------------CHealthBarUI--------------------------
 * strategy pattern
 * 같은 캐릭터라도 다른 체력계산함수를 사용할 수 있도록 구현
 * 때문에 캐릭터에서 virtual 함수로 구현하지 않고 strategy pattern을 이용
 * 차후에 다른캐릭터로 이어달리기 등의 기능을 구현할때 용이함
 * (자세한 것은 player클래스 참조)
 * Lambda혹은 함수포인터, 함수객체를 인자로 받는다.
 * CHealthBarUI는 철저히 UI만 표현한다.
 * ------------------------------------------------------------*/
 
 
 
 
/* 캐릭터마다의 체력계산함수 포인터 전달 */
static CHealthBarUI* create(HealthCalculatorFunc healthCalFunc);
 
 
/* 플레이중 버프나 보너스 타임때 계산 함수 변경가능위해 */
void ChangeHealthCalFunc(HealthCalculatorFunc healthCalFunc);    
 
 
/* ProgressBar Update 
 * m_HealthCalculatorFunction에 들어있는 함수 호출 */
void UpdateHealthUI(float delta);
{
    float percent = m_HealthCalculatorFunction(delta);
    m_HealthBar->setPercentage(percent);
}
 
/* HealthFunc 타입 정의 */
typedef std::function<float(float delta)> HealthCalculatorFunc;
 
 
/* HealthBarUI 생성 시 캐릭터의 원하는 체력계산함수 호출을 위해 
 * 체력계산함수 포인터 전달  */
HealthCalculatorFunc m_HealthCalculatorFunction;
cs

CHealthBarUI 클래스의 주요 함수 및 동작원리 설명

1. UI생성 시 캐릭터의 체력계산 함수포인터를 전달합니다.

2. 때문에 사용자는 캐릭터의 종류에 따라 원하는 체력계산 함수를 모두 정의 할 수 있습니다.

3. ChangeHealthCalFunc함수를 통해 호출되는 함수를 변경할 수 있습니다.


사용 예

1
2
3
4
auto healthBar = CHealthBarUI::create(
        std::bind(&CPlayer::HealthCalculatorInNormal, 
        CObjectManager::Instance()->getPlayer(), 
        std::placeholders::_1));
cs

1. 체력 계산 함수로써 Player의 HealthCalculatorInNormal()함수를 호출하는 HealthBarUI를 생성

2. std::placeholders::_1 : 함수 호출 시 전달하는 매개변수는 함수를 호출하는 장소에서 전달하는 값으로 사용한다는 의미입니다.

3. 여기서는 deltaTime을 전달합니다.



귀차니즘을 위한 2줄 요약

1. HealthBarUI는 UI만 표현하고 계산 함수는 캐릭터가 가지고 있다.

2. HealthBarUI를 생성할 때 캐릭터의 함수를 인자로 전달하면된다.

3. ChangeHealthCarFunc()로 계산 함수를 변경할 수 있습니다.

'All > Project' 카테고리의 다른 글

Laviah  (0) 2017.04.08
매주 일요일 랭킹 초기화  (0) 2017.04.05
UI_ MyButton  (0) 2016.04.12
별게임의 상태트리  (0) 2016.04.12
AI_ FSM / State  (0) 2016.04.12

+ Recent posts