티스토리 뷰

이 포스트에서 알 수 있는 것 

  • sf::Window
  • sf::Style
  • sf:State
  • SFML  응용프로그램 수명주기 

들어가기 전에...

SFML 프로젝트 셋팅이 힘든이들에게 이전 포스트에 SFML 프로젝트 생성하는 방법을 포스팅 해두었다. 

 

https://kwonvector.tistory.com/54

 

[SFML] SFML 3.0 Visual Studio 개발 환경 구축하기

개요SFML 환경 셋팅은 공식 사이트의 튜토리얼 페이지를 참고하면 누구나  쉽게 따라할 수 있다.  윈도우, 리눅스,   mac 등의 플랫폼마다 설정하는 방법이 명시되어 있었다.  검색창에 "SFML Tut

kwonvector.tistory.com

 

필자가 셋팅한 SFML 프로젝트는 다음과 같다. 

아쉽게도 필자는 mac 도 없는 거지라(mac 써본적이 한번도 없다;;) mac 버전은 다른 포스팅을 찾아보시길 ^^

구분 내용
OS Windows 
개발 도구 Visual Studio 2022 Community
SFML 버전  SFML 3.3.1

1. Window  생성

SFML의 Window은 `sf::window` 클래스에서 정의된다.  window 클래스 클래스를 생성하면 즉시 창이 열리게 된다. 

 

// main.cpp
#include <SFML/Window.hpp> 

int main()
{
	sf::Window window(sf::VideoMode({800,600}), "this is my First Window");
	...
}

 

Window 클래스의 생성자 인수에 주목을 해보자. 

 

인수 이름 설명
1 VideoMode  - SFML window의  사이즈를 정의한다.  
- 단위는 픽셀[pixel]
- sf::VideoMode 클래스 타입 
2 Title bar - SFML window의 제목을 정의한다. 
- SFML 프로그램이 실행될 때 상단에 표시된다. 
3 Style - SFML window의 스타일을 선택한다.
- 해당 인수는 옵션이다. (추가 안해도 된다.) 
- Style에 대한 설명은 `참고1` 를 참고
4 State - SFML window의 창 상태를 정의 
- 해당 인수는 옵션이다. (추가 안해도 된다.) 
- State에 대한 설명은 '참고2' 를 참고
5 OpenGL setting - OpenGL 셋팅할 때 사용 
- 자세한 정보는 이 링크를 참조

 

 

이렇게 window 생성자의 5가지 인수를 설정할 수 있다. 

 

자, 다시 본론으로 돌아가서 위 코드 블럭처럼 코딩을 하고 프로그램을 실행해보자. 

 

으잉? 분명 윈도우를 생성했는데 프로그램이 종료됐다고 한다. 

 

코드의 흐름을 보면...

1. Main 함수 실행

2. SFML 윈도우 생성

3. Main 함수 완료

4. 프로그램 종료

 

그렇다. SFML 프로그램 실행을 유지시키려면 별도의 로직이 추가적으로 필요하다. 

 

창이 열려 있는동안 반복 루프에 가두면 윈도우는 계속 활성화 되지 않을까?

 

이를 코드로 표현하면

// main.cpp
#include <SFML/Window.hpp> 

int main()
{
	sf::Window window(sf::VideoMode({800,600}, "this is my First Window");
	
    // window가 열려 있으면 해당 루프를 계속 반복한다.
    while (window.isOpen())
    {
		// 입력 이벤트를 처리
        while (const std::optional event = window.pollEvent())
        {
            if (event->is<Event::Closed>())
                window.close();
        }
    }
}

 

위 코드는 SFML window가 열려있는 동안 while 루프가 계속 반복되고 해당 루프안에 입력 이벤트를 수신 받는다. 

 

만약 Closed 이벤트가 입력되면 생성된 window를 닫고, 상위의 while 루프는 종료되고 프로그램이 종료된다. 

 

작성한 코드를 빌드하고 실행시켜보면 아래와 같이 SFML window가 실행된 것을 볼 수 있다.

SFML window가 실행된 모습


2. Window 관리 

2.1 기본 설정 멤버 함수

// change the position of the window (relatively to the desktop)
window.setPosition({10, 50});

// change the size of the window
window.setSize({640, 480});

// change the title of the window
window.setTitle("SFML window");

// get the size of the window
sf::Vector2u size = window.getSize();
auto [width, height] = size;

// check whether the window has the focus
bool focus = window.hasFocus();

2.2 주사율(framerate) 제어 멤버 함수

window.setVerticalSyncEnabled(true); // call it once after creating the window

window.setFramerateLimit(60); // call it once after creating the window

 

※ 주의: 위 두 함수를 동시에 설정하면 오류가 발생할 수 있으니 둘 중 하나만 사용해야 한다. 

 

 


3. Window에 특수 기능을 추가하고 싶다면

windowfmf 위한 고급 기능이 정말 필요하다면, 다른 라이브러리를 사용하여 창(또는 전체 GUI)을 생성하고 SFML을 그 안에 삽입할 수 있다.

sf::WindowHandle handle = /* specific to what you're doing and the library you're using */;
sf::Window window(handle);

 


4. Window에 대해 알아야 할 사항

다중 Window 생성 가능 

SFML을 사용하면 여러 창을 만들 수 있으며, 모든 창을 메인 스레드에서 처리하거나 각각의 창을 자신의 스레드에서 처리할 수 있다.  이 경우, 각 창에 대해 이벤트 루프를 잊으면 안된다. 

멀티 모니터는 아직 지원하지 않는다.

SFML은 여러 모니터를 명시적으로 관리하지 않는다. 따라서 창이 어느 모니터에 나타날지 선택할 수 없고, 하나 이상의 전체 화면 창을 만들 수 없다. 이는 향후 버전에서 개선될 예정이라고 한다. 

이벤트는 오직 Window 스레드에서 폴링(polling)된다. 

대부분의 운영 체제에서 중요한 제한 사항 중 하나는 이벤트 루프(정확히 말하면, pollEvent 또는 waitEvent 함수)가 창을 생성한 동일한 스레드에서 호출되어야 한다는 것이다. 따라서 이벤트 처리를 위한 전용 스레드를 만들고자 한다면, 창 역시 해당 스레드에서 생성되도록 해야 한다. 스레드 간의 작업을 분할하려고 한다면, 이벤트 처리를 메인 스레드에 유지하고 나머지 작업(렌더링, 물리 처리, 논리 처리 등)을 별도의 스레드로 이동시키는 것이 더 편리하다.

Windows OS에서 SFML 창 크기가 데스크탑 창 크기보다 크면 예기치 못한 오류가 발생할 수 있다. 

어떤 이유로 인해, Windows는 데스크탑보다 큰 창을 좋아하지 않는다. 여기에는 VideoMode::getDesktopMode()로 생성된 창도 포함된다. 창 타이틀(테두리와 제목 표시줄)이 추가되면서, 데스크탑보다 약간 더 큰 창이 생성된다. 

 


참고 

참고1.  sf::Style 종류

   
sf::Style::None No decoration at all (useful for splash screens, for example); this style cannot be combined with others
sf::Style::Titlebar The window has a titlebar
sf::Style::Resize The window can be resized and has a maximize button
sf::Style::Close The window has a close button
sf::Style::Fullscreen The window is shown in fullscreen mode; this style cannot be combined with others, and requires a valid video mode
sf::Style::Default The default style, which is a shortcut for Titlebar | Resize | Close

 

참고2. sf::State 종류 

   
sf::State::Windowed Floating window
sf::State::Fullscreen Fullscreen window

 

'SFML' 카테고리의 다른 글

SAT 이론 및 구현 스터디(2)  (0) 2025.03.05
SAT 이론 및 구현 스터디(1)  (0) 2025.02.28
[SFML] 이벤트 다루어보기  (0) 2025.01.10
[SFML] SFML 3.0 Visual Studio 개발 환경 구축하기  (1) 2025.01.06
SFML 알아보기  (2) 2025.01.06
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함