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

前端之家收集整理的这篇文章主要介绍了cocos植物大战僵尸(五)选择植物卡片:待选择植物卡片管理器类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

2.4.2待选择植物卡片管理器类@H_404_3@

此类管理所有本关卡能选择的卡片。@H_403_5@

//从关卡配置文件中读取坐标,卡片名并显示出来
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循环创建待选择的植物卡片,并且把待选择卡片对象加入到待选容器中@H_403_5@

触摸处理判断出点击到哪张待选的植物@H_403_5@

//查找哪张待选卡片被点击了,返回被点击的卡片的对象
CWaitChooseCard* CWaitChooseCardMgr::findClickWaitCard(Point pos)
{
	for (auto waitCard : m_listWaitCard)
	{
		if (waitCard->clickJudge(pos) == true)
			return waitCard;
	}
	return NULL;
}

这里遍历待选卡片容器,当传入坐标被包含在某个卡片对象精灵的范围内,返回该植物卡片对象。clickJudge是卡片父类CEntity方法,能够判断当前点是否落在了该实体绑定的精灵的范围内。@H_403_5@

/**************************************************
函数作用:实体是否被点击,也可以用作碰撞的判定
**************************************************/
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.发布已经选择某张卡片的通知,传递的参数为卡片的名字@H_403_5@

//根据触摸传过来的坐标,判断是按了那个卡片
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);//发布增加已选卡片数量通知
		}
	}
}

实现效果@H_403_5@

猜你在找的Cocos2d-x相关文章