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

2023-08-24 13:18:20 浏览数 (2)

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

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

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

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

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

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

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

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

实现效果

0 人点赞