Console Project/5. 문자 출력
C++2019. 12. 10. 20:30
화면에 문자를 출력하기 위해서는 문자에 해당하는 이미지가 있어야 한다. 문자를 입력 받아 원하는 위치에 문자에 해당하는 이미지를 그려넣어야 한다.
아스키 문자 출력
화면에 출력하는 아스키 문자는 0x20 ~ 0x7f 범위 내에 존재한다. 입력받은 문자가 범위 내에 있으면 아스키 문자 이미지에서 해당하는 문자를 그리면 된다.
// ascii code
if (c >= 0x20 && c < 0x7f) {
int index = c - 0x20;
int cx = index % 8;
int cy = index / 8;
Sprite charSpr = asciiSprite->GetSprite(cx, cy);
charSpr.DrawTo(buffer, { x, y });
}
한글 문자 출력
한글의 경우에는 좀 복잡한데 유니코드에서의 한글은 0xAC00 부터 0xd7a4까지 자주 사용하는 한글의 조합을 전부 할당해 놓았다. 가갸걔거겨계... 이런식으로 말이다. 이를 출력하기 위해서는 대략 1만여개의 한글 이미지가 필요하다.
이 대신 결과는 좀 엉성하지만 초.중.종성의 조합으로 한글을 그리는 방법이 있다.
한글은 유니코드에서 0xac00 ~ 0xd7a4 범위 내에 있으며 초.중.종성을 분해하고 각각에 맞는 이미지를 같이 출력한다.
if (c >= 0xac00 && c < 0xd7a4) {
// 초중종성 분해
int in_char = c - 0xAC00;
int cho = in_char / (0x0015 * 0x001C);
int jung = (in_char / 0x001C) % 0x0015;
int jong = in_char % 0x001C;
if (jung >= 8 && jung < 20) {
cho += 20;
}
koreanSprite->DrawTo(buffer, { x, y }, cho % 10, cho / 10);
koreanSprite->DrawTo(buffer, { x, y }, jung % 10, (jung / 10) + 4);
koreanSprite->DrawTo(buffer, { x, y }, jong % 10, (jong / 10) + 7);
}
문장 출력
문장을 출력할 때에는 문자 하나하나가 알맞는 위치에 출력되어야 한다. 이를 위해서는 각 글자의 폭을 구한 다음 출력할 때마다 위치를 이동시키면 된다.
TCHAR* input = "안녕하세요. Waker입니다. 가나다라마바사~";
RECT rect = { 0, 0, 100, 100 };
int x = rect.left;
int y = rect.top;
int length = wcslen(text);
for (int i = 0; i < length; i++) {
TCHAR c = input[i];
if (IsAscii(c)) {
// 입력하려는 문자가 폭을 넘어서면
// 다음 줄로 이동한다.
if (x + 8 > rect.right) {
x = rect.left;
y += 16;
}
// 문자를 입력하는 범위를 넘어서면
// 출력을 중단한다.
if (y > rect.bottom) {
break;
}
// Output ascii
Sprite s = ascii->GetTextSprite(c);
s->DrawTo(x, y);
// 다음 위치로 이동.
x += 8;
}
if (IsKorean(c)) {
...
}
}
'C++' 카테고리의 다른 글
Console Project/7. TileMap (0) | 2019.12.14 |
---|---|
Console Project/6. 키 입력 (0) | 2019.12.12 |
Console Project/4.5 중간보고 (0) | 2019.12.10 |
Console Project/4. GameLoop (0) | 2019.12.10 |
Console Project/3. 이미지 (0) | 2019.12.10 |
댓글()