Использование SDL2 и создание многоразового «движка» для многих других проектов - PullRequest
0 голосов
/ 07 июня 2019

Я не уверен, что термин для того, что делает SDL2, но я читал, что это "угоняет" основной.

У меня есть проект под названием CoolGame и проект, который я хочу использовать во многих других играх, которые я делаю, под названием Engine.

Вот мой engine.cpp

#include "engine.h"
using namespace engine;

Engine::Engine()
{
    window = NULL;
    renderer = NULL;
}

Engine::Engine(const char* title)
{
    SDL_Init(SDL_INIT_EVERYTHING);
    window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 600, 400, SDL_WINDOW_SHOWN);
    renderer = SDL_CreateRenderer(window, -1, 0);
}

void Engine::RenderThisFrame()
{
    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);

    SDL_RenderClear(renderer);

    SDL_RenderPresent(renderer);
}

Некоторые из вас могут видеть, куда я иду. Я пытаюсь сделать хорошую обёртку Game Engine для sdl2. Вот мой главный в coolgame

#include "engine.h"
#include <iostream>
#undef main
using namespace std;
using namespace engine;

int main(int argc, const char* argv[]) {
    cout << "break main." << endl;
    Engine e = Engine("title");

    e.RenderThisFrame();
    return 0;
}

Это не работает. Я также пробовал #undef в engine.h, и я получаю ту же ошибку, что и ниже. LNK2019 unresolved external symbol _SDL_main referenced in function _main_utf8

Когда я беру SDL.h и помещаю его прямо в coolgame, он работает как положено.

Можно ли как-нибудь остановить SDL2 от угона основного? Или есть какой-нибудь способ поднять этот главный угонщик на проект coolgame? Если это имеет смысл

Для экономии здесь

engine.h

#ifndef ENGINE_CODE
#define ENGINE_CODE

#include "SDL.h"
#undef main
namespace engine {
    class Engine {
    public:
        Engine();
        Engine(const char* title);

        void RenderThisFrame();
    private:
        SDL_Window* window;
        SDL_Renderer* renderer;
    };
}
#endif

Редактировать

Я использую Visual Studio 2019 для своей IDE, если это имеет значение, я могу предоставить версию инструментов сборки C ++ по запросу.

Редактировать

Я не верю, что на этот вопрос точно отвечает другой вопрос. И вот почему.

Я добавил SDL_MAIN_HANDLED и удалил #undefine main, и он все еще не работал.

Затем я переместил весь свой код двигателя в проект coolgame с SDL_MAIN_HANDLED и основной работой, как ожидалось. И вот, это работает, это как-то связано с ссылками на проекты. Так что это не исправляет мой первоначальный вопрос. Я добавляю тег Visual Studio. these are all errors. Я добавил папку engine в каталоги include в coolgame, а также добавил packages/.../sdl в каталоги include

...