Coding & Programming/C, C++, SFML

[C/C++, SFML] 9. 엔티티(Sprite, Text, Share 등) 위치, 로테이션, 스케일 등 모양 바꾸기

mainCodes 2021. 4. 2. 21:14

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

Sprite, Text, Shape의 클래스들은 동일한 sf::Transformable 인터페이스를 통해 Sprite, Text, Shape들의 크기 변경, 회전, 이동 등을 지원합니다.

 

 

동일한 유형의 간단한 API를 통해 move, rotate, scale 변경이 가능한데 예를 들어 Text의 위치를 변경한다고 하면 아래와 같이 setPosition()를 통해 절대 위치를 정하고 move()를 통해 상대 위치로 엔티티를 이동 시킬 수 있습니다. 이 같은 절차는 Sprite, Shape들도 동일하게 적용됩니다. 아래 예에서 text.getPosition()의 결과는 setPosition(), move()에서 설정한 위치가 누적 반영되어 x는 110, y는 60의 값이 됩니다. 

 

Text text;

//절대 위치 설정
text.setPosition(100.f, 50.f);

//상대 위치 설정
text.move(10.f, 10.f);
...

//현재 위치 얻기
Vector2f pos = text.getPosition();

...

//절대 로테이션 설정
text.setRotation(50.f);

//상대 로테이션 설정
text.rotate(5.f);

...

//rot  값은 55
float rot = text.getRotation();

로테이션(Rotation), 스케일(Scale)도 동일한 형태로 사용이 가능합니다. 아래 예제를 참고하세요.

 

엔티티(Sprite, Text, Share 등) 위치, 로테이션, 크기 등 모양 바꾸기 예제(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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include <SFML/Graphics.hpp>
#include <iostream>
 
using namespace std;
using namespace sf;
 
int print_text(Text& textMsg, Font& font, int size,
    float x, float y, const Color& color, const Color& outColor, string p);
 
int main()
{
    float timer = 0;
    Clock clock;
    Text text1;
    string msgStr = "Ready, Go! maincodes !!";
    float x = 200, y = 200;
 
    //Font 파일 로드
    Font font;
    font.loadFromFile("resources/DS-DIGIB.ttf");
 
    //Text1
    print_text(text1, font, 801010,
        Color::Black, Color::White, msgStr);
 
    //origin 설정
    text1.setOrigin(200.f, 200.f);
    text1.setPosition(text1.getOrigin());
 
    //키보드 입력 따라 움직일 RectangleShape 객체
    RectangleShape rect_shape(Vector2f(200200));
 
    //작은 사각형 5개
    RectangleShape small_rect_shape[5];
 
    rect_shape.setFillColor(Color::Green);
    rect_shape.setOutlineColor(sf::Color::Red);
    rect_shape.setOutlineThickness(20);
    rect_shape.setPosition(x, y);
 
    for (int i = 0; i < 5; i++)
    {
        small_rect_shape[i].setSize(Vector2f(1010));
        small_rect_shape[i].setFillColor(Color::Yellow);
        small_rect_shape[i].setOutlineColor(sf::Color::Blue);
        small_rect_shape[i].setOutlineThickness(20);
        small_rect_shape[i].setPosition(x+((i+1)*100), y);
    }
 
    cout << "프로그램이 시작되었습니다." << endl;
 
    //화면 크기, 캡션 이름 설정
    RenderWindow app(VideoMode(10001000), "https://maincodes.tistory.com/");
    app.setFramerateLimit(60);  //프레임 비율 설정
 
    //SFML 메인 루프 - 윈도우가 닫힐때 까지 반복
    while (app.isOpen())
    {
        float time = clock.getElapsedTime().asSeconds();
        clock.restart();
        timer += time;
 
        Event event;
 
        //이벤트 처리
        while (app.pollEvent(event))
        {
            //프로그램 종료 이벤트 처리
            if (event.type == Event::EventType::Closed)
            {
                app.close();
                cout << "프로그램이 종료되었습니다." << endl;
            }
 
            //키보드 눌림(Pressed) 이벤트
            if (event.type == Event::KeyPressed)
            {
                if(event.key.code == Keyboard::Space)
                {
                    cout << "Space 키 눌림 " << endl;
 
                    float speed = 3;
 
                    //작은 사각형 애니메이션 효과
                    for (int i = 0; i < 50; i += speed)
                    {
                        small_rect_shape[0].move(speed * 1, speed * 1);
                        app.draw(small_rect_shape[0]);
                        app.display();
                    }
 
                    //작은 사각형 원 위치
                    small_rect_shape[0].setPosition(Vector2f((float)x, (float)y));
                    break;
                }
            }
        }
 
        //배경화면을 흰색으로 clear
        app.clear(Color::White);
 
        //rect_shape 위치 보정
        rect_shape.setPosition(Vector2f(x - 100.f, y - 100.f));
        app.draw(rect_shape);
 
 
        //텍스트 이동
        text1.move(1.f, 1.f);
        
        //글자 위치 재설정
        if (text1.getPosition().x == 1000 || text1.getPosition().y == 1000)
            text1.setPosition(1010);
 
        //타이머에 맞춰 글자 크기를 확대
        text1.setScale(timer * 1.5f, timer * 1.2f);
 
        //글자 크기 재설정
        if(text1.getScale().x == 100 || text1.getScale().y == 100)
            text1.setScale(1.0f, 1.0f);
 
 
        //글자 로테이션 설정
        text1.setRotation(timer * 100);
        app.draw(text1);
 
 
        //작은 사각형 이동
        for (int i = 0; i < 5; i++)
        {
            small_rect_shape[i].move(05.f);
 
            if (small_rect_shape[i].getPosition().y == 1000)
                small_rect_shape[i].setPosition(x + ((i + 1* 100), y);
 
            app.draw(small_rect_shape[i]);
        }
 
        //큰 사각형 로테이션
        rect_shape.setRotation(timer * 150);
        app.draw(rect_shape);
 
 
        //약 5초 후에는 타이머 재설정
        if (timer > 5)
            timer = 0;
        cout << "timerRotate = " << timer << endl;
 
        //프레임을 스크린에 출력
        app.display();
    }
 
    return 0;
}
 
// Text 설정 함수
int print_text(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;
}
cs

 

실행결과(Output):

 

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