天天看點

cocos植物大戰僵屍(五)選擇植物卡片:待選擇植物卡片管理器類

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);//釋出增加已選卡片數量通知
    }
  }
}      

實作效果