1. memset( array, 0, sizeof array );

전달된 배열을 0으로 초기화 한다.

ex)

1
2
3
4
char outputArray[30];
 
//array init by 0
memset( outputArray, 0sizeof(outputArray) );
cs

2. std::copy( input_begin, input_end, output_begin );
어떠한 컨테이너도 복사한다. 
output에 해당하는 컨테이너의 크기가 input의 컨테이너보다 크거나 같아야 한다.
ex)
1
2
3
4
5
6
7
8
9
10
11
12
char outputArray[30];
std::string inputArray = "A B C D E F G H I J K L"  //size = 23
 
//array init by 0
memset( outputArray, 0sizeof(outputArray) );
 
std::copy(std::begin(inputArray), std::end(inputArray), std::begin(outputArray));
 
//show
/** 
 * outputArray = "A B C D E F G H I J K L\0\0\0\0\0\0\0"
 **/
cs



3. std::advance( iterator, index );
어떠한 컨테이너도 배열처럼 접근한다.
iterator를 index만큼 증가시킨다. 
index는 0보다 크거나 같고 컨테이너의 사이즈보다 작아야 한다.
ex)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::map<std::stringstd::string> nameMap;
// init map 
nameMap.emplace(std::pair<std::stringstd::string>("Hong" , "Hello Hong" ));
nameMap.emplace(std::pair<std::stringstd::string>("Seong""Hello Seong"));
nameMap.emplace(std::pair<std::stringstd::string>("Hee"  , "Hello Hee"  ));
 
auto item = nameMap.begin();
std::advance( item, random<int>(0, nameMap.size()-1) );
 
//show
/** 
 * randomIndex = 0, data = "Hello Hong"
 * randomIndex = 1, data = "Hello Seong"
 * randomIndex = 2, data = "Hello Hee"
 **/
cs


4. std::find( array_begin, array_end, item );
컨테이너 중 item의 iterator를 반환한다.
5. std::distance( array_begin, iterator );
컨테이너에서 iterator에 해당하는 index를 반환한다.
ex)
1
2
3
4
5
6
7
auto iter = std::find(list.begin(), list.end(), item);
int index = std::distance(list.begin(), iter);
 
//show
/**
 * list[index] 
 **/
cs


6. std::fill( array_begin, array_end, value );
컨테이너를 value로 채운다. (초기화 한다.)

ex)

1
2
3
4
5
6
7
8
9
10
std::vector<int> array;    
array.resize(3);
std::fill(array.begin(), array.end(), 10);
 
//show
/**
 * array[0] = 10
 * array[1] = 10
 * array[2] = 10  
 */
cs


'All > C++' 카테고리의 다른 글

operator new / operator delete  (0) 2016.03.14
메모리 누수 검사  (0) 2015.12.29
가변인자 로그 출력함수  (0) 2015.12.29
RValue와 LValue  (2) 2015.12.28
문장줄이기  (0) 2015.12.28

 원래는 개인프로젝트에서 SVN을 이용하고 있었는데 

SVN 서버로 사용하던 네이버 오픈프로젝트가 서비스 종료된다는 소식을 접하게 되었다.

멘붕하면서도 뭔가 미루고 미루던 git으로 환승할 시기가 결국 왔구나 싶다.


블로그 글 정말 오랜만인데

이 글을 계기로 그동안 임시저장 해왔던 블로그 글들을 하나씩 풀어볼까 한다. 

일단 git으로 마이그레이션부터 하고..

개요

체력 계산 함수를 외부에 구현하고 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