Coding & Programming/C, C++, SFML

[C/C++, SFML] 6. 폰트(font) 파일 읽고 화면에 출력하기(Font, Text)

mainCodes 2021. 3. 29. 11:30

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و

 

sf::Font 클래스는 대부분의 폰트 타입을 지원하며 여러 형태의 폰트 파일을 메모리로 로딩합니다. 로딩된 폰트 정보는 sf::Text 클래스를 통해 화면에 출력되는데, sf:Text 클래스는 글자의 사이즈, 스타일, 컬러, 위치, 로데이션 등을 옵션으로 설정할 있습니다.

 

SFML sf::Text 출력 결과

 

  Font font;

  //폰트 파일 로드

  font.loadFromFile("resources/DS-DIGIB.ttif"); 

 

  //폰트를 사용할 text 생성

  Text text;

  text.setFont(font);               //폰트
  text.setCharacterSize(size);    //크기 
  text.setPosition(x, y);            //x, y 위치
  text.setFillColor(color);          //색
  text.setOutlineColor(outColor); //글자 테두리 색
  text.setOutlineThickness(1.f);    //글자 테두리 굵기
  text.setString(p); //출력할 문자열

 

폰트는 파일 외 스트림, 메모리로 부터 로드할 수 있으며, 폰트를 읽는 코드는 SFML의 메인 루프인 app.isOpen()) 전에 둡니다. 참고로 읽어들이고자 하는 폰트가 비트맵(Bitmap) 폰트라면 폰트 사이즈를 원하는대로 확대 또는 축소할 수 없으므로 폰트 파일 사용 전에 비트맵 폰트인지 확인하고 사용하는 것이 좋습니다.

 

SFML Font, Text 클래스 사용 예제(Example):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <SFML/Graphics.hpp>
#include <iostream>
 
using namespace std;
using namespace sf;
 
// Text 설정 함수
int textPrint(Text& textMsg, Font& font, int size,
    float x, float y, const Color& color, const Color& outColor, string p)
{
    textMsg.setFont(font);             //폰트
    textMsg.setCharacterSize(size);    //크기 
    textMsg.setPosition(x, y);         //x, y 위치
    textMsg.setFillColor(color);       //색
    textMsg.setOutlineColor(outColor); //글자 테두리 색
    textMsg.setOutlineThickness(1.f);  //글자 테두리 굵기
    textMsg.setString(p); //출력할 문자열
 
    return 0;
}
 
int main()
{
    Text text1, text2, text3;
    Uint8 r = 0, g = 0, b = 0;
    string msgStr = "Ready, Go! maincodes !!";
    int x = 0, y = 0;
 
    Clock clock; //경과 시간을 측정할 수있는 Clock객체 선언
    float interval = 0;
 
 
    cout << "프로그램이 시작되었습니다." << endl;
 
    //화면 크기, 캡션 이름 설정
    RenderWindow app(VideoMode(504504), "https://maincodes.tistory.com/");
    app.setFramerateLimit(60);  //프레임 비율 설정
 
    //Font 파일 로드
    Font font;
    font.loadFromFile("resources/DS-DIGIB.ttf");
 
    //text1 ~ text3 설정
    textPrint(text1, font, 3000,
        Color::Yellow, Color::White,   
        msgStr);
 
    textPrint(text2, font, 10000,
        Color::White, Color::White,   
        msgStr);
 
    textPrint(text3, font, 1500110,
        Color::Blue, Color::White,
        msgStr);
 
    //SFML 메인 루프 - 윈도우가 닫힐때 까지 반복
    while (app.isOpen())
    {
        float time = clock.getElapsedTime().asSeconds();
        clock.restart();
 
        interval += time;
 
        Event event;
 
        //이벤트 처리
        while (app.pollEvent(event))
        {
            //프로그램 종료 이벤트 처리
            if (event.type == Event::EventType::Closed)
            {
                app.close();
                cout << "프로그램이 종료되었습니다." << endl;
            }
        }
 
        app.clear(Color::Black);
 
        if (((int)interval % 2== 0)
        {
            x += 1.0;
            y += 1.0;
            text1.setPosition(x, y);
            Vector2f pos = text1.getPosition(); 
            cout << "pos.x = " << pos.x << " pos.y = " << pos.y << endl;
        }
 
        //text1~text3 출력
        app.draw(text1);
        app.draw(text2);
        app.draw(text3);
 
        //프레임을 스크린에 출력
        app.display();
    }
 
    return 0;
}
cs

 

실행결과(Output):

 

 

이상 JollyTree였습니다 (•̀ᴗ•́)و