Интеграция Box2D с существующей структурой игрового класса в SDL? - PullRequest
0 голосов
/ 15 мая 2011

Извините за довольно расплывчатое название, но оно казалось подходящим для столь же расплывчатого вопроса, хотя, надеюсь, достаточно кратким, чтобы кто-нибудь смог ответить на него. Я потратил приличное количество времени, работая над фреймворком для 2D-игры с боковой прокруткой в ​​SDL, и теперь, когда я освоился с библиотекой и у меня есть рабочий прототип, я хочу интегрировать физическую библиотеку Box2D в свою игру , Теперь я не просто сначала погрузился в голову, но и потратил время на то, чтобы скомпилировать библиотеку в моей системе (очевидно), изучить приложение Testbed, создать несколько собственных, чтобы освоить все это. И все же я все еще не могу понять, как именно интегрировать его в мою существующую игровую структуру. Ниже приведен пример моего источника для игрового «движка», если я могу быть настолько смелым:

CMain.cpp

// Constructor. Initialize the screen display surface and 
// let the application know that we are running.
CMain::CMain(){
    displaySurface = NULL;
    isRunning = true;
}

// Init function, hooks SDL libraries, configures the display
// surface, window and all pre-runtime environment parts.
int CMain::OnExecute(){


    if(OnInit() == false){
        return -1;
    }

    // Event checking, game loop and render loop. 
    SDL_Event Event;
    while(isRunning){
        while(SDL_PollEvent(&Event)){
            OnEvent(&Event);
        }
        OnLoop();
        OnRender();
    }

    // Cleanup, called when the application is no longer running,
    // handles the removal of all loaded resources from memory.
    OnCleanup();
    return 0;
}

int main(int argc, char* argv[]){
    CMain digIt;
    return digIt.OnExecute();
}

Как вы видите, это заботится о важнейших функциях игрового цикла. Я не думал, что полный код различных вспомогательных функций необходим для контекста вопроса, но если это будет полезно, просто скажите это, и я был бы рад опубликовать его. Итак, мой вопрос таков:

Зная о структуре мира Box2D и о том, как он инициализируется, шагает и все такое, как мне теперь интегрировать это в существующую игровую структуру? Хочу ли я, чтобы весь мой класс CMain унаследовал от b2World? (то есть класс CMain: b2World {}), есть ли какой-то другой способ создать мир, чтобы он был глобально доступен, не совершая кардинальный грех хорошей практики кодирования? Например, я попытался объявить указатель b2World * в заголовке CMain, а затем передать его последующим функциям, чтобы сделать с ними то, что они должны были сделать, но это привело к большому количеству исключений нулевого указателя. Любой совет, который вы могли бы дать, или пример кода, если это вообще возможно, будет невероятно оценен!

1 Ответ

1 голос
/ 15 мая 2011

Я бы не сказал, что ваш класс CMain является производным от b2world, поскольку это определенно не отношение is-a, а has-a. Я не могу сказать, является ли это идеальным решением, так как я не знаю вашу общую архитектуру, но кажется, что это хорошее место для шаблона Singleton.

Я предлагаю вам создать класс, реализующий шаблон синглтона, который содержит центральный экземпляр b2World, например CPhysicsService. Пример взят с шага по миру и для создания новых тел. Благодаря одиночному экземпляру экземпляр класса может быть получен в любом месте, где он вам нужен.

У меня также была эта проблема при создании расширения для движка Gamebryo. Но в любом случае движок был сильно построен на сервисах, поэтому создание сервиса Box2D было очевидным путем.

Надеюсь, это было как-то полезно.

...