사용자 도구

사이트 도구


raylib:flappy_bird_만들기
flappy bird 만들기

문서의 이전 판입니다!


  

기본 템플릿을 통해 플래피 버드를 만들기로 하자.

아래 템프릿을 다운받아서 VS CODE를 열자

템플릿 파일

중력에 의해 내려오는 새 만들기

1. 개념

새가 내려오게 할 것이다. 중력 가속도에 따라 내려오게 할 것이다.

매 프레임마다 속도는 중력에 따라 변화할 것이므로, 가속도를 먼저 설정해주고 매프레임마다 가속도를 더하게 하면 될 것이다.

2. bird.h

다음과 같이 기본 선언을 하였다. 내려오는 속도는 매 프레임마다 가속도를 더해주는 것이므로 맨 처음에는 0이다.

그리고 새의 위치는 raylib에서 기본으로 제공해주는 vector2를 이용하였다.

bird.h
#include "raylib.h"
 
#define GRAVITY 0.2f;  // 중력 값 : 가속도의 값이다.  한 프레임당 가속도이다. 
 
class Bird {
    public: 
 
    void Init();
    void Update();
    void Jump();
    void Draw();
 
    private:
    Vector2 pos; 
    float downSpeed = 0;
    float jumpSpeed = 6; 
    float halfLength = 20; 
 
    void CheckCollision();
};

2. bird.cpp

다음과 같이 기본 각 선언된 함수를 정의하였다. 여기까지는 코드만 보고도 이해하는데 어려움이 업을 것이다.

bird.cpp
#include "bird.h"
 
void Bird::Init()
{
    pos = {40, float(GetScreenHeight()) / 2} ;
}
 
void Bird::Update()
{
    downSpeed += GRAVITY;
    pos.y += downSpeed;
 
    CheckCollision();
}
 
void Bird::CheckCollision()
{
    if (pos.y - halfLength <= 0) pos.y = halfLength; 
 
    if (pos.y + halfLength >= GetScreenHeight()) pos.y = GetScreenHeight() - halfLength;
}
 
void Bird::Jump()
{
    downSpeed = 0; 
    pos.y -= jumpSpeed;
}
 
void Bird::Draw()
{
    DrawRectangle(pos.x - halfLength, pos.y - halfLength, halfLength * 2, halfLength * 2, DARKGREEN);
}

3. game.cpp

이제 이것을 game.cpp에 각 구현을 하자. 다음 코드만으로 충분히 이해가 갈 것이다.

다만 Game클래스가 선언되고 나서 전체 스크린의 값을 알 수 있으므로, Game클래스가 생성되고 나서 bird.Init()를 호출해야 한다는 것을 확인하자.

game.cpp
#include "game.h"
#include "bird.h"
 
Bird bird;
 
Game::Game(int width, int height, std::string title) 
{
    SetTargetFPS(60);               // Set our game to run at 60 frames-per-second
    InitWindow(width, height, title.c_str()); 
 
    bird.Init();
}
 
Game::~Game()
{
    CloseWindow();                  // Close window and OpenGL context
} 
 
bool Game::GameShouldClose() const
{
    return WindowShouldClose();
}
 
void Game::Tick()
{
    BeginDrawing();
    Update();
    Draw();
    EndDrawing();
}
 
void Game::Update()
{
    // Update
    //----------------------------------------------------------------------------------
    // TODO: Update your variables here
    //---------------------------------------------------------------------------------- 
    bird.Update();
 
    if (IsKeyPressed(KEY_UP)) bird.Jump(); 
}
 
void Game::Draw()
{ 
    // Draw
    //----------------------------------------------------------------------------------
 
        ClearBackground(BLACK);
        bird.Draw();
 
    //----------------------------------------------------------------------------------
}

기존과 달리, IsKeyDown()함수가 아니라 IsKeyPressed()함수를 이용하였다. IsKeyDown()함수는 키가 눌려지고 있는 상태면 계속 점프 함수를 호출하므로 게임이 너무 쉬워진다. 따라서 키를 누른 상태에서는 점프가 한번만 되게 바꿨다.

4. 점프 함수 수정 하기

기존에는 점프를 하면 바로 위치를 위로 올리기로 하였다. 그런데 이러면 순간이동을 하는 것으로 보이기 때문에 매우 어색하다.

점프버튼을 누르면 자연스럽게 위로 올라갔다가 내려오게 하자.

플레이어(새)는 매 프레임마다 중력을 받게 되어 있으므로 속도를 위쪽 방향으로 설정해주면 매프레임마다 속도가 떨어지면서 궁극적으로는 아래로 내려오게 될 것이다.

따라서 다음과 같이만 바꿔주면 된다.

여기서에서 점프스피드는 6정도가 알맞다. 450픽셀에서 6정도면 매우 작은 숫자같은데, 왜 적당한 숫자가 나오는지는 잘 모르겠다.

void Bird::Jump()
{
    downSpeed = -jumpSpeed; 
}
로그인하면 댓글을 남길 수 있습니다.

raylib/flappy_bird_만들기.1696319469.txt.gz · 마지막으로 수정됨: 2023/10/03 16:51 (바깥 편집)