Записи Sandbox::Write(Day001) Костяк песочницы, основной игровой цикл
Post
Cancel

Sandbox::Write(Day001) Костяк песочницы, основной игровой цикл

Итак, стартую написание песочницы! В посте будет немного информации и кода.

Основной игровой цикл

Основной игровой цикл состоит из трёх шагов:

  1. Получение данных от устройств ввода
  2. Обновление игрового мира
  3. Генерация вывода (в данном случае изображения)

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

Новый Roadmap

Sandbox::Write(Day002) GLM, Actor, Component

Comments powered by Disqus.