-
SFML / 윈도우 관리, 이벤트 튜토리얼활동 기록 😵💫/SFML 테트리스 2023. 2. 5. 02:06
#include <SFML/Window.hpp> int main() { sf::Window window(sf::VideoMode(800, 600), "My window"); ... return 0; }
sf::Window::Window(VideoMode mode, const String& title, Uint32 style = Style::Default, const ContextSettings& settings = ContextSettings())
생성자
첫번째 인자 -> 윈도우 사이즈 정의
두번째 인자 -> 윈도우 타이틀
세번째 인자 -> 스타일
스타일 목록 sf::Style::Titlebar // 타이틀바 sf::Style::Resize // 사이즈조절 최대화버튼 sf::Style::Close // 종료버튼 sf::Style::Fullscreen //풀스크린으로 보임 (다른것과 섞어쓸수없음) sf::Style::Default // 디폴트 스타일
네번째 인자 -> OpenGL 옵션 정의
윈도우 객체 생성 후 윈도우 만드려면 creat 메소드 사용 생성자와 인자 같다.
#include <SFML/Window.hpp> int main() { sf::Window window; window.create(sf::VideoMode(800, 600), "My window"); ... return 0; }
// 윈도우 위치 변경(relatively to the desktop) window.setPosition(sf::Vector2i(10, 50)); // 윈도우 사이즈 변경 window.setSize(sf::Vector2u(640, 480)); // 윈도우 타이틀 변경 window.setTitle("SFML window"); // 윈도우 사이즈 get sf::Vector2u size = window.getSize(); unsigned int width = size.x; unsigned int height = size.y; ...
window.setFramerateLimit(60); // 윈도우 생성 후에 호출하세요 (모니터의 화면재생비율과 같은 수직주파수로 동기화)-> sf::Clock과 sf::sleep를 섞어서 사용
sf::Event
pollEvent 나 waitEvent 메소드만 유효한 이벤트 제공
일반적인 이벤트 루프
sf::Event event; while(window.pollEvent(event)) //이벤트를 기다림 { switch(event.type) //이벤트 타입 체크 { case sf::Event::Closed:window.close(); //윈도우 닫힘 break; case sf::Event::KeyPressed: //Key가 눌림 break; default; //다른 이벤트 타입 무시 break; }}
Event::Close
->종료할때 기능 이용해서 앱상태 저장하거나 사용자가 원하는 것 물어보는 등 작업 수행 가능
if (event.type == sf::Event::Closed) window.close();
Event::Resized
->윈도우 사이즈 재조정할때 , window.setSize 호출할때 기능
렌더링 세팅 조정할때 OpenGL 쓰면 viewport, sfml-graphics 쓰면 current view
관련 멤버 : event.size
if(event.type == sf::Event::Resized){ std::cout << "new width:" << event.size.width << std::endl; std::cout << "new height: " << event.size.height << std::endl; }
Event::LostFocus와 Event::GainedFocus
->윈도우 포커스 벗어났을 대 키보드 이벤트 받을 수 없도록 기능
예를들어 윈도우 비활성화상태 일때 게임 정지 시키고자 사용
if(event.type == sf::Event::LostFocus) myGame.pause(); if(event.type == sf::Event::GainedFocus) myGame.resume();
Event::TextEntered
-> 문자가 타이핑될때 트리거 발생. 사용자의 입력 번역해서 적절히 출력할 수 있는 문자로 제공
예를들어 불어 '^'를 누르고 'e'를 누르면 'ê'로 번역(keyPressed 이벤트와 혼동하면 안됨 이 경우 두개로 제공)
관련멤버 : event.text
Event::KeyPressed 와 Event::KeyReleased
-> 키보드키 눌리거나 떼졌을 때 기능
이벤트로 스무스한 움직임을 짜놓고자 한다면, KeyPressed를 세팅하고 KeyReleased가 clear하는 boolean을 써야만 합니다. 혹은 sf::Keyboard 사용
if(event.type == sf::Event::KeyPressed) { if(event.key.code == sf::Keyboard::Escape) { std::cout << "the escape key was pressed" << std::endl; std::cout << "control:" << event.key.control << std::endl; std::cout << "alt:" << event.key.alt << std::endl; std::cout << "shift:" << event.key.shift << std::endl; std::cout << "system:" << event.key.system << std::endl; } }
Esc 버튼 눌렀을 때 종료하기
if (event.type == sf::Event::KeyPressed) if (event.key.code == sf::Keyboard::Escape) cherry.close();
Event::JoystickButtonPressed 와 ButtonReleased
->조이스틱 버튼 눌리거나 떼였을 때 기능 8개의 조이스틱(X, Y, Z, R, U, V, POV X와 POV Y) , 32개 버튼 지원
관련멤버 : event.joystickButton
if(event.type == sf::Event::JoystickButtonPressed) { std::cout << "joystick button" << std::endl; std::cout << "joystick id:" << event.joystickButton.joystickld << std::endl; std::cout << "button:" < event.joystickButton.button < std::endl;
Event::JoystickMoved
-> 조이스틱 움직일때 트리거
관련멤버 : event.joystickMove (조이스틱 식별자, 축의 이름 , [-100, 100] 범위내 현재위치 포함)
if (event.type == sf::Event::JoystickMoved) { if (event.joystickMove.axis == sf::Joystick::X) { std::cout << "X axis moved!" << std::endl; std::cout << "joystick id: " << event.joystickMove.joystickId << std::endl; std::cout << "new position: " << event.joystickMove.position << std::endl; } }
내일 1. 키보드 튜토리얼 정리하면서 도형 움직이는거 실습 !
2. OpenGL 튜토리얼
근데 window랑 Render 윈도우랑.... 이벤트 처리는 같겠지....?
'활동 기록 😵💫 > SFML 테트리스' 카테고리의 다른 글
SFML / Texture Sprite(이미지) (3) 2023.02.05 SFML/ 키보드 (4) 2023.02.05 SFML / 기본윈도우 (1) 2023.02.04 SFML/ 사용자 데이터 스트림 (5) 2023.02.04 SFML 튜토리얼(시간, 스레드) (4) 2023.01.23