MapCoordinates Map::getMapCenter() const { MapCoordinates CenterPoint; CenterPoint.X = getMapSizeX() / 2; CenterPoint.Y = getMapSizeY() / 2; CenterPoint.Z = getMapSizeZ(); return CenterPoint; }
void frts::Drawer::init(const SharedManagerPtr& shared) { assert(shared != nullptr); // Set data from config. auto gd = getDataValue<GraphicData>(shared, Sdl2Ids::graphicData()); auto md = getDataValue<ModelData>(shared, ModelIds::modelData()); sidebarWidth = pixelToTilesX(gd->getSidebarWidth(), shared); gd->setSidebarWidth(tilesToPixelX(sidebarWidth, shared)); Point::value screenHeight = pixelToTilesY(gd->getScreenHeight(), shared); screenHeight = std::min(screenHeight, md->getMapSizeY()); gd->setScreenHeight(tilesToPixelY(screenHeight, shared)); Point::value screenWidth = pixelToTilesX(gd->getScreenWidth(), shared); screenWidth = std::min(screenWidth, md->getMapSizeX() + sidebarWidth); gd->setScreenWidth(tilesToPixelX(screenWidth, shared)); Point::value mapWidth = screenWidth - sidebarWidth; // Set screen areas. GraphicData::ScreenArea mapArea(0, 0, tilesToPixelX(mapWidth, shared), gd->getScreenHeight()); gd->setMapArea(mapArea); GraphicData::ScreenArea sidebarArea(tilesToPixelX(mapWidth, shared), 0, gd->getSidebarWidth(), gd->getScreenHeight()); gd->setSidebarArea(sidebarArea); // Initialize SDL2. if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { auto msg = boost::format(R"(SDL_Init Error: %1%)") % SDL_GetError(); shared->getLog()->error(getName(), msg.str()); return; } // Image support. int imageFlags = IMG_INIT_PNG; if (IMG_Init(imageFlags) != imageFlags) { auto msg = boost::format(R"(IMG_Init Error: %1%)") % IMG_GetError(); shared->getLog()->error(getName(), msg.str()); return; } // TTF support. if(TTF_Init() == -1) { auto msg = boost::format(R"(TTF_Init Error: %1%)") % TTF_GetError(); shared->getLog()->error(getName(), msg.str()); return; } // Create window. window = std::unique_ptr<SDL_Window, Sdl2Deleter>( SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, static_cast<int>(gd->getScreenWidth()), static_cast<int>(gd->getScreenHeight()), SDL_WINDOW_SHOWN), Sdl2Deleter() ); if (window == nullptr) { auto msg = boost::format(R"(SDL_CreateWindow Error: %1%)") % SDL_GetError(); shared->getLog()->error(getName(), msg.str()); return; } // Create renderer. renderer = std::shared_ptr<SDL_Renderer>( SDL_CreateRenderer(window.get(), -1, SDL_RENDERER_ACCELERATED), Sdl2Deleter() ); if (renderer == nullptr) { auto msg = boost::format(R"(SDL_CreateRenderer Error: %1%)") % SDL_GetError(); shared->getLog()->error(getName(), msg.str()); return; } // Read images. for (auto& image : images) { SDL_Surface *surface = IMG_Load(image.second.c_str()); if (surface == nullptr) { auto msg = boost::format(R"(IMG_Load Error: %1%)") % IMG_GetError(); shared->getLog()->error(getName(), msg.str()); continue; } TexturePtr texture = std::shared_ptr<SDL_Texture>( SDL_CreateTextureFromSurface(renderer.get(), surface), Sdl2Deleter() ); SDL_FreeSurface(surface); if (texture == nullptr) { auto msg = boost::format(R"(SDL_CreateTextureFromSurface Error: %1%)") % SDL_GetError(); shared->getLog()->error(getName(), msg.str()); continue; } textures.insert(std::make_pair(image.first, texture)); } images.clear(); initialized = true; } void frts::Drawer::renderEntities(const EntityVector& entities, const IdPtr& renderableId, const SDL_Rect& rectToRender, IdUnorderedSet& stacked, const SharedManagerPtr& shared, double zoom) { assert(initialized); assert(renderableId != nullptr); assert(shared != nullptr); for (auto& entity : entities) { auto renderable = getComponent<Renderable>(renderableId, entity); if (!renderable->doStacking() && stacked.find(renderable->getSprite()) != stacked.end()) { continue; } stacked.insert(renderable->getSprite()); auto sprite = spriteManager.getSprite(renderable, entity, shared); auto texture = textures.at(sprite.getImage()); auto width = sprite.getWidth(); if (width * zoom > rectToRender.w) { width = static_cast<int>(rectToRender.w / zoom); } auto height = sprite.getHeight(); if (height * zoom > rectToRender.h) { height = static_cast<int>(rectToRender.h / zoom); } SDL_Rect clip = { sprite.getX(), sprite.getY(), width, height }; SDL_RenderCopy(renderer.get(), texture.get(), &clip, &rectToRender); } } void frts::Drawer::renderNow(const SharedManagerPtr& shared) { assert(shared != nullptr); assert(initialized); PerformanceLog pl(getName() + "RenderNow", shared, 5); SDL_RenderPresent(renderer.get()); }