ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Diseñada por Tistory.