[ 오류 해결 ]
- CEffect 클래스의 Render Layer이 Default로 되어있던 문제 수정.
-- 생성자에서 변경해 주었음.
CEffect::CEffect():
m_Duration(0.f),
m_Time(0.f),
m_EffectType(EEffectType::Once)
{
m_RenderLayer = ERenderLayer::Effect;
}
- CScene의 Update, PostUpdate 과정에서 UI의 제거 과정에 continue문이 없어 댕글링 포인터가 발생하는 현상을 수정.
if (!(*iter)->GetActive())
{
iter = m_vecWidgetWindow.erase(iter);
iterEnd = m_vecWidgetWindow.end();
continue; // << 이 부분
}
class CProgressBar: public CWidget
- CWidget의 상속을 받아 생성한다.
{ enum class EProgressBar_TextureType }
- 프로그레스 바에는 2개의 이미지가 필요하다.
1. 프로그레스 바의 틀(Back) / 2. 프로그레스 바 내부(Bar)
- 여기에 이미지를 직접 삽입해서 출력하거나, 기본 도형 출력 함수를 이용해 출력할 수 있도록 열거체를 만든다.
- 배열에 사용할 것이므로 추가로 End 항목까지 만들어 준다.
{ enum class EProgressBar_Dir }
- 이 프로그레스 바의 방향을 설정한다.
- 왼쪽 -> 오른쪽으로 찰것인지, 오른쪽 -> 왼쪽, 위 -> 아래, 아래 -> 위 등
{ CSharedPtr<class CTexture> m_Texture[(int)EProgressBarTextureType::End] }
- 텍스처 주소를 저장할 포인터 변수
{ EBrogressBar_Dir m_Dir }
- 이 프로그레스 바가 어디를 향해 채워질 것인지(왼->오 / 오->왼 / 위->아래 / 아래->위 4가지)
{ float m_Value }
- 0~1의 비율로, 바가 얼마나 차있을지 결정하는 변수
< SetValue(), AddValue() >
- 비율을 정하거나 원하는만큼 더해 줌.
{ BoxInfo m_BarPos }
{ float m_Padding }
< Update() >
- 매 프레임마다 m_BarPos를 초기화하고, 어디서부터 그려야 할지 계산한다.
- switch문을 통해 프로그레스 바가 어디를 향해 채워지는지에 따라 어떻게 계산을 다르게 해준다.
-- 왼 -> 오라면 오른쪽 끝의 위치는 왼쪽 끝의 위치 + 바의 사이즈 * 비율이 될것이다.
-- 오 -> 왼 이라면 왼쪽 끝의 위치를 바꿔주어야 할것이다.
-- 위 -> 아래라면 아래 끝의 위치를 바꿔주어야 할것이다.
-- 아래 -> 위라면 위 끝의 위치를 바꿔주어야 할것이다.
class CMonsterHPWindow: public CWidgetWindow
- 새 위젯 윈도우를 만들어서 CMonster 클래스를 따라다니면서 위의 CProgressBar로 체력바를 표시하도록 해보자.
- 여기서 CProgressBar를 생성하고 CMonster의 주소를 확인한 후, CMonster의 체력을 지속적으로 프로그레스 바에 전달해 준다.
- 몬스터가 죽었을 경우 같이 삭제되는 예외 처리도 해 주어야 한다.
'WIN32API FrameWork > 한단계씩 직접 구현' 카테고리의 다른 글
62. 숫자 이미지 위젯 (0) | 2022.06.08 |
---|---|
61. 폰트 (0) | 2022.06.08 |
59. 마우스에 애니메이션 띄우기 (0) | 2022.06.07 |
58. 버튼 완성 (0) | 2022.06.07 |
57. 위젯의 마우스 충돌 (0) | 2022.06.07 |