此类管理所有本关卡能选择的卡片。
//从关卡配置文件中读取坐标,卡片名并显示出来 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);//发布增加已选卡片数量通知 } } }
实现效果