int main() { // initialize sdl if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS | SDL_INIT_TIMER | SDL_INIT_AUDIO) < 0) { std::cout << "Could not initialize SDL. SDL error: " << SDL_GetError() << std::endl; return -1; } ComponentManager component_mgr; initialize_components(component_mgr); EntityManager em; // TODO: this bool pointer that gets passed around to two classes sucks bool running = true; GraphicsSystem *graphics = new GraphicsSystem(&em, window_width, window_height); EventSystem *events = new EventSystem(&running, &em); GeometryDrawer* geometryDrawer = new GeometryDrawer(graphics->getRenderer(), graphics); MovementSystem* movement = new MovementSystem(&em); PhysicsWorld* physics_world = new PhysicsWorld(em, b2Vec2(0.0f, 981.0f)); // todo use less insane gravity Box2DDebugDraw* box2d_debug_draw = new Box2DDebugDraw(graphics->getRenderer(), *graphics, physics_world->getWorld()); box2d_debug_draw->SetFlags( b2Draw::e_shapeBit | b2Draw::e_jointBit //| b2Draw::e_aabbBit | b2Draw::e_pairBit | b2Draw::e_centerOfMassBit ); box2d_debug_draw->SetFlags(0); physics_world->getWorld().SetDebugDraw(box2d_debug_draw); /* register systems */ em.register_system<Graphics>(graphics); em.register_system<KeyboardInput>(events); em.register_system<PhysicsBodyComponent, Movement>(movement); em.register_system<Transform>(geometryDrawer); em.register_system<PhysicsBodyComponent>(physics_world); //createPlayer called twice to ensure destroying an entity works correctly. createPlayer(em, *graphics); em.remove_entity(0); createPlayer(em, *graphics); createWorldEdges(em); auto texture = std::make_shared<Texture>(*graphics->getRenderer(), "../images/crate64.jpg"); for (unsigned int i = 0; i < 4; ++i) { for (unsigned int j = 0; j < 4; ++j) { const b2Vec2 scale(1.0f, 1.0f); const b2Vec2 position(350.0f + texture->getWidth() * scale.x * i, 200.0f + texture->getHeight() * scale.y * j); createRB(em, texture, position, scale); } } SystemManager manager(120, &running); manager.add(graphics); manager.add(events); manager.add(geometryDrawer); manager.add(physics_world); manager.add(movement); #ifdef WITH_LUA /* add a REPL if the input is redirected */ REPLSystem *repl = new REPLSystem(&em, &component_mgr); if (!isatty(fileno(stdin))) { manager.add(repl); } #endif manager.loop(); SDL_Quit(); return 0; }