<토이프로젝트>/[C++ SFML 게임]

[C++ SFML 게임] 구글 공룡 게임

BlockDMask 2019. 11. 29. 02:48
반응형

안녕하세요. BlockDMask 입니다.

오늘은 C++ SFML을 이용해서 만든 구글 공룡 게임을 소개해볼까 합니다.

만약 SFML 말고 C/C++로만 구현한 공룡게임을 보고싶다면 [바로가기] 로 이동 해주시면 됩니다.

C/C++로 콘솔에서 구현한 것과 달리 SFML을 이용해서 구현했기 때문에 좀더 게임스러워 진 것을 볼 수 있습니다.


<목차>

1. 게임 이름 및 기본 설명

2. 게임 영상

3. 소스 코드


1. 게임 이름 및 기본 설명


▶ 게임 이름

C++ 구글 공룡 게임

C++ sfml 공룡 게임


▶SFML 이란 

간단히 sfml이 무엇인지 알고 넘어가겠습니다.


: 위키의 정의를 한번 보면 

SFML(Simple and Fast Multimedia Library)은 컴퓨터의 다양한 멀티미디어 구성 요소에 단순한 API를 제공하기 위해 설계된 크로스 플랫폼 소프트웨어 개발 라이브러리이다. C, 크리스탈, D, 유포리아, Go, Java, Julia, .NET, Nim, OCaml, Python, Ruby, and Rust용으로 이용 가능한 바인딩과 함께 C++로 작성되어 있다. 실험적인 모바일 포트들은 SFML 2.2의 출시와 함께 안드로이드, iOS용으로 이용 가능하게 되었다.

(출처 : https://ko.wikipedia.org/wiki/SFML)


: 블라블라 머라고 되어있는데 사실 잘 와닿지 않습니다.

저도 설명을 잘 못하지만 한번 요약해보겠습니다.

: SFML은 게임(멀티미디어)을 편하게 만들수 있게 도와주는 함수들(API)을 모아놓은 라이브러리 입니다. C++로 만들어져있구요.

다양한 플렛폼에서 사용가능합니다.

: 저희한테 맞게 말하자면, SFML이 게임을 만들기 쉽게 함수들 다 만들어 놨으니 저희는 함수를 그냥 가져다 쓰기만 하면 됩니다.


2. 게임 영상

▶영상 주소 https://youtu.be/W9SfkPTn5BU


**영상에 DDangCo라고 나오는 부분은... 제가 맞습니다. 제가 예전에 활동했을때 DDangCo라는 닉네임으로 활동을 했었습니다.

영상을 새롭게 찍을까 싶었는데, 이제는 기억도 잘 안나는 프로젝트라서 비용이 많이 들것 같아서 그대로 올리게 되었습니다.

DDangCo는 잊어주시고. BlockDMask 로 기억해주세요.


**SFML 라이브러리는 설치와 설정이 따로 필요합니다. 구글이나 유튜브에 검색하면 쉽게 설명해 놓은것들이 많으니 따라서 하시면됩니다. 

(그래도 설치가 힘들다면, 요청이 많으면 제가 포스팅을 할수도............)



3. 공룡 게임 소스코드


▶ 소스코드

**직접 게임을 만들어보고 싶은 분들은 제 깃허브 계정에 가면 소스코드와 이미지 파일을 올려 주었습니다.
깃허브 주소는 글 맨 하단에 존재합니다.

단, 사용하실때 출처 남겨주세요. 소스코드도 제가 직접 작성한것이고, 그림도 제가 직접 그렸습니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//[C++ SFML 구글 공룡게임 만들기]
//by. BlockDMask.
 
#include<SFML/Graphics.hpp>
using namespace sf;
#define WIDTH 600
#define HEIGHT 300
struct Position
{
    int x;
    int y;
};
 
int main(void)
{
    //SFML 윈도우을 열어주고, title을 정해줍니다.
    RenderWindow window(VideoMode(WIDTH, HEIGHT), "Dinosaur Game. By BlockDMask");
    window.setFramerateLimit(60);    //프레임 정해주기
 
    //dino
    Texture t1;
    Texture t2;
    t1.loadFromFile("images/dino1.png");    //실제 그림을 받아 옵니다.
    t2.loadFromFile("images/dino2.png");
 
    //스프라이트로 만들어줌
    Sprite dinoArr[2];
    dinoArr[0= Sprite(t1);
    dinoArr[1= Sprite(t2);
 
    static const int DINO_Y_BOTTOM = HEIGHT - t1.getSize().y;    //공룡 바닥위치
    
    Position dinoPos;
    dinoPos.x = 50;
    dinoPos.y = DINO_Y_BOTTOM;
 
    //프레임에 따라 왼발 오른발 해주기 위한 변수 네개
    int index            = 0;    //왼발 오른발 인덱스
    float frame            = 0.f;
    float frameSpeed    = 0.4f;
    const int changeCount = 5;    //몇 프레임에 체인지 할지
 
    const int gravity = 5;    //중력. 점프할때 사용
    bool isJumping = false;    //점프 중인지
    bool isBottom = true;    //바닥에 발이 닿았는지
cs

46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
    //tree
    Texture t3;
    t3.loadFromFile("images/tree.png");
    Sprite tree(t3);
    static const int TREE_Y_BOTTOM = HEIGHT - t3.getSize().y;    //나무 바닥
    Position treePos;
    treePos.x = WIDTH - 20;
    treePos.y = TREE_Y_BOTTOM;
    const int treeSpeed = 4;    //나무 스피드
    while (window.isOpen())        //윈도우가 열렸으면
    {
        Event e;
        while (window.pollEvent(e))    //윈도우 이벤트를 받는데
        {
            if (e.type == Event::Closed)    //닫기면 윈도우 닫음
            {
                window.close();
            }
        }
        //logic.
        //dino jump.
        if (Keyboard::isKeyPressed(Keyboard::Space)) //스페이스 입력 감지
        {
            if (isBottom && !isJumping)    //바닥이고, 점프중이 아닐때 점프 가능
            {
                //make jumping stage;
                isJumping = true;
                isBottom = false;
            }
        }
        //dino jump(up and down)
        if (isJumping)    
        {
            dinoPos.y -= gravity; //점프중일때는 y에서 중력을 뺴줌 그럼 올라감
        }
        else
        {
            dinoPos.y += gravity;
        }
        //dino jump limit, dino bottom limit.
        if (dinoPos.y >= DINO_Y_BOTTOM)    //바닥에서 지하로 가지 않도록 설정
        {
            dinoPos.y = DINO_Y_BOTTOM;
            isBottom = true;
        }
        if (dinoPos.y <= DINO_Y_BOTTOM - 100)    //점프해서 우주로 가지 않도록 설정
        {
            isJumping = false;
        }
        //dino step.
        frame += frameSpeed;
        if (frame > changeCount)
        {
            frame -= changeCount;
            ++index;
            if (index >= 2) { index = 0; }
        }
        //tree move.
        if (treePos.x <= 0)
        {
            treePos.x = WIDTH;
        }
        else
        {
            treePos.x -= treeSpeed;
        }
        //tree Position.
        tree.setPosition(treePos.x, treePos.y);
        //dino Position.
        dinoArr[index].setPosition(dinoPos.x, dinoPos.y);
        //draw.
        window.clear(Color::White);
        window.draw(dinoArr[index]);
        window.draw(tree);
        window.display();
    }
    return 0;
}
 
cs


감사합니다.

깃허브 주소 : https://github.com/BlockDMask/SFML_GoogleDino_Game

반응형