미국 버전의 게임 클라이언트에서 퀘스트만 영어/중국어로 볼 수 있게 해달라는 요구 사항이 접수 되었다.
사유는, 미국내의 중국인들이 미국 서버에 접속하여 게임을 많이(?) 하기에 편의상 그렇게 해달라는 요청!
아놔.... ㅜ.ㅡ
주절1. 각 국가 코드 페이지가 있다.
0000 0000부터 0111 1111(127)까지의 128개의 코드는 그대로 사용하지만
129번째 1000 0000부터는 확장코드로써 코드 페이지를 갖게 하는 것이다. 따라서 8비트 중에서 최상위 비트값 1을 기준으로 구분하게 된다. 1이면 국가별 코드페이지가 사용되는 경우에 해당해서 1바이트 코드가 아닌 2byte(16bit코드체계)로 동작하게 된다.
//--------------------------------------------------------------------------------------------------
이래저래 작업은 완료 하였다. 나를 그토록 고생시킨 것은... GDI !!
GDI를 이용해 글꼴을 생성하면 한 어플리케이션에서 다국어가 잘 나온다는 것!
그럼 GDI와 D3DXFONT와 뭐가 다른 것일까?
분석해보자.
아나... 각자 특성들을 알아봤는데... 정작 D3DXFONT 로는 왜 중국어가 깨져 나오는지 답을 얻을 수 없네. ㅡ,.ㅡ
GDI는 Graphic Device Interface의 약자로써 다음과 같다.
- 윈도우 프로그램이 하드웨어(그래픽 카드)에 독립적으로 그래픽 장치를 쓸 수 있도록 제공하는 인터페이스
- 윈도우 운영체제가 프로그램에 제공하는 그래픽 관련 기능의 통칭 ( GDI32.DLL 에 구현 )
폰트 관련 구조체로는,
// 원형과 인수 ------------------------------------------------------------------------------------------
* LOGFONT 구조체 (글꼴을 정의하기 위한 구조체)
lfHeight : 글꼴의 높이
lfWidth : 글꼴의 너비
lfEscapement : 방향
lfOrientation : 회전각도
lfWeight : 굵기
lfItalic : 기울임꼴
lfUnderline : 밑줄
lfStrikeOut : 취소선
lfCharSet : 문자셋트
lfOutprecision : 출력 정확도
lfClipPrecision : 클리핑 정확도
lfQuality : 출력의 질
lfPitchAndFamily : 자간
lfFaceName[LF_FACESIZE] : 글꼴 이름
* MFC 에서는 CFont 클래스가 존재함
* CFontDialog 공통 다이얼로그 박스를 통하여 사용
// 중국어(간체) 폰트 생성. ( WinGDI.h 파일 안에 세부 정보 참조 ) HFONT __hFont = 0; LOGFONT lf; ZeroMemory( &lf, sizeof(lf) ); lf.lfHeight = 12; lf.lfWidth = 0; lf.lfEscapement = 0; lf.lfOrientation = 0; lf.lfWeight = FW_NORMAL; lf.lfItalic = FALSE; lf.lfUnderline = FALSE; lf.lfStrikeOut = FALSE; lf.lfCharSet = GB2312_CHARSET; lf.lfOutPrecision = OUT_DEFAULT_PRECIS; lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; lf.lfQuality = DEFAULT_QUALITY; lf.lfPitchAndFamily = DEFAULT_PITCH; strcpy( lf.lfFaceName, _T("SimSun") ); __hFont = CreateFontIndirect( &lf ); // 텍스트 출력 SelectObject( hDC, __hFont ); SetRect( &_rect, 0, 0, len * 6, FONT_HEIGHT); DrawText( hDC, str, len, &_rect, DT_LEFT); // 해제 if( __hFont ) DeleteObject( __hFont ); |
Direct3D에서 폰트를 생성 및 사용 하고자 할 경우는 다음과 같다.
// 원형과 인수 ------------------------------------------------------------------------------------------
// d3dx9core.h
typedef struct _D3DXFONT_DESCA
{
UINT Height;
UINT Width;
UINT Weight;
UINT MipLevels;
BOOL Italic;
BYTE CharSet;
BYTE OutputPrecision;
BYTE Quality;
BYTE PitchAndFamily;
CHAR FaceName[LF_FACESIZE];
} D3DXFONT_DESCA, *LPD3DXFONT_DESCA;
HRESULT WINAPI D3DXCreateFontIndirectA( LPDIRECT3DDEVICE9 pDevice, // 사용 할 디바이스
CONST D3DXFONT_DESCA* pDesc, // 폰트 구조체 정보
LPD3DXFONT* ppFont); // 인터페이스를 얻어올 포인터 변수
// 중국어(간체) 폰트 생성. D3DXFONT_DESC fontdesc; ZeroMemory(&fontdesc, sizeof(D3DXFONT_DESC)); fontdesc.Height = 12; fontdesc.Width = 0; fontdesc.Weight = 0; fontdesc.MipLevels = 1; fontdesc.Italic = 0; fontdesc.CharSet = GB2312_CHARSET; fontdesc.Quality = DEFAULT_QUALITY; fontdesc.PitchAndFamily = FIXED_PITCH; strcpy(fontdesc.FaceName,"SimSun"); LPD3DXFONT ifFont; HRESULT hr = 0; hr = D3DXCreateFontIndirect( m_pd3dDevice, &fontdesc, &ifFont); ※ D3DXCreateFont( ... ) 함수 역시 같은 역할을 한다. // 폰트 인터페이스 사용하여 Text를 그려줌. ifFont->DrawText( LPD3DXSPRITE pSprite, // 스프라이트 주소 LPCSTR pString, // 그리고자 하는 문자열 INT Count, // NULL로 끝나는 문자열 LPRECT pRect, // 텍스쳐가 그려질 영역 DWORD Format, // 영역 포맷 D3DCOLOR Color ); // 글자색 // 인터페이스 해제 if( ifFont != NULL ) { ifFont->Release(); ifFont = NULL: } |
텍스쳐에 글자를 그려주고 렌더링 해주기
// 원형과 인수 ------------------------------------------------------------------------------------------
HRESULT D3DXCreateSprite {
LPDIRECT3DDEVICE9 pDevice // 스프라이트와 연결되어있는 디바이스 포인터
LPD3DXSPRITE ppSprite // 스프라이트 정보를 리턴받을 인터페이스 포인터
};
LPD3DXSPRITE ifD3DXSprite; LPD3DXFONT ifD3DXFont; // 폰트 생성 D3DXCreateFont( Device, 25, 0, FW_BOLD, 1, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "굴림체, &ifD3DXFont ); // 스프라이트 생성 D3DXCreateSprite( Device, &Sprite ); // 텍스트 그려줌 if( ifD3DSprite ) ifD3DSprite->Begin( D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE ); RECT re = { 100, 100, 0, 0 }; ifD3DFont->DrawText( ifD3DSprite, "안녕하세요", -1, &rt, DT_NOCLIP, D3DCOLOR_XRGB(0, 0, 0 ) ); ifD3DSprite->End(); // 해제 if( ifD3DFont ) ifD3DFont->Release(); if( ifD3DSprite ) ifD3DSprite->Release(); |
- 화면 출력 순서는 반드시 지켜야 함.
- 모든장면은 후면 버퍼에 렌더링
후면 버퍼 지우기:
pDevice->Clear()
3D 장면의 연출 시작:
pDevice->BeginScene()
2D 스프라이트 객체를 이용한 장면 연출 시작:
pSprite->Begin()
2D Draw:
pSprite->Draw(...)
2D 스프라이트 객체 장면 연출 끝:
pSprite->End()
3D 장면 연출 끝:
m_pd3dDevice->EndScene()
후면버퍼와 전면 버퍼교체:
pDevice->Present()
D3DFONT
- 사용법은 인자만 조금 다르고 D3DXFONT와 유사하다.
장점 : 퍼포먼스( 속도 ) 면에서 좋다고 한다.
단점 : 한글 출력이 안된다.
'비공개' 카테고리의 다른 글
현재 윈도우 OS 정보 가져오기 (0) | 2010.03.30 |
---|---|
Dos Tree 명령어 (0) | 2010.03.29 |
visual Leak detector (0) | 2010.03.22 |
warning C4150 (0) | 2010.03.22 |
OutPutDebugStr (0) | 2010.03.22 |