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

댓글()