2.4.2 待選擇植物卡片管理器類
此類管理所有本關卡能選擇的卡片。
//從關卡配置檔案中讀取坐标,卡片名并顯示出來
bool CWaitChooseCardMgr::levelConfigLoad()
{
Json::Value root = CGlobalComm::getInstance()->getRootLevelConfig();
int iLevel = CGlobalComm::getInstance()->getiGameLevel();//得到現在在運作的關卡,由前面關卡選擇決定
int index = CGlobalComm::getInstance()->cardChooseNumGet(iLevel);//獲得一共有多少張植物卡
m_iCanChooseNum = CGlobalComm::getInstance()->cardChooseNumGet(iLevel); //獲得可以選擇卡片數量
for (int i = 0; i < index; i++)
{
CWaitChooseCard* waitCard = CWaitChooseCard::create();
std::string strNum = StringUtils::format("%d", i);
waitCard->setsName(root[iLevel][strNum]["Name"].asString());
waitCard->createByName(root[iLevel][strNum]["Name"].asString());//根據名字顯示哪張卡片
int iXpos = i % CardNumInALine;
int iYpos = i / CardNumInALine;
waitCard->setPosition(Point(X_CARD_INIT+iXpos*X_CARD_CNT, Y_CARD_INIT - iYpos*Y_CARD_CNT));
this->addChild(waitCard);
m_listWaitCard.pushBack(waitCard);//把得到待選卡片加入到待選容器中
}
touchDeal();
NOTIFY->addObserver(this, callfuncO_selector(CWaitChooseCardMgr::OnReduceChooseCard), NOTIFY_ReduceChooseCard, NULL);
return true;
}
1.讀取目前關一共有多少張植物卡片;2讀取目前關可選多少張卡片;3.for循環建立待選擇的植物卡片,并且把待選擇卡片對象加入到待選容器中
觸摸處理判斷出點選到哪張待選的植物
//查找哪張待選卡片被點選了,傳回被點選的卡片的對象
CWaitChooseCard* CWaitChooseCardMgr::findClickWaitCard(Point pos)
{
for (auto waitCard : m_listWaitCard)
{
if (waitCard->clickJudge(pos) == true)
return waitCard;
}
return NULL;
}
這裡周遊待選卡片容器,當傳入坐标被包含在某個卡片對象精靈的範圍内,傳回該植物卡片對象。clickJudge是卡片父類CEntity的方法,能夠判斷目前點是否落在了該實體綁定的精靈的範圍内。
/**************************************************
函數作用:實體是否被點選,也可以用作碰撞的判定
**************************************************/
bool CEntity::clickJudge(Point pos)
{
Size sizePic = this->getContentSize();//得到綁定圖檔的大小
Point posPic = getPosition();//得到圖檔的中心位置
//得到綁定圖檔的左上角與右下角
Point srcPos = Point(posPic.x - sizePic.width / 2, posPic.y + sizePic.height / 2);
Point destPos = Point(posPic.x + sizePic.width / 2, posPic.y - sizePic.height / 2);
//判斷點的坐标時否是在圖檔的範圍内
if (m_bCanClickFlg == true)
{
if (pos.x >= srcPos.x && pos.x <= destPos.x && pos.y <= srcPos.y && pos.y >= destPos.y)
{
return true;
}
}
return false;
}
當确實點選到植物卡片身上,要做以下事情:1.本身要變成灰色顯示;2.釋出已經選擇某張卡片的通知,傳遞的參數為卡片的名字
//根據觸摸傳過來的坐标,判斷是按了那個卡片
void CWaitChooseCardMgr::cardClickDeal(Point pos)
{
CWaitChooseCard* clickCard = findClickWaitCard(pos);
if (clickCard == NULL) {
return;
}
else
{
int iHaveChoose = CGlobalComm::getInstance()->getiHaveChoose();//得到已經選擇的卡片數量
if (iHaveChoose < m_iCanChooseNum)//如果選擇次數滿了
{
std::string sFilePath = StringUtils::format("%sG.png", (clickCard->getsName()).c_str());//特别注意這是格式化是c風格,要使用c_str()轉化為c
Sprite* sprCard = Sprite::createWithSpriteFrameName(sFilePath.c_str());
clickCard->spriteBind(sprCard);//待選面闆卡片綁定黑色的圖檔
clickCard->setbCanClickFlg(false);
NOTIFY->postNotification(NOTIFY_AddChooseCard, (Ref*)((clickCard->getsName()).c_str()));//釋出選擇植物卡片的消息
NOTIFY->postNotification(NOTIFY_HaveChooseNumChange, (Ref*)1);//釋出增加已選卡片數量通知
}
}
}
實作效果