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

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

Войти
Регистрация
Восстановить пароль
Рейтинг: 1.00. Голосов: 1.

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

Запись от 532235 размещена 09.11.2017 в 00:33

Нет желания делать всё быстро и коротко. Обязательно что-то недопишу и придётся возвращаться к этому позже. Но и сразу всё нельзя писать заранее, можно запутаться.

Сейчас нужно написать главный класс, который будет управлять всеми остальными системами.
Пусть он имеет имя gtMainSystem, вроде логично и понятно.

Новый include файл gtMainSystem.h - добавить в gost.h ниже <gtOutputWindow.h>

Содержание gtMainSystem.h
C++
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
46
47
48
49
50
51
52
#pragma once
#ifndef __GT_MAIN_SYSTEM_H__
#define __GT_MAIN_SYSTEM_H__
 
/*
    Главный интерфейс
*/
 
namespace gost{
 
    //  Перечисление ОС
    enum class gtDeviceType{
        android,
        ios,
        linux,
        osx,
        windows,    //  конечно же будет реализован пока только он
        xbox,
        playstation,
        wii
        //хватит
    };
 
    //  В этой структуре будут находится параметры для запуска главной системы
    struct gtDeviceCreationParameters{
        gtDeviceCreationParameters( void ){
#if defined(GT_PLATFORM_WIN32)
            m_device_type   =   gtDeviceType::windows;
#else
#error "Эта ОС не поддерживается"
#endif
        }
        ~gtDeviceCreationParameters( void ){}
 
        //  Тип Операционной системы на которой будет работать программа
        gtDeviceType        m_device_type;
 
    };
 
    //  Основной класс движка
    class gtMainSystem : public gtRefObject{
    public:
 
        //  Для начала эта функция подойдёт.
        //  Как раз пригодится в будущем.
        virtual gtOutputWindow* getOutputWindow( void ) = 0;
 
    };
 
}
 
#endif
Теперь нужно реализовать этот класс.
Так как возможно в будущем будет поддержка иных ОС, то вполне вероятно что между реализациями будет много схожего. По крайней мере они все будут хранить gtDeviceCreationParameters
Можно сделать промежуточный класс, который хранит общие данные, выполняет одинаковые функции для всех.

Этот класс - реализация абстрактного класса. Он должен быть в движке. Пусть имеет имя gtMainSystemCommon

#include "gtMainSystemCommon.h" нужно вписать ниже #include "gtOutputWindowWin32.h"
содержание .h
C++
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
#pragma once
#ifndef __GT_MAIN_SYSTEM_COMMON_H__
#define __GT_MAIN_SYSTEM_COMMON_H__
 
/*
    Общий класс
*/
 
namespace gost{
        
        /// Общий класс для конкретных реализаций gtMainSystem
    class gtMainSystemCommon : public gtMainSystem{
 
    protected:
 
            /// параметры главной системы
        gtDeviceCreationParameters  m_params;
 
    public:
 
            /// конструктор
        gtMainSystemCommon( void );
 
            /// деструктор
        virtual ~gtMainSystemCommon( void );
 
 
    };
 
}
 
#endif
.cpp
C++
1
2
3
4
5
gtMainSystemCommon::gtMainSystemCommon(){
}
 
gtMainSystemCommon::~gtMainSystemCommon(){
}
Теперь конкретная реализация для windows.
Новый класс - gtMainSystemWin32. #include "gtMainSystemWin32.h" ниже #include "gtMainSystemCommon.h"
.h
C++
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
#pragma once
#ifndef __GT_MAIN_SYSTEM_WIN32_H__
#define __GT_MAIN_SYSTEM_WIN32_H__
 
/*
    Реализация главной системы для Windows
*/
 
namespace gost{
 
        /// Реализация главной системы для Windows
    class gtMainSystemWin32 GT_FINAL: public gtMainSystemCommon{
 
        gtPtr<gtOutputWindow>   m_output_window;
 
    public:
 
            /// конструктор
        gtMainSystemWin32( void );
 
            /// деструктор
        ~gtMainSystemWin32( void );
 
 
            /// инициализация в отдельном методе чтобы не занимались проблемами внутри конструктора
        bool    init( void );
 
 
        gtOutputWindow* getOutputWindow( void ) GT_FINAL;
    };
 
}
 
#endif
.cpp
C++
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
namespace gost{
 
        /// конструктор
    gtMainSystemWin32::gtMainSystemWin32( void ){
    }
 
        /// деструктор
    gtMainSystemWin32::~gtMainSystemWin32( void ){
    }
 
        /// возвратит укозатель на окно вывода
    gtOutputWindow* gtMainSystemWin32::getOutputWindow( void ){
        return this->m_output_window.data();
    }
 
        /// инициализация системы
    bool    gtMainSystemWin32::init( void ){
 
        {       //  пока будет такой тип окна вывода (gtOutputWindowWin32)
            this->m_output_window = gtPtrNew<gtOutputWindow>( new gtOutputWindowWin32 );
            this->m_output_window->init();
            this->m_output_window->show();
        }
        
        return true;
    }
}

Нужно изменить gost.cpp
Теперь он такой
C++
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
#include <gost.h>
 
namespace gost{
 
GT_API gtMainSystem* InitializeGoSTEngine( const gtDeviceCreationParameters& params ){
 
    gtMainSystem*   main_system( nullptr );
 
    switch( params.m_device_type ){
#if defined( GT_PLATFORM_WIN32 )
        case gtDeviceType::windows:{
            
            main_system = new gtMainSystemWin32;
 
            if( !((gtMainSystemWin32*)main_system)->init() ){
                /// тут будет вывод сообщения об ошибке
                delete main_system;
            }
            
        }
        break;
#endif
        default:
            return nullptr;
            break;
    }
 
    return main_system;
}
 
}
gost.h имеет такой вид
C++
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
#pragma once
#ifndef __GOST_H__
#define __GOST_H__
 
/*
    Главный include файл движка GOST
*/
 
//  C++
#include <fstream>
#include <string>
#include <vector>
 
//  GOST
#include <gtInfo.h>
#include <gtTypes.h>
#include <gtError.h>
 
#include <gtBaseObject.h>
#include <gtRefObject.h>
#include <gtPtr.h>
 
#include <gtOutputWindow.h>
 
#include <gtMainSystem.h>
 
namespace gost{
 
    /// Инициализация 
GT_API gtMainSystem* InitializeGoSTEngine( const gtDeviceCreationParameters& );
 
}
 
 
#endif
Изменил имена методов в gtPtr и gtRefObject. Все начинаются с маленькой буквы.

gtOutputWindow теперь наследуется от gtRefObject
C++
1
class gtOutputWindow : public gtRefObject
тест новой версии

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <gost.h>
 
#pragma comment(lib, "gost_d.lib")
 
using namespace gost;
 
int main(){
 
    gtDeviceCreationParameters params;
 
    gtPtr<gtMainSystem> my_system( gtPtrNew<gtMainSystem>( InitializeGoSTEngine(params) ) );
 
    auto * output = my_system->getOutputWindow();
    output->setWindowText( u"Hello world" );
 
    for(;;);
 
    return 0;
}
Размещено в Игровой движок
Просмотров 189 Комментарии 0
Всего комментариев 0

Комментарии

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