64. 텍스트 출력
*** 공부 방법 ***
1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. 처
hyrule.tistory.com
class CWidgetText
- 텍스트를 받아 출력하는 위젯을 생성한다.
-- vector를 구현하는 것과 비슷한 느낌으로 구현하면 된다.
< 헤더 파일 >
#pragma once
#include "Widget.h"
class CWidgetText :
public CWidget
{
friend class CWidgetComponent;
friend class CWidgetWindow;
protected:
CWidgetText();
CWidgetText(const CWidgetText& widget);
virtual ~CWidgetText();
public:
virtual bool Init();
protected://출력할 텍스트 저장
TCHAR* m_Text;
int m_Count;
int m_Capacity;
public:
void SetText(const TCHAR* Text);
void AddText(const TCHAR Text);
void AddText(const TCHAR* Text);
void pop_back();
void clear();
protected://텍스트 색 지정
COLORREF m_TextColor;
public:
void SetColor(unsigned char r, unsigned char g, unsigned char b);
protected://폰트 지정
CSharedPtr<class CFont> m_Font;
public:
void SetFont(const std::string& Name);
protected://한 글자씩 출력할것인지
bool m_OneLetterAtTime;
float m_Interval; //출력 시간 간격
float m_TimeCount;
public:
void SetOneLetterAtTime(bool Enable = true);
void SetInterval(float Interval);
protected://그림자 사용 여부 / 색상, 떨어져 있을 거리지정
bool m_Shadow;
COLORREF m_ShadowColor;
Vector2 m_ShadowOffset;
public:
void SetTextShadowColor(unsigned char r, unsigned char g, unsigned char b);
void EnableShadow(bool Shadow = true);
void SetShadowOffset(float x, float y);
public:
virtual void Update(float DeltaTime);
virtual void PostUpdate(float DeltaTime);
virtual void Render(HDC hDC, float DeltaTime);
virtual void Render(HDC hDC, const Vector2& Pos, float DeltaTime);
};
< SetText, AddText >
- Vector처럼, 문자열의 길이가 현재 Capacity 이상이면 새 공간을 할당해줘야 한다.
- 새 공간을 동적 할당하고, 이곳으로 lstrcpy와 lstrcat을 활용하여 문자열을 옮긴 뒤, 기존 문자열을 제거해준다.
- lstrlen에서 나온 결과에 1을 더해서 동적할당 해주어야함을 기억해야 한다.(널문자)
- AddText()의 경우, 대화문을 사용하는 게임의 경우 텍스트 출력이 한글자씩 추가되는 상황에 사용할 목적으로 만든 것.
{ bool m_OneLetterAtTime }
- 이런 방식으로 한번에 전부 출력하는 것이 아니라 한 글자씩 출력할 것인지 여부를 설정.
{ float m_Interval }
- 한 글자 출력 시간 간격을 설정한다.
< Update >
- 만약 '한 글자씩 출력 모드를 사용하면, 시간을 재 준다. { m_TimeCount에 저장한다 }
< Render >
1. '한 글자 출력 모드'를 사용할 경우 몇 글자를 출력해야 하는지 계산해야 한다.
-- m_TimeCount / m_Interval을 하면 간단하게 구해진다.
-- 만약 모든 글자가 출력되었으면 최대 글자수를 고정해 놓고, 한 글자 출력 모드를 종료 상태로 돌려놓는다.
2. 출력될 위치를 구한 후
3. 가지고 있는 폰트를 사용 설정한 뒤
4. SetBkMode를 통해 텍스트 뒷배경을 투명하게 바꿔주고
5. 그림자까지 사용하도록 설정한다면 그림자를 먼저 그린다음
6. 텍스트를 그려주고
7. 폰트를 원래대로 돌려놓으면 끝