Форум программистов, компьютерный форум, киберфорум
Наши страницы

Пишу игровой движок на C++. 006. Главный цикл.

Войти
Регистрация
Восстановить пароль
Исходные коды движка - https://github.com/532235/GoST
Документация

Другой хобби-проект в группе в вк https://vk.com/club154291467
Оценить эту запись

Пишу игровой движок на C++. 006. Главный цикл.

Запись от 532235 размещена 10.11.2017 в 23:40
Метки c++, движок

Нужно сделать главный цикл.

простого бесконечного цикла с возможностью выхода не достаточно. Движок должен реагировать на события, окно должно обновляться. В общем есть те вещи, которые нужно проверять каждый кадр перед рисованием.

Пусть у главного класса gtMainSystem будет метод update
C++
1
2
    /// Используется для главного цикла. Возвращает true если всё впорядке, или не был послан сигнал о завершении работы
    virtual bool    update( void ) = 0;

Как он будет работать. Можно сразу написать в тестовой программе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(){
 
    gtDeviceCreationParameters params;
 
    gtPtr<gtMainSystem> my_system( gtPtrNew<gtMainSystem>( InitializeGoSTEngine(params) ) );
 
    auto * output = my_system->getOutputWindow();
    output->setWindowText( u"Hello world" );
 
    while( my_system->update() ){
 
    }
 
    return 0;
}
Нужно реализовать метод. В gtMainSystemWin32 добавляю
C++
1
bool    update( void ) GT_FINAL;
Я подумал, что можно отделить обработку оконных сообщений в отдельный метод. Как в Думе 3.
Пусть будет ещё 1 метод, внутри gtMainSystemWin32
В private:
C++
1
2
/// получает и обрабатывает оконные сообщения
        void updateWindowEvents( void );
И ещё 1, ниже updateWindowEvents
C++
1
2
/// завершает работу
        void quit( void );
--------------------------------

Сначала updateWindowEvents
C++
1
2
3
4
5
6
7
8
9
10
11
/// получает и обрабатывает оконные сообщения
    void gtMainSystemWin32::updateWindowEvents( void ){
        MSG msg;
        while( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ){
            if( !GetMessage( &msg, NULL, 0, 0 )){
                this->quit();
            }
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
    }
Метод quit(); должен делать так чтобы update возвратил false, и программа завершилась.

Нужна новая общая переменная.

Иду в gtMainSystemCommon

В
C++
1
protected
: добавляю
C++
1
2
/// она возвращается в методе update
        bool    m_isRun;
и инициализирую
C++
1
2
gtMainSystemCommon::gtMainSystemCommon( void ) : m_isRun( true ){
}
Возвращаюсь в gtMainSystemWin32.cpp и реализую метод quit()
C++
1
2
3
4
/// завершает работу
void gtMainSystemWin32::quit( void ){
    m_isRun = false;
}
Можно было бы весь quit вынести в Common класс, и, думаю, так и нужно сделать, но, пока повременю, быть может будет такая вещь, очень зависимая от ОС. фиг знает.

----------------

И сама функция update
C++
1
2
3
4
5
bool    gtMainSystemWin32::update( void ){
        this->updateWindowEvents();
 
        return m_isRun;
    }
Всё, теперь можно избавится от консольного окна. Будет показано недоделанное окно вывода. Его можно двигать и т.д., а по нажатию на крестик, update() вернёт false и программа завершится

Переделанная тестовая программа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#if defined( GT_PLATFORM_WIN32 )
#include <Windows.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
#endif
 
 
    gtDeviceCreationParameters params;
 
    gtPtr<gtMainSystem> my_system( gtPtrNew<gtMainSystem>( InitializeGoSTEngine(params) ) );
 
    auto * output = my_system->getOutputWindow();
    output->setWindowText( u"Hello world" );
 
    while( my_system->update() ){
 
    }
 
    return 0;
}
Размещено в Игровой движок
Просмотров 253 Комментарии 0
Всего комментариев 0

Комментарии

 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.