示例#1
0
MapCoordinates Map::getMapCenter() const
{
    MapCoordinates CenterPoint;

    CenterPoint.X = getMapSizeX() / 2;
    CenterPoint.Y = getMapSizeY() / 2;
    CenterPoint.Z = getMapSizeZ();

    return CenterPoint;
}
示例#2
0
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());
}