MapAdventureObjectPickupItem.cpp
3.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//
// 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<AniMapUtils::TileData> 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<AniMapUtils::TileData> 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<AniMapUtils::TileData> MapAdventureObjectPickupItem::getOccupiedTilesRestrictedByIntersectionPercent(float percent) const{
auto occupiedTiles = getOccupiedTiles();
std::vector<AniMapUtils::TileData> 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;
}