Blame view

ios/Runner/Wowgame/Classes/game_animal/MapAdventureObjectPickupItem.cpp 3.41 KB
5daad4bc   xiaoyu   游戏源码添加编译(现存问题:游戏内...
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;
  }