SFML 4

김성진·2024년 2월 6일

2월 6일 수업 정리

오늘은 Timber 게임의 핵심적인 게임 메카닉을 구현하고, 점수와 게임종료, 재시작 등을 연결시켜 실제 게임 플레이 가능한 수준까지 완성시킨다.

초기화 세팅

게임의 메카닉만 구현했지 초기 세팅을 하지 않아서 첫 나뭇가지 6개가 전부 열거형 첫번째 요소인 LEFT로 정렬되어 있거나, 재시작하는 함수 등등이 없다.
우선 재시작 하는 함수 InitGame을 만들자.

void InitGame() // 게임 초기화
{
    for (int i = 0; i < NUM_OF_BRANCHES; ++i)
    {
        UpdateBranches();
    }
    brancheSides[NUM_OF_BRANCHES - 1] = Sides::NONE;
    brancheSides[NUM_OF_BRANCHES - 2] = Sides::NONE;
    scoreNumber = 0;
    scoreString = "SCORE = " + std::to_string(scoreNumber);
    scoreMessage.setString(scoreString);
    timeBarCurrentSize.x = timeBarSize.x;
}

여러가지가 들어있다. UpdateBranches를 6번 해서 나뭇가지를 재배치 해주고,
플레이어에게 가장 가까운 5, 6번째 나뭇가지를 없애서 공간을 확보했다.
스코어를 0으로 초기화 해주고, 타임바도 꽉 채워줬다.
다만 이런것들을 위해 관련 변수를 전부 전역변수로 바꿔야 했다.
대충 만든것이라 어쩔수 없지만 포인터를 사용했다면 더 깔끔하게 가능했을것이다.

키 입력에 따른 게임진행

이제 지금까지 만든 기능들을 합쳐서 게임 진행을 구현한다.
가장 아랫 나뭇가지의 방향과 플레이어의 방향이 같다면 그건 나뭇가지에 충돌했음을 의미하니 게임 오버 조건으로 하고, 키 입력시에 점수가 올라가는걸 처리하는건 좋지 않으니 isMove 변수를 통해 isMove가 작동해도 게임이 끝나지 않았다면 isMove를 끄고 점수와 타임바를 올려주는 코드를 짠다.

       if (!isPause)
        {
            bool isMove = false;
            if (inputMgr::GetKeyDown(sf::Keyboard::Left) && !isOver)
            {
                spritePlayer.setPosition(windowWidth / 2 - 300, windowHeight - 300);
                spritePlayer.setScale(-1.f, 1.f);
                spriteAxe.setPosition(windowWidth / 2 - 90, windowHeight - 290);
                spriteAxe.setScale(-1.f, 1.f);
                playerSide = Sides::LEFT;
                isMove = true;
                UpdateBranches();

            }
            if (inputMgr::GetKeyDown(sf::Keyboard::Right) && !isOver)
            {
                spritePlayer.setPosition(windowWidth / 2 + 300, windowHeight - 300);
                spritePlayer.setScale(1.f, 1.f);
                spriteAxe.setPosition(windowWidth / 2 + 90, windowHeight - 290);
                spriteAxe.setScale(1.f, 1.f);
                playerSide = Sides::RIGHT;
                isMove = true;
                UpdateBranches();
 
            }

            if (isMove)
            {
                if (playerSide == brancheSides[NUM_OF_BRANCHES - 1] && !isOver)
                {
                    isOver = !isOver;
                }
                else
                {
                    isMove = false;
                    scoreNumber += 10;
                    scoreString = "SCORE = " + std::to_string(scoreNumber);
                    scoreMessage.setString(scoreString);
                    timeBarCurrentSize.x += 50;
                    if (timeBarCurrentSize.x > timeBarSize.x)
                    {
                        timeBarCurrentSize.x = timeBarSize.x;
                    }

                }
            }
        }

이 모든건 게임이 일시정지 되지 않았을 경우에만 실행하도록 모두를 포괄해서 if문안에 넣어준다.

이제 게임 오버가 될 경우 재시작 하는 부분을 만들어준다

if (inputMgr::GetKeyDown(sf::Keyboard::Enter) && isOver)
        {
            isOver = !isOver;
            InitGame();
        }

플레이어의 위치도 초기화 하면 좋지만 중요하지 않은것 같아 생략했다.

이제 기본적인 게임의 역할은 할 수 있다. 가지를 피해가며 좌우 키를 입력하면
점수가 오른다. 이제 주변 나무를 배치하고, 좌우 키 입력시 나무토막이 날아가는 등의 부가적인 요소 정도만 남아 Timber 게임제작 실습을 마친다.

여태까지 c언어 방식으로 길게 코드를 적어가며 공부를 했지만 사실 좋은 방법은 아니다.
따라서 이제부터 만들었던 기능들을 캡슐화 시키는 방법을 배운 후 다시 Timber 게임 코드를 고쳐서 깔끔하게 만들어보겠다.

profile
듀얼리스트

0개의 댓글