失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > cocos植物大战僵尸(五)选择植物卡片:待选择植物卡片管理器类

cocos植物大战僵尸(五)选择植物卡片:待选择植物卡片管理器类

时间:2020-05-31 07:43:34

相关推荐

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()转化为cSprite* 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);//发布增加已选卡片数量通知}}}

实现效果

如果觉得《cocos植物大战僵尸(五)选择植物卡片:待选择植物卡片管理器类》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。