#include "WN_CNotifyDlg.h" #include "cocos2d.h" #include "ui/CocosGUI.h" #include "cocostudio/CocoStudio.h" #include "YSAudioEngine.h" #include "PopScene.h" using namespace WNMJ_SPACE; WN_NotifyDlg::WN_NotifyDlg() { zeromemory(m_pGangCardItem, sizeof(m_pGangCardItem)); } WN_NotifyDlg::~WN_NotifyDlg() { } bool WN_NotifyDlg::init() { if (!Node::init()) { return false; } // 主界面 auto rool = CSLoader::createNode("Games/WNMJ/NoticeLayer.csb"); this->addChild(rool); m_pNoticelayer = (Layout*)rool->getChildByName("Panel_bg"); ASSERT(m_pNoticelayer != nullptr); m_btnGuo = (Button*)m_pNoticelayer->getChildByName("btnGuo"); m_btnGuo->addClickEventListener(CC_CALLBACK_1(WN_NotifyDlg::onEventGuo, this)); m_btnGuo->setVisible(false); m_btnHu = (Button*)m_pNoticelayer->getChildByName("btnHu"); m_btnHu->addClickEventListener(CC_CALLBACK_1(WN_NotifyDlg::onEventHu, this)); m_btnHu->setVisible(false); m_btnPeng = (Button*)m_pNoticelayer->getChildByName("btnPeng"); m_btnPeng->addClickEventListener(CC_CALLBACK_1(WN_NotifyDlg::onEventPeng, this)); m_btnPeng->setVisible(false); m_btnGang = (Button*)m_pNoticelayer->getChildByName("btnGang"); m_btnGang->addClickEventListener(CC_CALLBACK_1(WN_NotifyDlg::onEventGang, this)); m_btnGang->setVisible(false); return true; } void WN_NotifyDlg::onEnter() { Node::onEnter(); } void WN_NotifyDlg::onEnterTransitionDidFinish() { Node::onEnterTransitionDidFinish(); } void WN_NotifyDlg::onExit() { Node::onExit(); } void WN_NotifyDlg::onEventHu(cocos2d::Ref *pSender) // 选择操作 { YSAudioEngine::Instance().playBtnClickEffect(); if (pSender == nullptr) return; if ((m_OperateNotify.dwActionMask&WIK_WN_CHI_HU) != 0) { CMD_C_OperateCard OperateCard; OperateCard.dwOperateCode = WIK_WN_CHI_HU; OperateCard.cbOperateCard = m_OperateNotify.cbActionCard; EventCustom event(CUSTOM_EVENT_OPER_CARD); event.setUserData(&OperateCard); Director::getInstance()->getEventDispatcher()->dispatchEvent(&event); } // 操作完毕后,隐藏高级操作界面,并重置m_wCurrentUser CCLOG("WN_NotifyDlg click btnHu hide..."); this->setVisible(false); } void WN_NotifyDlg::onEventPeng(cocos2d::Ref *pSender) // 选择操作 { YSAudioEngine::Instance().playBtnClickEffect(); if (pSender == nullptr) return; if ((m_OperateNotify.dwActionMask&WIK_WN_PENG) != 0) { CMD_C_OperateCard OperateCard; OperateCard.dwOperateCode = WIK_WN_PENG; OperateCard.cbOperateCard = m_OperateNotify.cbActionCard; EventCustom event(CUSTOM_EVENT_OPER_CARD); event.setUserData(&OperateCard); Director::getInstance()->getEventDispatcher()->dispatchEvent(&event); } // 操作完毕后,隐藏高级操作界面 CCLOG("WN_NotifyDlg click btnPeng hide..."); this->setVisible(false); } // 杠 void WN_NotifyDlg::onEventGang(cocos2d::Ref *pSender) // 选择操作 { YSAudioEngine::Instance().playBtnClickEffect(); if (pSender == nullptr) return; // 牌数量 uint8 cbCardCount = m_OperateNotify.GangPaiResult.cbCardCount; CMD_C_OperateCard OperateCard; zeromemory(&OperateCard, sizeof(OperateCard)); OperateCard.dwOperateCode = WIK_WN_GANG; // 只有一个杠牌; if (cbCardCount == 1) { //牌数据 uint8 cbCardData = m_OperateNotify.GangPaiResult.cbCardData[cbCardCount - 1]; OperateCard.cbOperateCard = cbCardData; EventCustom event(CUSTOM_EVENT_OPER_CARD); event.setUserData(&OperateCard); Director::getInstance()->getEventDispatcher()->dispatchEvent(&event); cocos2d::log("dwOperateCode = 0x%0x, cbOperateCard = 0x%0x", WIK_WN_GANG, cbCardData); CCLOG("WN_NotifyDlg click one btnGang hide..."); this->setVisible(false); } else if (cbCardCount > 1) { m_btnGang->setVisible(false); // 显示可以杠的牌,让玩家自己选择; for (int i = 0; i < cbCardCount; i++) { uint8 cbCardValue = m_OperateNotify.GangPaiResult.cbCardData[i]; if (WN_CGameLogic::IsValidCard(cbCardValue)) { m_pGangCardItem[i] = WN_SparrowCard::createWithDirection(cbCardValue, SP_SELFSTAND); if (m_pGangCardItem[i] != nullptr) { m_pGangCardItem[i]->setPosition(Vec2(m_btnGang->getPositionX() - (NCMJ_SELF_HAND_CARD_WIDHT + 25)*i, 10)); m_pNoticelayer->addChild(m_pGangCardItem[i]); // 增加点击事件; m_pGangCardItem[i]->addClickEventListener([cbCardValue, this](cocos2d::Ref *, Vec2 pos)->bool{ CMD_C_OperateCard OperateCard; OperateCard.dwOperateCode = WIK_WN_GANG; OperateCard.cbOperateCard = cbCardValue; EventCustom event(CUSTOM_EVENT_OPER_CARD); event.setUserData(&OperateCard); Director::getInstance()->getEventDispatcher()->dispatchEvent(&event); // 操作完毕后,隐藏高级操作界面,并重置m_wCurrentUser CCLOG("WN_NotifyDlg click move btnGang hide..."); this->setVisible(false); m_wCurrentUser = INVALID_CHAIR; return true; }); } } } } } void WN_NotifyDlg::onEventGuo(cocos2d::Ref *pSender) // 选择操作 { YSAudioEngine::Instance().playBtnClickEffect(); if (m_OperateNotify.dwActionMask != WIK_WN_NULL) { // 当前玩家为自己,直接隐藏操作界面,等待玩家出牌 if (m_wCurrentUser == SELF_VIEW_CHAIRID) { CCLOG("WN_NotifyDlg click btnGuo hide...m_wCurrentUser = 0x%0x", m_wCurrentUser); this->setVisible(false); return; } // 放弃胡牌; if ((m_OperateNotify.dwActionMask&WIK_WN_CHI_HU) != 0) { PopScene::Instance().show(utility::a_u8("你确定要放弃胡牌吗?"), [=](){ CMD_C_OperateCard OperateCard; OperateCard.dwOperateCode = WIK_WN_NULL; OperateCard.cbOperateCard = m_OperateNotify.cbActionCard; EventCustom event(CUSTOM_EVENT_OPER_CARD); event.setUserData(&OperateCard); Director::getInstance()->getEventDispatcher()->dispatchEvent(&event); // 操作完毕后,隐藏高级操作界面,并重置m_wCurrentUser CCLOG("WN_NotifyDlg click btnGuo hide..."); this->setVisible(false); }, [=](){ // 这里什么都不用做,但是必须有,控制界面显示取消按钮; }); } // 放弃碰,杠,吃 else { CMD_C_OperateCard OperateCard; OperateCard.dwOperateCode = WIK_WN_NULL; OperateCard.cbOperateCard = m_OperateNotify.cbActionCard; EventCustom event(CUSTOM_EVENT_OPER_CARD); event.setUserData(&OperateCard); Director::getInstance()->getEventDispatcher()->dispatchEvent(&event); // 操作完毕后,隐藏高级操作界面,并重置m_wCurrentUser CCLOG("WN_NotifyDlg click btnGuo hide..."); this->setVisible(false); } } else { // 操作完毕后,隐藏高级操作界面,并重置m_wCurrentUser CCLOG("WN_NotifyDlg click btnGuo hide..."); this->setVisible(false); } } // 设置高级操作界面 void WN_NotifyDlg::SetNoticeData(CMD_S_OperateNotify * pOperateNotify) { if (m_pNoticelayer) { // 判断操作类型 memcpy(&m_OperateNotify, pOperateNotify, sizeof(m_OperateNotify)); WORD dwActionMask = pOperateNotify->dwActionMask; //按钮控制 m_btnPeng->setVisible((dwActionMask&WIK_WN_PENG) != 0 ? true : false); m_btnGang->setVisible((dwActionMask&WIK_WN_GANG) != 0 ? true : false); m_btnHu->setVisible((dwActionMask&WIK_WN_CHI_HU) != 0 ? true : false); m_btnGuo->setVisible((dwActionMask != WIK_WN_NULL) ? true : false); // 删除杠节点; for (int i = 0; i < MAX_WEAVE; i++) { if (m_pGangCardItem[i] != nullptr) { m_pGangCardItem[i]->removeFromParent(); m_pGangCardItem[i] = nullptr; } } CCLOG("WN_NotifyDlg show..."); this->setVisible(true); } } // 隐藏提示界面 void WN_NotifyDlg::HideNotifyDlg(bool isTimeOver/* = false*/) { if (m_pNoticelayer) { // 判断操作类型 memset(&m_OperateNotify, 0x0, sizeof(m_OperateNotify)); //按钮控制 m_btnPeng->setVisible(false); m_btnGang->setVisible(false); m_btnHu->setVisible(false); m_btnGuo->setVisible(false); } // 删除杠节点; for (int i = 0; i < MAX_WEAVE; i++) { if (m_pGangCardItem[i] != nullptr) { m_pGangCardItem[i]->removeFromParent(); m_pGangCardItem[i] = nullptr; } } CCLOG("WN_NotifyDlg hide..."); this->setVisible(false); }