Итак, стартую написание песочницы! В посте будет немного информации и кода.
Основной игровой цикл
Основной игровой цикл состоит из трёх шагов:
- Получение данных от устройств ввода
- Обновление игрового мира
- Генерация вывода (в данном случае изображения)
core/Game.h
:
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
#ifndef SANDBOX_GAME_H
#define SANDBOX_GAME_H
class Renderer;
class Game {
public:
Game();
bool initialize();
void runLoop();
void shutdown();
private:
void processInput();
void updateGame();
void generateOutput();
bool mIsRunning;
bool mUpdatingActor;
Renderer *mRenderer;
};
#endif // SANDBOX_GAME_H
В качестве библиотеки для работы с окнами, вводом-выводом использую SDL2.
Создадим класс Renderer
, который будет отвечать за всё отображение, а на данном этапе - за инициализацию окна.
core/Renderer.h
:
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
#ifndef SANDBOX_RENDERER_H
#define SANDBOX_RENDERER_H
#include <SDL2/SDL.h>
class Game;
class Renderer {
public:
Renderer(Game *game);
~Renderer() = default;
bool initialize(float screenWidth, float screenHeight);
void shutdown();
private:
SDL_Window *mWindow;
Game *mGame;
float mScreenWidth;
float mScreenHeight;
};
#endif // SANDBOX_RENDERER_H
Теперь надо сделать закрытие окна при нажатии на “крестик”:
1
2
3
4
5
6
7
8
9
10
void Game::processInput() {
SDL_Event event;
while(SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
mIsRunning = false;
break;
}
}
}
Заключение
Код ожидаемо получился похож на код из книги Game Programming in C++: Creating 3D Games: Creating 3D Games (Game Design), так как именно этот код я взял за основу. Дальше код будет так же похожим, костяк в этой книжке дан очень хорошо.
Сейчас открывается окно, можно его закрыть “крестиком”. Github code