공부/SFML

열거형 enum, 상수 const, 키보드 입력 - 이벤트, pressed 처리

월러비 2025. 6. 12. 18:28

열거형 enum

enum class Side {LEFT, RIGHT, NONE};

Side side;
side = Side::LEFT;
if (side == Side::RIGHT)
{ }
else
{ }
  • 프로그래머가 정의해서 사용하는 ‘사용자 정의 데이터형’이다.
  • Side : 데이터 형 이름
  • 데이터 형이 가진 값을 같이 선언하는 것이다.
  • 열거에 선언한 요소는 하나하나가 정수형 인덱스를 가진다.
    • LEFT는 0번째 자리다.

상수 const

const int NUM_BRANCHES = 6;

sf::Sprite spriteBranch[NUM_BRANCHES]; //가지
  • 읽기만 가능하고 쓸 수는 없는 값이다.
    • 즉, 변하지 않는 값이다.

키보드 입력 - 이벤트

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
    sidePlayer = Side::LEFT;
}

// 이벤트 루프 : 이벤트 처리 구간
sf::Event event;
while (window.pollEvent(event))
{
    switch (event.type)
    {
    case sf::Event::Closed:
        window.close();
        break;

    case sf::Event::KeyPressed:
        switch (event.key.code)
        {
        case sf::Keyboard::Escape:
            printf("ESC");
            break;
        }
        break;

        case sf::Event::KeyReleased:
            break;
    }
        
}
  • 눌렸을때, 떨어졌을때, 눌림과 떨어짐 그 사이 3개의 상황이 있다.
  • 하나의 처리는 한 프레임에 하나씩 일어난다.
    • 누름과 뗌은 다른 프레임이다.

pressed 처리

    bool isLeft = false; //눌렸는지 확인 변수

    while (window.isOpen())
    {
      bool isLeftDown = false; //눌린 첫 프레임의 확인 변수
      bool isLeftUp = false;
      
      sf::Event event;
      while (window.pollEvent(event))
      {
          switch (event.type)
          {
          case sf::Event::KeyPressed:
              switch (event.key.code)
              {
                  case sf::Keyboard::Left:
                      if (!isLeft)
                      {
                          isLeftDown = true;
                      }

                      isLeft = true;
                      break;
              }
              break;

              case sf::Event::KeyReleased:
                  switch (event.key.code)
                  {
                  case sf::Keyboard::Left:
                      isLeft = false;
                      isLeftUp = true;
                      break;
          }
      }
  • 플래그 변수 2개 사용
    • 이유 : 한 플래그는 갱신이 되면 안되기 떄문이다.
    1. 플래그 2번 false 무한 반복
    2. 첫 플래그 false 검사 → 되면 플래그 2번을 true
    3. 플래그1번을 true하고 플래그 2번 true 확인
    4. 플래그 1번이 true 이기에 플래그 2번이 false가 나오기에 조건 참이 안나오게 된다.
    5. 결과 : 반복 입력이 1번만 들어가게 된다.