Как управлять рендерингом SFML «сигнальным» способом? - PullRequest
0 голосов
/ 14 марта 2011

Я занимаюсь разработкой небольшой игры со змеями, написанной на C ++, и использую 2D-библиотеку SFML.Проблема в том, что для того, чтобы визуализировать окно и что-либо напечатать в нем, вы должны сделать это через

while (App->IsOpened())
{
    //Do the stuff
    App->Clear();
    App->Display();
}

Но я бы хотел построить свою программу более общими способами,что позволило бы мне просто инициализировать окно, а затем отправлять ему сигналы, такие как «RenderARect» в нем или «ClearTheWindow», вне оператора while.Это позволило бы мне использовать мой экземпляр класса рендеринга в качестве динамической библиотеки для примера, делая код игры и код рендеринга двумя разными и независимыми вещами ...

Не могли бы вы дать какие-либо советы о том, как реализовать такиесистема сигналов для моей SFML-программы?

PS: я слышал о libsigc ++, но не знаю, как ее реализовать ...

Спасибо!

1 Ответ

5 голосов
/ 14 марта 2011

Нет необходимости отправлять такие сигналы. Все должно быть обработано в цикле while (основной цикл), и каждый кадр должен быть очищен и прорисован отдельно и в целом, а не в регионах, поэтому SFML использует OpenGL.

Самый очевидный способ отделить игровую логику от основного цикла - сделать игру ООП. Конечно, он разделит его только на отдельные логические блоки в отдельных файлах, но они будут выполняться «вместе» в одном цикле. Я думаю, что это желаемое (но по крайней мере приемлемое) поведение.

Таким образом, у вас будет класс Game, у которого будет метод Update (). Здесь происходит игровая логика, события обрабатываются (предпочтительно, события запрашиваются перед вызовом и передаются в качестве параметра в Update ()), а состояние всего, что должно отображаться, обновляется. Вы должны вызывать это на каждой итерации основного цикла.

И этот класс также будет иметь метод Render (), который будет рисовать все, что нужно.

Так бы это выглядело так:

while (App->IsOpened())
{
    Game->Update();
    App->Clear();
    Game->Render();
    App->Display();
}

П.С .: Извините за мой плохой английский, надеюсь, вы понимаете это.

...