房卡麻将系列教程(听牌提示),文章底部附视频教程,有需要的学一下。
需要改动的文件:
首先让我们看看修改听牌需要改动的几个文件:
一、HNMJGameScence_Net.cpp;
二、HNMJGameScence.h;
三、HNMJPlayer.h;
四、HNMJPlayer.cpp;
今天的教程不能语音请大家理解。
一、HNMJGameScence_Net.cpp
首先让我们打开HNMJGameScence_Net.cpp源文件;
找到OnSubOutCard函数,也就是用户出牌的函数;
因为我们要改的听牌提示,也就是胡牌提示,就是可以胡的情况下提示玩家胡那些牌。
所以我们必须再每一次手中的牌发生变化的时候计算出可胡的牌,并提示给玩家。也就是说在玩家出牌过后 我们就要计算,并显示给玩家。
OnSubOutCard
首先在OnSubOutCard函数里面添加一段源码如下:
int cardCount = 0; cardIndex = dToIndex(pOutCard->cbOutCardData); lastCardVec.clear(); for (int i = 0; i < 34; i++) { if (cardIndex == i) { if(totalCard[i][0] == 0)break; for (int j = 0; j < 34; j++) { lastCardVec.push_back((int)totalCard[i][j]); } break; } } pPlayer->showHuPaiTip(lastCardVec, cardCount);
添加过后,我们还要添加几个变量,否则函数里的变量没有声明 是不可以使用的;
二、HNMJGameScence.h
添加变量声明
让我们打开HNMJGameScence.h 头文件;
添加如下的变量声明:
BYTE totalCard[34][34];
std::vector<int> lastCardVec; BYTE cardIndex;
记住这几个变量都是public的,也就是公开的变量;
显示胡牌提示
添加完变量之后 我们还要写一个函数用来显示胡牌提示的效果:
showHuPaiTip函数用来显示胡牌的效果;
其中的两个参数都是我们之前添加的变量;
三、HNMJPlayer.h
然后我们打开HNMJPlayer.h 头文件;
先添加showHuPaiTip函数的声明;
函数showHuPaiTip,用于显示胡牌的效果;
函数removeHuPaiTipHistory,用于取消胡牌的效果;
currCoutCard_index变量记录当前玩家的下标;
四、HNHelpScence.cpp
然后我们打开HNHelpScence.cpp 源文件,在起最后添加两个函数的实现过程;
void HNMJPlayer::showHuPaiTip(std::vector<int> tingHuVec, int tingHuCardIdx) { //cocos2d::log("tingHuData.size === %lu", tingHuData.size()); for (int i = 0; i < tingHuVec.size(); i++) { cocos2d::log("tingHuVec data showHuPaiTip === %d", tingHuVec.at(i)); } cocos2d::Vec2 addPos = cocos2d::Vec2(49, 0); cocos2d::Node* pCardNode = WidgetFun::getChildWidget(m_pSeatNode,"tingNode"); if (pCardNode == nullptr) return; //if (pCardNode != nullptr && pCardNode->getChildrenCount() > 0) //{ //pCardNode->removeAllChildren(); //} //zengjia 不听之后让牌消失 pCardNode->removeAllChildren(); cocos2d::Vec2 kStartPos = WidgetFun::getChildWidget(m_pSeatNode,"HandPosNode")->getPosition(); for (int i = 0; i < tingHuVec.size(); i++) { if (tingHuVec.at(i) != 0) { cocos2d::Node* pNode = WidgetManager::Instance().createWidget("HNMJ_TING",pCardNode); pNode->setZOrder(10000); pNode->setPosition(kStartPos); kStartPos += addPos; //kStartPos += kHandAddPos*3; std::string kImagic = WidgetFun::getWidgetUserInfo(pNode,"Imagic"); setCardImagic(WidgetFun::getChildWidget(pNode,"tingCard"), tingHuVec.at(i),kImagic); } } }
removeHuPaiTipHistory
函数的实现如下:
void HNMJPlayer::removeHuPaiTipHistory() { cocos2d::Node* pCardNode = WidgetFun::getChildWidget(m_pSeatNode,"tingNode"); if (pCardNode == nullptr) return; pCardNode->removeAllChildren(); }
将上面的函数和变量添加完成后,我们的听牌提示就算完成了。
实现过程
现在我们回头讲讲他的实现过程;
首先为了在每一次牌面发生变化的时候判断胡牌提示,我们在每次用户出牌的函数里面来实现这个过程。
设置一个变量用于记录,然后查看用户的出的牌,根据剩余的牌,调用胡牌判断的函数来判断要胡的牌。
totalCard
用totalCard数组变量记录可以胡的牌;
用for循环来完成这个过程;
一共计算了34次,就是筒条万的1-9 级花牌;
然后把计算的结果 传递给showHuPaiTip函数,用来显示。
showHuPaiTip
showHuPaiTip函数是我们自己实现的
在该函数里面主要是调用cocos2d的内置函数来完成显示的功能,这些函数都是cocos2d本身就有的,所以不需要我们再去实现。
这个听牌提示的过程,说起来很简单,但是从头实现的话 是需要一定时间的,所以在完成该教程之前,花费了大量的时间做测试。
最后
这里给大家留下一个课外作业:
removeHuPaiTipHistory函数,是用来移除结算之前的胡牌提示的函数。
该函数的实现 已经帮大家实现了,作业就是大家想一想应该在什么地方调用这个函数来移除胡牌提示的效果?
希望大家动手试一试,在下周的课程中,我会给出正确答案。
附件截图:
教程参数:
教程名称: | 听牌提示修改教程 |
文件格式: | exe |
视频时长: | 00:24:21 |
文件大小: | 34M |
视频截图: | 有 |
搭建难度: | ⭐⭐⭐⭐⭐ |
附件地址:
搬运教程,勿轻信广告,谢谢!
- OnSubOutCard
- 添加变量声明
- 显示胡牌提示
- removeHuPaiTipHistory
- totalCard
- showHuPaiTip
发表评论