// // MapAdventureObjectSlide.cpp // WattsenglishFoodApp // // Created by Katarzyna Kalinowska-Górska on 21/03/2020. // #include "AniMapUtils.h" #include "MapAdventureObjectPickupItem.h" #include "AniGeometryUtils.h" MapAdventureObjectPickupItem::MapAdventureObjectPickupItem(const rapidjson::Value& p_mapObjectData, IMapImageObject* p_mapImageObject, bool oneTile) : IMapAdventureObject(p_mapObjectData) { m_objectClassName = "MapAdventureObjectPickupItem"; m_mapImageObjects.insert({p_mapImageObject->objectName, p_mapImageObject}); m_oneTile = oneTile; resetOccupiedTileIfNecessary(); } MapAdventureObjectPickupItem::MapAdventureObjectPickupItem(std::string objectName, IMapImageObject* p_mapImageObject, bool oneTile) : IMapAdventureObject(objectName) { m_objectClassName = "MapAdventureObjectPickupItem"; m_mapImageObjects.insert({p_mapImageObject->objectName, p_mapImageObject}); m_oneTile = oneTile; resetOccupiedTileIfNecessary(); } std::vector MapAdventureObjectPickupItem::getOccupiedTiles() const { if(m_occupiedTile.col > -1 && m_occupiedTile.row > -1){ return {m_occupiedTile}; } else { auto itemMapObject = m_mapImageObjects.begin()->second; auto parentMap = itemMapObject->getParentMap(); return AniMapUtils::getInstance().getTilesIntersectingRect(itemMapObject->getBoundingBox(), parentMap->getTileSize().width, parentMap->getTileSize().height, parentMap->getMapSize().width, parentMap->getMapSize().height); } } // TODO maybe calculate just border tiles? would be useful for big objects std::vector MapAdventureObjectPickupItem::getEntryTiles() const { return getOccupiedTiles(); //m_occupiedTiles; } void MapAdventureObjectPickupItem::pickUp(){ // m_mapImageObjects.begin()->second->setOpacity(0); setActive(false); if(m_delegate != nullptr){ auto event = new IMapAdventureObjectEvent(IMapAdventureObjectEventTypeItemPickedUp); m_delegate->onMapAdventureObjectEvent(this, event); delete event; } } void MapAdventureObjectPickupItem::reset(){ m_mapImageObjects.begin()->second->setOpacity(255); setActive(true); } void MapAdventureObjectPickupItem::resetOccupiedTileIfNecessary(){ if(m_oneTile){ auto mapImageObject = m_mapImageObjects.begin()->second; auto parentMap = mapImageObject->getParentMap(); m_occupiedTile = AniMapUtils::getInstance().translateXYPointToColRow(mapImageObject->getPosition(), parentMap->getTileSize().width, parentMap->getTileSize().height, parentMap->getMapSize().width, parentMap->getMapSize().height); } } std::vector MapAdventureObjectPickupItem::getOccupiedTilesRestrictedByIntersectionPercent(float percent) const{ auto occupiedTiles = getOccupiedTiles(); std::vector tilesToReturn; auto itemMapObject = m_mapImageObjects.begin()->second; auto mapObjectRect = itemMapObject->getBoundingBox(); auto parentMap = itemMapObject->getParentMap(); for(auto it = occupiedTiles.begin(); it != occupiedTiles.end(); ++it){ auto tileRect = AniMapUtils::getInstance().getTileRect(parentMap, (*it).col, (*it).row); auto intersectionPercent = AniGeometryUtils::calculateIntersectionPercentage(tileRect, mapObjectRect); if(intersectionPercent >= percent){ tilesToReturn.push_back(*it); } } return tilesToReturn; }