void ItemFactory::addDoor(eID doorID, eDirection dir, cocos2d::Vec2 pos, std::string model) { if (doorID != eID_Door1 && doorID != eID_Door2) return; if (dir == eDir_None || (pos.x < 0 || pos.x >= MAPWIDTH || pos.y < 0 || pos.y >= MAPHEIGHT)) return; // remove origin door removeDoor(doorID); Door** ppDoorToAdd = nullptr; if (doorID == eID_Door1) ppDoorToAdd = &m_pDoors.first; else if (doorID == eID_Door2) ppDoorToAdd = &m_pDoors.second; if (ppDoorToAdd) { Door* pDoorToAdd = Door::create(model); *ppDoorToAdd = pDoorToAdd; this->addChild(pDoorToAdd, 1, doorID); pDoorToAdd->setPosition(VisibleRect::getVisibleRect().origin + VisibleRect::getHalfGridVec() + VisibleRect::getGridLength()*pos); pDoorToAdd->setIndex(pos); //set the door transfer direction pDoorToAdd->setTransferDirection(dir); //actual door direction is opposite to transfer direction pDoorToAdd->setRotation(arcByDirection(oppositeDirection(dir))); //set the grid type m_pSnakeMap->setGridType(pos, eType_Door); } //connect the two doors if (m_pDoors.first) m_pDoors.first->setOtherDoor(m_pDoors.second); if (m_pDoors.second) m_pDoors.second->setOtherDoor(m_pDoors.first); }