#include "13S_GameScene.h" #include "13S_GamePlayer.h" #include "13S_GameLogic.h" #include "UserInfo.h" #include "MainScene.h" #include "MissionWeiXin.h" #include "DismissScene.h" #include "13S_BigCardSprite.h" #include "PopScene.h" #include "ActionEx.h" #include "JniFun.h" #include "SetScene.h" #include "ChatScene.h" #include "PlayerScene.h" #include "IpTipScene.h" #include "SimpleAudioEngine.h" using namespace SSS_SPACE; bool SSSGameScene::init() { if (!GameFrameBase::init()) { return false; } m_strGameRuleInfo = ""; m_bClassicRule = false; _cbGameStatus = SSS_GS_WK_FREE; _wBuildCardTime = 40; _wRobBankerTime = 20; _wUserChipTime = 20; zeromemory(&m_PrivateRoomInfo, sizeof(CMD_GF_Private_Room_Info)); initNet(); initScene(); return true; } //进场动画完成回调; void SSSGameScene::onEnterTransitionDidFinish() { GameFrameBase::onEnterTransitionDidFinish(); if (true == GAME_MUISCBG) { CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("Games/13S/Sound/background1.mp3", true); } // 暂时停了测试; #if CC_PLATFORM_WIN32 == CC_TARGET_PLATFORM CocosDenshion::SimpleAudioEngine* pAudio = CocosDenshion::SimpleAudioEngine::getInstance(); pAudio->stopBackgroundMusic(true); #endif // 录像模式; if (m_IsGameRecord) { StartRecord(SSS_GAME_PLAYER); // 隐藏功能按钮; m_sprRepBg->setVisible(false); } else { // 增加游戏内事件处理; auto dispatcher = Director::getInstance()->getEventDispatcher(); dispatcher->addCustomEventListener(SHOW_PRIVATE_END, CC_CALLBACK_1(SSSGameScene::onEventShowPrivate, this)); CGameServerItem* pGameServerItem = GameMission::g_pGameServerItem; CC_ASSERT(pGameServerItem != nullptr); if (pGameServerItem != nullptr) { m_kGameMission.SetServerItem(pGameServerItem); m_kGameMission.start(); } } } //场景退出; void SSSGameScene::onExit() { GameFrameBase::onExit(); for (int i = 0; i < SSS_GAME_PLAYER; i++) { SafeDelete(m_aryPlayer[i]); } auto dispatcher = Director::getInstance()->getEventDispatcher(); dispatcher->removeCustomEventListeners(SHOW_PRIVATE_END); } //场景初始化; void SSSGameScene::initScene() { //根节点; m_rootNode = CSLoader::createNodeWithVisibleSize("Games/13S/GameTableScene.csb"); CC_ASSERT(m_rootNode != nullptr); this->addChild(m_rootNode, ZO_DEFAULT); // 公告; auto ImageSytem = (ImageView*)m_rootNode->getChildByName("ImgRoll"); CC_ASSERT(ImageSytem!=nullptr); SetSystemNode(ImageSytem); // 绑定界面元素; _MainPanel = static_cast(m_rootNode->getChildByName("MainPanel")); CC_ASSERT(_MainPanel != nullptr); // 房间信息; _imgRoomInfo = static_cast(_MainPanel->getChildByName("imgRoomInfo")); CC_ASSERT(_imgRoomInfo != nullptr); // 房间ID; _txtRoomID = static_cast(_imgRoomInfo->getChildByName("txtRoomID")); CC_ASSERT(_txtRoomID != nullptr); // 房间规则; _txtRoomRule = static_cast(_imgRoomInfo->getChildByName("txtRule")); CC_ASSERT(_txtRoomRule != nullptr); _txtRoomRule->setString(""); // 局数; _txtJushu = static_cast(_imgRoomInfo->getChildByName("txtRoundNum")); CC_ASSERT(_txtJushu != nullptr); _txtJushu->setVisible(false); // 结束面板; _ResultPanel = static_cast(m_rootNode->getChildByName("resultPanel")); CC_ASSERT(_ResultPanel != nullptr); _ResultPanel->setVisible(false); // 胜负动画; _pArmatureResult = (Armature*)_ResultPanel->getChildByName("armaGameResult"); CC_ASSERT(_pArmatureResult != nullptr); _pArmatureResult->setVisible(false); // 准备按钮; _btnReady = static_cast(_ResultPanel->getChildByName("btnReady")); CC_ASSERT(_btnReady != nullptr); // 准备开始; _btnReady->addClickEventListener([=](Ref* pSender) { playBtnClickEffect(); SendUserReady(); ArmatureAnimation* pAniResult = _pArmatureResult->getAnimation(); if (pAniResult != nullptr) { pAniResult->stop(); } _pArmatureResult->setVisible(false); _ResultPanel->setVisible(false); }); // 查看总成绩按钮; _btnPrivateEnd = static_cast(_ResultPanel->getChildByName("btnPrivateEnd")); CC_ASSERT(_btnPrivateEnd != nullptr); _btnPrivateEnd->setVisible(false); _btnPrivateEnd->addClickEventListener([this](Ref*){ playBtnClickEffect(); //BJOpenResultScene* pOpenResultScene = BJOpenResultScene::create(); _OpenResultScene->updateUIData(m_dwRoomID, &_aryResultItem, true); _OpenResultScene->setVisible(true); }); for (uint16 i = 0; i < SSS_GAME_PLAYER; i++) { string strName = StringUtils::format("txtScoreChair_%d", i); _pTxtResultScore[i] = static_cast(_ResultPanel->getChildByName(strName)); CC_ASSERT(_pTxtResultScore[i]!=nullptr); _pTxtResultScore[i]->setString(""); //string strXin = StringUtils::format("txtXinScore_%d", i); //_pTxtXinScore[i] = static_cast(_ResultPanel->getChildByName(strXin)); //CC_ASSERT(_pTxtXinScore[i] != nullptr); //_pTxtXinScore[i]->setString(""); } // 按钮面板; _ButtonPanel = static_cast(_MainPanel->getChildByName("ButtonPanel")); CC_ASSERT(_ButtonPanel != nullptr); // 发牌面板; _SendCardPanel = static_cast(_MainPanel->getChildByName("panelSendCard")); CC_ASSERT(_SendCardPanel != nullptr); _SendCardPanel->setVisible(false); // 微信邀请按钮; _btnInvite = static_cast(_ButtonPanel->getChildByName("btnInvite")); CC_ASSERT(_btnInvite != nullptr); _btnInvite->setVisible(false); // 解散房间按钮; _btnDismiss = static_cast(_ButtonPanel->getChildByName("btnDismiss")); CC_ASSERT(_btnDismiss != nullptr); _btnDismiss->setVisible(false); //设置按钮; auto btnSetting = static_cast(_ButtonPanel->getChildByName("btnSetting")); CC_ASSERT(btnSetting != nullptr); btnSetting->addClickEventListener([this](Ref*){ YSAudioEngine::Instance().playBtnClickEffect(); TipNode* pNode = SetScene::create(); CC_ASSERT(pNode != nullptr); this->addChild(pNode, ZO_ANI); pNode->pushScene(); }); // 离开按钮; _btnLeave = static_cast(_ButtonPanel->getChildByName("btnLeave")); CC_ASSERT(_btnLeave != nullptr); //_btnLeave->setVisible(false); _btnLeave->addClickEventListener([=](Ref* pSender){ YSAudioEngine::Instance().playBtnClickEffect(); GamePlayer* pGamePlayer = getSelfGamePlayer(); auto callback_ok = [=](){ if (pGamePlayer != nullptr) { CMD_GR_UserStandUp request; memset(&request, 0, sizeof(request)); request.wTableID = pGamePlayer->GetTableID(); request.wChairID = pGamePlayer->GetChairID(); request.cbForceLeave = true; m_kGameMission.SendSocketData(MDM_GR_USER, SUB_GR_USER_STANDUP, &request, sizeof(request)); } this->runAction(Sequence::createWithTwoActions(DelayTime::create(0.2f), CallFunc::create([=]{ Director::getInstance()->getEventDispatcher()->dispatchCustomEvent(LEAVE_GAME); }))); }; std::string strPop = "您确定要离开房间吗?"; if (_cbGameStatus != SSS_GS_WK_FREE) { strPop = "您正在游戏中,强行退出会被扣分,确定要强退吗?"; } PopScene::Instance().show(utility::a_u8(strPop), callback_ok, nullptr); }); // 语音按钮; _btnVoice = static_cast(_ButtonPanel->getChildByName("btnVoice")); CC_ASSERT(_btnVoice != nullptr); _btnVoice->addTouchEventListener(CC_CALLBACK_2(SSSGameScene::OnButtonVoiceTouched, this)); // 聊天按钮; _btnChat = static_cast(_ButtonPanel->getChildByName("btnChat")); CC_ASSERT(_btnChat != nullptr); _btnChat->addClickEventListener([this](Ref*){ YSAudioEngine::Instance().playBtnClickEffect(); auto chatLayer = ChatLayer::create(m_vecShortChatList); CC_ASSERT(chatLayer != nullptr); this->addChild(chatLayer, ZO_ANI); chatLayer->pushScene(); }); // 开始按钮; _btnStartGame = static_cast(_ButtonPanel->getChildByName("btnStartGame")); CC_ASSERT(_btnStartGame != nullptr); _btnStartGame->setVisible(false); // 开始游戏; _btnStartGame->addClickEventListener([=](Ref* pSender) { playBtnClickEffect(); SendUserReady(); _btnStartGame->setEnabled(false); }); // 开始动画; _pArmatureStart = (Armature*)_MainPanel->getChildByName("armaStartGame"); CC_ASSERT(_pArmatureStart != nullptr); _pArmatureStart->setVisible(false); ArmatureAnimation* pAniStart = _pArmatureStart->getAnimation(); if (pAniStart != nullptr) { pAniStart->setMovementEventCallFunc(CC_CALLBACK_3(SSSGameScene::movementEventCallFunc, this)); } // 全垒打动画; _pArmaAllKillEffect = (Armature*)_MainPanel->getChildByName("armaAllKillEffect"); CC_ASSERT(_pArmaAllKillEffect != nullptr); _pArmaAllKillEffect->setVisible(false); ArmatureAnimation* pAniAllKill = _pArmaAllKillEffect->getAnimation(); if (pAniAllKill != nullptr) { pAniAllKill->setMovementEventCallFunc(CC_CALLBACK_3(SSSGameScene::movementEventCallFunc, this)); } // 抢庄面板; _RobPanel = static_cast(_MainPanel->getChildByName("RobPanel")); CC_ASSERT(_RobPanel != nullptr); _RobPanel->setVisible(false); // 抢庄; _btnRobYes = static_cast(_RobPanel->getChildByName("btnRobYes")); CC_ASSERT(_btnRobYes != nullptr); _btnRobYes->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onRobYesButtonClick, this)); // 不抢庄; _btnRobNo = static_cast(_RobPanel->getChildByName("btnRobNo")); CC_ASSERT(_btnRobNo != nullptr); _btnRobNo->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onRobNoButtonClick, this)); // 压注面板; _YaZhuPanel = static_cast(_MainPanel->getChildByName("YaZhuPanel")); CC_ASSERT(_YaZhuPanel != nullptr); _YaZhuPanel->setVisible(false); // 压注按钮; for (uint8 i = 0; i < 3; i++) { Button* pTmpButton = static_cast(_YaZhuPanel->getChildByName(StringUtils::format("btnScore%d", 3+i))); CC_ASSERT(pTmpButton != nullptr); pTmpButton->setTag(3 + i); pTmpButton->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onYaZhuButtonClick, this)); _aryButtonScore[i] = pTmpButton; } // 特殊面板; _SpecialPanel = static_cast(_MainPanel->getChildByName("SpecialPanel")); CC_ASSERT(_SpecialPanel != nullptr); _SpecialPanel->setVisible(false); // 特殊牌类型; _sprSpecialType = static_cast(_SpecialPanel->getChildByName("txtCardType")); CC_ASSERT(_sprSpecialType != nullptr); _sprOtherCallBanker = static_cast(_MainPanel->getChildByName("watting_callbanker")); CC_ASSERT(_sprOtherCallBanker != nullptr); _sprOtherAddScore = static_cast(_MainPanel->getChildByName("watting_addscore")); CC_ASSERT(_sprOtherAddScore != nullptr); _sprSelfAddScore = static_cast(_MainPanel->getChildByName("owner_addscore")); CC_ASSERT(_sprSelfAddScore != nullptr); setOperateStatus(SSS_OS_NULL); // 不摆特殊牌按钮; _btnRefuseCards = static_cast(_SpecialPanel->getChildByName("btnRefuseCards")); CC_ASSERT(_btnRefuseCards != nullptr); _btnRefuseCards->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onRefuseCardsButtonClick, this)); // 确定特殊牌按钮; _btnCommitSpecial = static_cast(_SpecialPanel->getChildByName("btnCommit")); CC_ASSERT(_btnCommitSpecial != nullptr); _btnCommitSpecial->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onCommitSpecialButtonClick, this)); // 操作面板; _OperatePanel = static_cast(_MainPanel->getChildByName("OperatePanel")); CC_ASSERT(_OperatePanel != nullptr); _OperatePanel->setVisible(false); auto OperCardPanelParent = static_cast(_OperatePanel->getChildByName("OperateCardPanel")); CC_ASSERT(OperCardPanelParent != nullptr); // 创建扑克操作面板; Size operSize = OperCardPanelParent->getContentSize(); auto func = CC_CALLBACK_2(SSSGameScene::selectCardCallback, this); _OperateCardPanel = SSSOperateCardPanel::create(operSize, func); OperCardPanelParent->addChild(_OperateCardPanel); // 桌面上的时钟精灵; _imgGameClock = static_cast(_MainPanel->getChildByName("imgGameClock")); CC_ASSERT(_imgGameClock != nullptr); _imgGameClock->setVisible(false); // 操作面板上的时钟精灵; _imgOperClock = static_cast(_OperatePanel->getChildByName("imgGameClock")); CC_ASSERT(_imgOperClock != nullptr); _imgOperClock->setVisible(false); // 比较按钮; _btnCompare = static_cast(_OperatePanel->getChildByName("btnCompare")); CC_ASSERT(_btnCompare != nullptr); _btnCompare->setVisible(false); // 重置按钮; _btnReset = static_cast(_OperatePanel->getChildByName("btnReset")); CC_ASSERT(_btnReset != nullptr); _btnReset->setVisible(false); // 随机组牌按钮; _btnRandomCard = static_cast(_OperatePanel->getChildByName("btnRandomCard")); CC_ASSERT(_btnRandomCard != nullptr); _btnRandomCard->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onRandomButtonClick, this)); auto tricksPanel = static_cast(_OperatePanel->getChildByName("imgTricksPanel")); CC_ASSERT(tricksPanel != nullptr); for (int i = 0; i < SSS_GROUP_COUNT; i++) { auto imgCardBlock = static_cast(tricksPanel->getChildByName(StringUtils::format("imgCardBlock%d", i))); CC_ASSERT(imgCardBlock!=nullptr); _aryTricksCardPanel[i] = static_cast(imgCardBlock->getChildByName("panelCard")); CC_ASSERT(_aryTricksCardPanel[i]!=nullptr); _aryButtonRechoose[i] = static_cast(tricksPanel->getChildByName(StringUtils::format("btnRechoose%d", i))); CC_ASSERT(_aryButtonRechoose[i]!=nullptr); _aryButtonRechoose[i]->setEnabled(false); _arySprCardType[i] = static_cast(tricksPanel->getChildByName(StringUtils::format("sprCardType%d", i))); CC_ASSERT(_arySprCardType[i] != nullptr); _arySprCardType[i]->setVisible(false); _arySprCardShadow[i] = static_cast(imgCardBlock->getChildByName("imgCardShadow")); CC_ASSERT(_arySprCardShadow[i] != nullptr); _arySprCardShadow[i]->setVisible(false); } //对子按钮; _btnDuiZi = static_cast(_OperatePanel->getChildByName("btnDuiZi")); CC_ASSERT(_btnDuiZi != nullptr); _btnDuiZi->setEnabled(false); _btnDuiZi->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onDuiZiButtonClick, this)); //两对按钮; _btnLiangDui = static_cast(_OperatePanel->getChildByName("btnLiangDui")); CC_ASSERT(_btnLiangDui != nullptr); _btnLiangDui->setEnabled(false); _btnLiangDui->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onLiangDuiButtonClick, this)); //三条按钮; _btnSanTiao = static_cast(_OperatePanel->getChildByName("btnSanTiao")); CC_ASSERT(_btnSanTiao != nullptr); _btnSanTiao->setEnabled(false); _btnSanTiao->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onSanTiaoButtonClick, this)); //顺子按钮; _btnShunZi = static_cast(_OperatePanel->getChildByName("btnShunZi")); CC_ASSERT(_btnShunZi != nullptr); _btnShunZi->setEnabled(false); _btnShunZi->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onShunZiButtonClick, this)); //同花按钮; _btnTongHua = static_cast(_OperatePanel->getChildByName("btnTongHua")); CC_ASSERT(_btnTongHua != nullptr); _btnTongHua->setEnabled(false); _btnTongHua->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onTongHuaButtonClick, this)); //葫芦按钮; _btnHuLu = static_cast(_OperatePanel->getChildByName("btnHuLu")); CC_ASSERT(_btnHuLu != nullptr); _btnHuLu->setEnabled(false); _btnHuLu->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onHuLuButtonClick, this)); //铁支按钮; _btnTieZhi = static_cast(_OperatePanel->getChildByName("btnTieZhi")); CC_ASSERT(_btnTieZhi != nullptr); _btnTieZhi->setEnabled(false); _btnTieZhi->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onTieZhiButtonClick, this)); //同花顺按钮; _btnTongHuaShun = static_cast(_OperatePanel->getChildByName("btnTongHuaShun")); CC_ASSERT(_btnTongHuaShun != nullptr); _btnTongHuaShun->setEnabled(false); _btnTongHuaShun->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onTongHuaShunButtonClick, this)); // 头道小于中道提示; _imgQualifiedTips = static_cast(_OperatePanel->getChildByName("imgQualifiedTips")); CC_ASSERT(_imgQualifiedTips != nullptr); _imgQualifiedTips->setVisible(false); // 摊牌; _txtTip = static_cast(_MainPanel->getChildByName("txtTip")); CC_ASSERT(_txtTip != nullptr); _txtTip->setVisible(true); _txtTip->setString(""); // 发牌位置; _ptSendCardPos = _MainPanel->getChildByName("imgCard")->getPosition(); // 语音标志; m_pVoiceNode = (Node*)m_rootNode->getChildByName("VoiceNode"); CC_ASSERT(m_pVoiceNode != nullptr); m_pVoiceNode->setVisible(false); for (int i = 0; i < SSS_GAME_PLAYER; i++) { std::string strName = StringUtils::format("panelChair_%d", i); Layout* layout = static_cast(_MainPanel->getChildByName(strName)); CC_ASSERT(layout!=nullptr); m_aryPlayer[i] = new SSS_GamePlayer(i, layout); layout->addClickEventListener([i, this](Ref* pSender){ CC_ASSERT(pSender != nullptr); if (nullptr == pSender) return; if ((m_aryPlayer[i] != nullptr) && m_aryPlayer[i]->getUserItem(false) != nullptr) { PlayerScene* playerScene = PlayerScene::create(); playerScene->showPlayerInfo(m_aryPlayer[i]); this->addChild(playerScene, ZO_TRUSTEE); } }); } m_pLocalPlayer = m_aryPlayer[SSS_VIEW_SELF_ID]; auto exitCallFunc = [=](Ref*){ auto callback = [=](){ onClickExitGameButton(nullptr); this->runAction(Sequence::createWithTwoActions(DelayTime::create(0.2f), CallFunc::create([=]{ Director::getInstance()->getEventDispatcher()->dispatchCustomEvent(LEAVE_GAME); }))); }; PopScene::Instance().show(utility::a_u8("您确定要退出游戏吗?"), callback, nullptr); }; // 比牌; _btnCompare->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onCompareButtonClick, this)); // 重置手牌; _btnReset->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onResetButtonClick, this)); for (int i = 0; i < SSS_GROUP_COUNT; i++) { _aryButtonRechoose[i]->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onRechooseButtonClick, this)); _aryButtonRechoose[i]->setTag(i); //string strName = StringUtils::format("btnPanel%d", i); //auto btnPanel = static_cast(tricksPanel->getChildByName(strName)); //CC_ASSERT(btnPanel!=nullptr); _aryTricksCardPanel[i]->addTouchEventListener(CC_CALLBACK_2(SSSGameScene::onPanelTouchEvent, this)); _aryTricksCardPanel[i]->setTag(i); } // 邀请; _btnInvite->addClickEventListener(CC_CALLBACK_1(SSSGameScene::onInviteButtonClick, this)); // 解散房间函数; auto callback = [this](){ onEventAgreeDismissRoom(true); }; _btnDismiss->addClickEventListener([=](Ref* pSender) { // 解散; playBtnClickEffect(); std::string strTip; if (0 == m_PrivateRoomInfo.dwPlayCout && false == m_PrivateRoomInfo.bStartGame) { strTip = "牌局开始前解散房间不扣房卡,是否解散?"; } else { strTip = "您确定要解散房间吗?"; } PopScene::Instance().show(utility::a_u8(strTip.c_str()), callback, nullptr); }); // 私人场结束面板; _OpenResultScene = SSSOpenResultScene::create(); addChild(_OpenResultScene); _OpenResultScene->setVisible(false); //// 解散房间函数; //auto callback = [this](){ // onEventAgreeDismissRoom(true); //}; //对手机返回键的监听 ; auto keyListener = EventListenerKeyboard::create(); //和回调函数绑定 ; keyListener->onKeyReleased = [=](EventKeyboard::KeyCode keyCode, Event * pEvent){ //返回值处理; if (keyCode == EventKeyboard::KeyCode::KEY_ESCAPE) { //uint8 cbWinChairID = 3; //uint8 cbLoseChairID = 2; //uint16 wWinViewID = SwitchViewChairID(cbWinChairID); //tagSSSGunInfo* pWinInfo = new tagSSSGunInfo; //pWinInfo->wViewID = wWinViewID; //pWinInfo->ptPos = m_aryPlayer[wWinViewID]->getHandCardPos(1, 2); //pWinInfo->cbGender = m_aryPlayer[wWinViewID]->GetGender(); //pWinInfo->nScore = std::abs(10); //uint16 wLoseViewID = SwitchViewChairID(cbLoseChairID); //tagSSSGunInfo* pLoseInfo = new tagSSSGunInfo; //pLoseInfo->wViewID = wLoseViewID; //pLoseInfo->ptPos = m_aryPlayer[wLoseViewID]->getHandCardPos(1, 2); //pLoseInfo->cbGender = m_aryPlayer[wLoseViewID]->GetGender(); //pLoseInfo->nScore = -10; //tagSSSTwoGunInfos* pInfo = new tagSSSTwoGunInfos; //pInfo->pWinnerInfo = pWinInfo; //pInfo->pLoserInfo = pLoseInfo; //m_GameOverAni->addGunPlay(pInfo); //m_GameOverAni->showAnimation(nullptr); exitCallFunc(nullptr); } }; //添加到事件分发器中 ; _eventDispatcher->addEventListenerWithSceneGraphPriority(keyListener, this); SpriteFrameCache* pSpriteFrameCache = SpriteFrameCache::getInstance(); pSpriteFrameCache->addSpriteFramesWithFile("Games/13S/Cards/PinLargeCard1.plist"); pSpriteFrameCache->addSpriteFramesWithFile("Games/13S/Cards/PinLargeCard2.plist"); pSpriteFrameCache->addSpriteFramesWithFile("Games/13S/Cards/PinSmallCard.plist"); m_GameOverAni = CGameOverAni::create(); _MainPanel->addChild(m_GameOverAni); loadShortChat("Games/13S/ShortChat/ChatInfo.json"); //重置场景; resetScene(); //重置数据; ResetAllData(); } //重置场景; void SSSGameScene::resetScene(bool bAll/* = false*/) { //重置玩家UI; for (uint8 i = 0; i < SSS_GAME_PLAYER; i++) { m_aryPlayer[i]->resetUI(bAll); m_aryPlayer[i]->setBankerVisible(false); m_aryPlayer[i]->updateUserChip(0); } for (int i = 0; i < SSS_GROUP_COUNT; i++) { _aryTricksCardPanel[i]->removeAllChildren(); _aryButtonRechoose[i]->setEnabled(false); _arySprCardType[i]->setVisible(false); } setOperateStatus(SSS_OS_NULL); _RobPanel->setVisible(false); _YaZhuPanel->setVisible(false); _SpecialPanel->setVisible(false); _OperatePanel->setVisible(false); _ResultPanel->setVisible(false); } //重置数据; void SSSGameScene::resetData() { _cbGameStatus = SSS_GS_WK_FREE; _iBaseScore = 0; _wBankerUser = INVALID_CHAIR; _cbCurOpenCardAniIndex = 0; _wSelfSpecialType = SSS_CT_INVALID; _wKillAllUserChairID = INVALID_CHAIR; for (uint8 i = 0; i < SSS_GAME_PLAYER; i++) { _aryActiveStatus[i] = SSS_HAND_STATUS_NULL; } zeromemory(_aryHandCardData, sizeof(_aryHandCardData)); zeromemory(_aryTricksFrontCard, sizeof(_aryTricksFrontCard)); zeromemory(_aryTricksMidCard, sizeof(_aryTricksMidCard)); zeromemory(_aryTricksBackCard, sizeof(_aryTricksBackCard)); zeromemory(_arySpecialType, sizeof(_arySpecialType)); zeromemory(_arySpecialCompareResult, sizeof(_arySpecialCompareResult)); zeromemory(_aryThreeKillResult, sizeof(_aryThreeKillResult)); zeromemory(_aryFrontCard, sizeof(_aryFrontCard)); zeromemory(_aryMidCard, sizeof(_aryMidCard)); zeromemory(_aryBackCard, sizeof(_aryBackCard)); } //重置数据(相当于玩家离开); void SSSGameScene::ResetAllData() { resetScene(); resetData(); } //重置桌子; void SSSGameScene::ResetTable() { resetScene(true); resetData(); } //获取快捷语音文件路径; const std::string SSSGameScene::getShortChatSoundPath(uint8 cbGender, int nIndex) { // 短语; std::string strFilePath = "Games/13S/ShortChat/"; if (cbGender == enMan) { strFilePath += StringUtils::format("man/%d.mp3", nIndex); } else { strFilePath += StringUtils::format("woman/%d.mp3", nIndex); } return strFilePath; } //绑定网络消息; void SSSGameScene::initNet() { addNetCBDefine(SSS_SUB_S_GAME_START, this, SSSGameScene::onSubGameStart); addNetCBDefine(SSS_SUB_S_START_ROB, this, SSSGameScene::onSubStartRob); addNetCBDefine(SSS_SUB_S_USER_ROB, this, SSSGameScene::onSubUserRob); addNetCBDefine(SSS_SUB_S_START_CHIP, this, SSSGameScene::onSubStartChip); addNetCBDefine(SSS_SUB_S_USER_CHIP, this, SSSGameScene::onSubUserChip); addNetCBDefine(SSS_SUB_S_SEND_LEFT_CARD, this, SSSGameScene::onSubSendLeftCard); addNetCBDefine(SSS_SUB_S_START_OPEN, this, SSSGameScene::onSubStartOpen); addNetCBDefine(SSS_SUB_S_OPEN_CARD, this, SSSGameScene::onSubOpenCard); addNetCBDefine(SSS_SUB_S_CLASSIC_CMP_CARD, this, SSSGameScene::onSubClassicCompareCard); addNetCBDefine(SSS_SUB_S_BANKER_CMP_CARD, this, SSSGameScene::onSubBankerCompareCard); addNetCBDefine(SSS_SUB_S_GAME_END, this, SSSGameScene::onSubGameEnd); } bool SSSGameScene::OnEventSceneMessage(uint8 cbGameStatus, bool bLookonUser, void* pData, int nDataSize) { _cbGameStatus = cbGameStatus; switch (cbGameStatus) { case SSS_GS_WK_FREE: { return onGameSceneFree(pData, nDataSize); } case SSS_GS_WK_ROB_BANKER: { return onGameSceneRobBanker(pData, nDataSize); } case SSS_GS_WK_USER_CHIP: { return onGameSceneUserChip(pData, nDataSize); } case SSS_GS_WK_SEND_CARD: { return onGameSceneSendCard(pData, nDataSize); } case SSS_GS_WK_OPEN_CARD: { return onGameSceneOpenCard(pData, nDataSize); } case SSS_GS_WK_COMPARE_CARD: { return onGameSceneCompareCard(pData, nDataSize); } default: break; } return true; } //恢复空闭场景; bool SSSGameScene::onGameSceneFree(void* pData, int nDataSize) { //校验数据; CC_ASSERT(nDataSize == sizeof(SSS_CMD_S_StatusFree)); SSS_CMD_S_StatusFree* pStatusFree = (SSS_CMD_S_StatusFree*)pData; _wBuildCardTime = pStatusFree->wBuildCardTime; _wRobBankerTime = pStatusFree->wRobBankerTime; _wUserChipTime = pStatusFree->wUserChipTime; return true; } //抢庄场景; bool SSSGameScene::onGameSceneRobBanker(void* pData, int nDataSize) { //校验数据; CC_ASSERT(nDataSize == sizeof(SSS_CMD_S_StatusRob)); SSS_CMD_S_StatusRob* pStatusRob = (SSS_CMD_S_StatusRob*)pData; _wBuildCardTime = pStatusRob->BaseStatus.wBuildCardTime; _wRobBankerTime = pStatusRob->BaseStatus.wRobBankerTime; _wUserChipTime = pStatusRob->BaseStatus.wUserChipTime; for (int i = 0; i < SSS_GAME_PLAYER; i++) { _aryActiveStatus[i] = pStatusRob->BaseStatus.cbHandStatus[i]; } _cbSendCardCount = pStatusRob->cbCardCount; memcpy(_aryHandCardData, pStatusRob->cbHandCardData, sizeof(_aryHandCardData)); showCurHandCard(_cbSendCardCount); uint16 wSelfChairID = getSelfChairID(); CC_ASSERT(wSelfChairIDcbRobStatus[wSelfChairID]) { _RobPanel->setVisible(true); } else { setOperateStatus(SSS_OS_CALLBANK); } return true; } //下注场景; bool SSSGameScene::onGameSceneUserChip(void* pData, int nDataSize) { //校验数据; CC_ASSERT(nDataSize == sizeof(SSS_CMD_S_StatusChip)); SSS_CMD_S_StatusChip* pStatusChip = (SSS_CMD_S_StatusChip*)pData; _wBuildCardTime = pStatusChip->BaseStatus.wBuildCardTime; _wRobBankerTime = pStatusChip->BaseStatus.wRobBankerTime; _wUserChipTime = pStatusChip->BaseStatus.wUserChipTime; _wBankerUser = pStatusChip->wBankerUser; for (int i = 0; i < SSS_GAME_PLAYER; i++) { _aryActiveStatus[i] = pStatusChip->BaseStatus.cbHandStatus[i]; } _cbSendCardCount = pStatusChip->cbCardCount; memcpy(_aryHandCardData, pStatusChip->cbHandCardData, sizeof(_aryHandCardData)); showCurHandCard(_cbSendCardCount); uint16 wSelfChairID = getSelfChairID(); CC_ASSERT(wSelfChairID < SSS_GAME_PLAYER); //抢庄状态 0:没操作,1:已操作; if ((pStatusChip->wBankerUser != wSelfChairID) && (0 == pStatusChip->cbChipStatus[wSelfChairID])) { _YaZhuPanel->setVisible(true); setOperateStatus(SSS_OS_ADDSCORE1); } else { setOperateStatus(SSS_OS_ADDSCORE0); } for (int i = 0; i < SSS_GAME_PLAYER; i++) { int nChipScore = pStatusChip->lUserChipScore[i]; if (nChipScore>0) { uint16 wViewID = SwitchViewChairID(i); m_aryPlayer[wViewID]->updateUserChip(nChipScore); } } showBankerIcon(); return true; } //发牌场景; bool SSSGameScene::onGameSceneSendCard(void* pData, int nDataSize) { //校验数据; CC_ASSERT(nDataSize == sizeof(SSS_CMD_S_StatusSendCard)); SSS_CMD_S_StatusSendCard* pStatusSend = (SSS_CMD_S_StatusSendCard*)pData; _wBuildCardTime = pStatusSend->BaseStatus.wBuildCardTime; _wRobBankerTime = pStatusSend->BaseStatus.wRobBankerTime; _wUserChipTime = pStatusSend->BaseStatus.wUserChipTime; _wSelfSpecialType = pStatusSend->wSpecialType; _cbSendCardCount = pStatusSend->cbCardCount; _wBankerUser = pStatusSend->wBankerUser; for (int i = 0; i < SSS_GAME_PLAYER; i++) { _aryActiveStatus[i] = pStatusSend->BaseStatus.cbHandStatus[i]; } memcpy(_aryHandCardData, pStatusSend->cbHandCardData, sizeof(_aryHandCardData)); uint16 wMyChairID = getSelfChairID(); CC_ASSERT(wMyChairID < SSS_GAME_PLAYER); if (wMyChairID < SSS_GAME_PLAYER) { memcpy(_aryFrontCard[wMyChairID], pStatusSend->cbHandCardData, SSS_MIN_ITEM_COUNT); memcpy(_aryMidCard[wMyChairID], &pStatusSend->cbHandCardData[3], SSS_MAX_ITEM_COUNT); memcpy(_aryBackCard[wMyChairID], &pStatusSend->cbHandCardData[8], SSS_MAX_ITEM_COUNT); } showAllPlayersCard(); showBankerIcon(); uint8 cbUserStatus = m_pLocalPlayer->GetUserStatus(); if (pStatusSend->bSendOver && cbUserStatus == US_PLAYING) { sendSendCardOverMsg(); } return true; } //开牌场景; bool SSSGameScene::onGameSceneOpenCard(void* pData, int nDataSize) { //校验数据; CC_ASSERT(nDataSize == sizeof(SSS_CMD_S_StatusOpen)); SSS_CMD_S_StatusOpen* pStatusOpen = (SSS_CMD_S_StatusOpen*)pData; _wBuildCardTime = pStatusOpen->BaseStatus.wBuildCardTime; _wRobBankerTime = pStatusOpen->BaseStatus.wRobBankerTime; _wUserChipTime = pStatusOpen->BaseStatus.wUserChipTime; _wSelfSpecialType = pStatusOpen->wSpecialType; _wBankerUser = pStatusOpen->wBankerUser; for (int i = 0; i < SSS_GAME_PLAYER; i++) { _aryActiveStatus[i] = pStatusOpen->BaseStatus.cbHandStatus[i]; } memcpy(_aryHandCardData, pStatusOpen->cbHandCardData, sizeof(_aryHandCardData)); uint16 wMyChairID = getSelfChairID(); CC_ASSERT(wMyChairID < SSS_GAME_PLAYER); if (wMyChairID < SSS_GAME_PLAYER) { memcpy(_aryFrontCard[wMyChairID], pStatusOpen->cbHandCardData, SSS_MIN_ITEM_COUNT); memcpy(_aryMidCard[wMyChairID], &pStatusOpen->cbHandCardData[3], SSS_MAX_ITEM_COUNT); memcpy(_aryBackCard[wMyChairID], &pStatusOpen->cbHandCardData[8], SSS_MAX_ITEM_COUNT); } showAllPlayersCard(); showBankerIcon(); for (int i = 0; ishowHandStatus(_aryActiveStatus[i]); int nChipScore = pStatusOpen->lUserChipScore[i]; if (nChipScore > 0) { m_aryPlayer[wViewID]->updateUserChip(nChipScore); } } } switch (_aryActiveStatus[wMyChairID]) { case SSS_HAND_STATUS_SORTED: _txtTip->setString(utility::a_u8("等待其他玩家开牌...")); m_aryPlayer[SSS_VIEW_SELF_ID]->showCard(_aryFrontCard[wMyChairID], _aryMidCard[wMyChairID], _aryBackCard[wMyChairID], SSS_HAND_STATUS_SORTED); break; case SSS_HAND_STATUS_GIVEUP: _txtTip->setString(utility::a_u8("等待其他玩家开牌...")); break; case SSS_HAND_STATUS_DISORDER: if (_wSelfSpecialType!=SSS_CT_INVALID) { m_GameLogic.SortCardList(_aryHandCardData, SSS_MAX_COUNT); showCurHandCard(SSS_MAX_COUNT); showSpecialPanel(true); } else { showOperatePanel(true); } break; default: break; } return true; } //比牌场景; bool SSSGameScene::onGameSceneCompareCard(void* pData, int nDataSize) { bool bCompareOver = false; uint16 wHandCardType[SSS_GAME_PLAYER][SSS_GROUP_COUNT] = {0}; int nCompareResult[SSS_GAME_PLAYER][SSS_GROUP_COUNT] = { 0 }; int aryUserChipScore[SSS_GAME_PLAYER] = {}; if (eSSSGameRuleClassic==(m_PrivateRoomInfo.bGameRuleIdex&eSSSGameRuleClassic)) { //校验数据; CC_ASSERT(nDataSize == sizeof(SSS_CMD_S_StatusClassicCompare)); SSS_CMD_S_StatusClassicCompare* pSC = (SSS_CMD_S_StatusClassicCompare*)pData; _wBuildCardTime = pSC->wBuildCardTime; _txtTip->setString(""); memcpy(_aryActiveStatus, pSC->CompareStatus.cbHandStatus, sizeof(_aryActiveStatus)); //ArmatureAnimation* pAniStart = _pArmatureStart->getAnimation(); //if (pAniStart != nullptr) //{ // pAniStart->play("GameStart1", -1, 0); // _pArmatureStart->setVisible(true); //} memcpy(_aryFrontCard, pSC->CompareStatus.cbFrontCard, sizeof(_aryFrontCard)); memcpy(_aryMidCard, pSC->CompareStatus.cbMidCard, sizeof(_aryMidCard)); memcpy(_aryBackCard, pSC->CompareStatus.cbBackCard, sizeof(_aryBackCard)); memcpy(wHandCardType, pSC->CompareStatus.wHandCardType, sizeof(wHandCardType)); memcpy(nCompareResult, pSC->CompareStatus.nCompareResult, sizeof(nCompareResult)); bCompareOver = pSC->bCompareOver; } else { //校验数据; CC_ASSERT(nDataSize == sizeof(SSS_CMD_S_StatusBankerCompare)); SSS_CMD_S_StatusBankerCompare* pSBC = (SSS_CMD_S_StatusBankerCompare*)pData; _wBankerUser = pSBC->wBankerUser; _wBuildCardTime = pSBC->wBuildCardTime; _txtTip->setString(""); memcpy(_aryActiveStatus, pSBC->CompareStatus.cbHandStatus, sizeof(_aryActiveStatus)); //ArmatureAnimation* pAniStart = _pArmatureStart->getAnimation(); //if (pAniStart != nullptr) //{ // pAniStart->play("GameStart1", -1, 0); // _pArmatureStart->setVisible(true); //} memcpy(_aryFrontCard, pSBC->CompareStatus.cbFrontCard, sizeof(_aryFrontCard)); memcpy(_aryMidCard, pSBC->CompareStatus.cbMidCard, sizeof(_aryMidCard)); memcpy(_aryBackCard, pSBC->CompareStatus.cbBackCard, sizeof(_aryBackCard)); bCompareOver = pSBC->bCompareOver; for (int i = 0; i < SSS_GAME_PLAYER; i++) { for (int j = 0; j < SSS_GROUP_COUNT; j++) { wHandCardType[i][j] = pSBC->CompareStatus.wHandCardType[i][j]; nCompareResult[i][j] = pSBC->CompareStatus.cbOtherCmResult[i][j]; } aryUserChipScore[i] = pSBC->lUserChipScore[i]; } showBankerIcon(); } // 展示所有手牌和分数; for (uint16 i = 0; i < SSS_GAME_PLAYER; i++) { if (_aryActiveStatus[i] != SSS_HAND_STATUS_NULL) { uint16 wViewID = SwitchViewChairID(i); // 特殊处理A32; for (uint8 j = 0; j < SSS_GROUP_COUNT; j++) { uint8 aryTmpCardData[SSS_MAX_ITEM_COUNT] = { 0 }; int nItemCount = j > 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT; if (0==j) { if (cardTypeTo32A(_aryFrontCard[i], nItemCount, aryTmpCardData, nItemCount)) { memcpy(_aryFrontCard[i], aryTmpCardData, sizeof(uint8)*nItemCount); } } else if (1==j) { if (cardTypeTo32A(_aryMidCard[i], nItemCount, aryTmpCardData, nItemCount)) { memcpy(_aryMidCard[i], aryTmpCardData, sizeof(uint8)*nItemCount); } } else if (2==j) { if (cardTypeTo32A(_aryBackCard[i], nItemCount, aryTmpCardData, nItemCount)) { memcpy(_aryBackCard[i], aryTmpCardData, sizeof(uint8)*nItemCount); } } } m_aryPlayer[wViewID]->showCard(_aryFrontCard[i], _aryMidCard[i], _aryBackCard[i], _aryActiveStatus[i]); m_aryPlayer[wViewID]->setGameScore(nCompareResult[i], wHandCardType[i]); int nChipScore = aryUserChipScore[i]; if (nChipScore > 0) { m_aryPlayer[wViewID]->updateUserChip(nChipScore); } } } uint8 cbUserStatus = m_pLocalPlayer->GetUserStatus(); if (!bCompareOver && cbUserStatus == US_PLAYING) { sendCompareOverMsg(); } return true; } void SSSGameScene::onSubGameStart(const void * pBuffer, uint16 wDataSize) { //校验数据; CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_GameStart)); SSS_CMD_S_GameStart* pGameStart = (SSS_CMD_S_GameStart*)pBuffer; //重置数据; ResetAllData(); _wSelfSpecialType = pGameStart->wSpecialType; _cbSendCardCount = pGameStart->cbCardCount; _wBankerUser = pGameStart->wBankerChairID; memcpy(_aryHandCardData, pGameStart->cbHandCardData, sizeof(_aryHandCardData)); if (_cbSendCardCount > 0) { m_GameLogic.SortCardList(_aryHandCardData, _cbSendCardCount); } for (uint8 i = 0; i < SSS_GAME_PLAYER; i++) { _aryActiveStatus[i] = pGameStart->cbHandStatus[i]; } if (_cbSendCardCount>0) { ArmatureAnimation* pAniStart = _pArmatureStart->getAnimation(); if (pAniStart != nullptr) { pAniStart->play("GameStart2", -1, 0); _pArmatureStart->setVisible(true); } showBankerIcon(); } else { SSS_CMD_S_StartChip mStartChip = {0}; mStartChip.wBankerUser = _wBankerUser; onSubStartChip(&mStartChip, sizeof(SSS_CMD_S_StartChip)); } // 隐藏同IP显示; IpTipScene::Instance().hide(); } //开始抢庄; void SSSGameScene::onSubStartRob(const void * pBuffer, uint16 wDataSize) { _RobPanel->setVisible(true); } //玩家抢庄; void SSSGameScene::onSubUserRob(const void * pBuffer, uint16 wDataSize) { //校验数据; CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_UserRob)); SSS_CMD_S_UserRob* pUserRob = (SSS_CMD_S_UserRob*)pBuffer; uint16 wViewID = SwitchViewChairID(pUserRob->wRobUser); if (SSS_VIEW_SELF_ID==wViewID) { _RobPanel->setVisible(false); setOperateStatus(SSS_OS_CALLBANK); } // 声音; std::string strRobResult = StringUtils::format("%s", pUserRob->bRobResult ? "Qiangzhuan" : "Buqiang"); std::string strSound = StringUtils::format("woman/%s", strRobResult.c_str()); if (m_aryPlayer[wViewID]->GetGender() == enMan) { strSound = StringUtils::format("man/%s", strRobResult.c_str()); } playEffect(strSound); } //开始下注; void SSSGameScene::onSubStartChip(const void * pBuffer, uint16 wDataSize) { //校验数据; CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_StartChip)); SSS_CMD_S_StartChip* pStartChip = (SSS_CMD_S_StartChip*)pBuffer; _RobPanel->setVisible(false); CC_ASSERT(pStartChip->wBankerUserwBankerUserwBankerUser; uint16 wViewID = SwitchViewChairID(pStartChip->wBankerUser); m_aryPlayer[wViewID]->setBankerVisible(true); if (SSS_VIEW_SELF_ID!=wViewID) { _YaZhuPanel->setVisible(true); setOperateStatus(SSS_OS_ADDSCORE1); } else { setOperateStatus(SSS_OS_ADDSCORE0); } std::string strSound = "woman/banker"; if (m_aryPlayer[wViewID]->GetGender() == enMan) { strSound = "man/banker"; } playEffect(strSound); } } //玩家下注; void SSSGameScene::onSubUserChip(const void * pBuffer, uint16 wDataSize) { //校验数据; CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_UserChip)); SSS_CMD_S_UserChip* pUserChip = (SSS_CMD_S_UserChip*)pBuffer; uint16 wViewID = SwitchViewChairID(pUserChip->wChipUser); m_aryPlayer[wViewID]->updateUserChip(pUserChip->lChipScore); if (SSS_VIEW_SELF_ID == wViewID) { _YaZhuPanel->setVisible(false); setOperateStatus(SSS_OS_ADDSCORE0); } // 声音; std::string strSound = StringUtils::format("woman/Chip%d", pUserChip->lChipScore); if (m_aryPlayer[wViewID]->GetGender() == enMan) { strSound = StringUtils::format("man/Chip%d", pUserChip->lChipScore); } playEffect(strSound); } //发送剩下的牌; void SSSGameScene::onSubSendLeftCard(const void * pBuffer, uint16 wDataSize) { //校验数据; CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_SendLeftCard)); SSS_CMD_S_SendLeftCard* pLeftCard = (SSS_CMD_S_SendLeftCard*)pBuffer; memcpy(_aryHandCardData, pLeftCard->cbHandCardData, sizeof(_aryHandCardData)); onSubStartOpen(nullptr, 0); } //开始开牌; void SSSGameScene::onSubStartOpen(const void * pBuffer, uint16 wDataSize) { setOperateStatus(SSS_OS_NULL); _YaZhuPanel->setVisible(false); if (SSS_CT_INVALID==_wSelfSpecialType) { _SendCardPanel->setVisible(false); _SendCardPanel->removeAllChildren(); } if ((m_PrivateRoomInfo.bGameRuleIdex&eSSSGameRuleClassic) == 0) { showAllPlayersCard(); } uint16 wSelfChairID = getSelfChairID(); if (_aryActiveStatus[wSelfChairID] != SSS_HAND_STATUS_NULL) { if (_wSelfSpecialType != SSS_CT_INVALID) { showSpecialPanel(true); } else { showOperatePanel(true); } } } //开牌; void SSSGameScene::onSubOpenCard(const void * pBuffer, uint16 wDataSize) { CC_ASSERT(sizeof(SSS_CMD_S_OpenCard) == wDataSize); SSS_CMD_S_OpenCard* pOpenCard = (SSS_CMD_S_OpenCard*)pBuffer; uint16 wSelfChairID = getSelfChairID(); uint16 wViewID = SwitchViewChairID(pOpenCard->wChairID); if (pOpenCard->wChairID == wSelfChairID) { closeClock(_imgOperClock); _OperatePanel->setVisible(false); _SendCardPanel->setVisible(false); _SendCardPanel->removeAllChildren(); m_aryPlayer[wViewID]->showCard(_aryTricksFrontCard, _aryTricksMidCard, _aryTricksBackCard, SSS_HAND_STATUS_SORTED, true); _txtTip->setString(utility::a_u8("等待其他玩家开牌...")); uint8 cbGender = m_pLocalPlayer->GetGender(); std::string strPath = ""; if (0 == cbGender) { strPath += "man/m_complete"; } else { strPath += "woman/f_complete"; } playEffect(strPath); } else { m_aryPlayer[wViewID]->showHandStatus(SSS_HAND_STATUS_SORTED); } } //比牌结果; void SSSGameScene::onSubClassicCompareCard(const void * pBuffer, uint16 wDataSize) { CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_ClassicCompareCard)); SSS_CMD_S_ClassicCompareCard* pCompare = (SSS_CMD_S_ClassicCompareCard*)pBuffer; _OperatePanel->setVisible(false); _txtTip->setString(""); closeClock(_imgGameClock); memcpy(_aryActiveStatus, pCompare->cbHandStatus, sizeof(_aryActiveStatus)); memcpy(_aryFrontCard, pCompare->cbFrontCard, sizeof(_aryFrontCard)); memcpy(_aryMidCard, pCompare->cbMidCard, sizeof(_aryMidCard)); memcpy(_aryBackCard, pCompare->cbBackCard, sizeof(_aryBackCard)); memcpy(_arySpecialType, pCompare->wSpecialType, sizeof(_arySpecialType)); memcpy(_arySpecialCompareResult, pCompare->nSpecialCompareResult, sizeof(_arySpecialCompareResult)); memcpy(_aryThreeKillResult, pCompare->cbThreeKillResult, sizeof(_aryThreeKillResult)); // 展示所有手牌; for (uint16 i = 0; i < SSS_GAME_PLAYER; i++) { if (SSS_HAND_STATUS_NULL==_aryActiveStatus[i]) { continue; } uint16 wViewID = SwitchViewChairID(i); if (SSS_CT_INVALID==pCompare->wSpecialType[i]) { // 特殊处理A32; for (uint8 j = 0; j < SSS_GROUP_COUNT; j++) { uint8 aryTmpCardData[SSS_MAX_ITEM_COUNT] = { 0 }; int nItemCount = j > 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT; if (0 == j) { if (cardTypeTo32A(_aryFrontCard[i], nItemCount, aryTmpCardData, nItemCount)) { memcpy(_aryFrontCard[i], aryTmpCardData, sizeof(uint8)*nItemCount); } } else if (1 == j) { if (cardTypeTo32A(_aryMidCard[i], nItemCount, aryTmpCardData, nItemCount)) { memcpy(_aryMidCard[i], aryTmpCardData, sizeof(uint8)*nItemCount); } } else if (2 == j) { if (cardTypeTo32A(_aryBackCard[i], nItemCount, aryTmpCardData, nItemCount)) { memcpy(_aryBackCard[i], aryTmpCardData, sizeof(uint8)*nItemCount); } } } m_aryPlayer[wViewID]->showCard(_aryFrontCard[i], _aryMidCard[i], _aryBackCard[i], _aryActiveStatus[i], true); m_aryPlayer[wViewID]->setGameScore(pCompare->nCompareResult[i], pCompare->wHandCardType[i]); } else { m_aryPlayer[wViewID]->showCard(_aryFrontCard[i], _aryMidCard[i], _aryBackCard[i], _aryActiveStatus[i]); m_aryPlayer[wViewID]->showSepShadow(true); SCORE aryScore[SSS_GROUP_COUNT] = {0}; uint16 aryCardType[SSS_GROUP_COUNT] = { 0 }; m_aryPlayer[wViewID]->setGameScore(aryScore, aryCardType); } } _cbCurOpenCardAniIndex = 0; ArmatureAnimation* pAniStart = _pArmatureStart->getAnimation(); if (pAniStart != nullptr) { pAniStart->play("GameStart1", -1, 0); _pArmatureStart->setVisible(true); } uint8 cbGender = m_pLocalPlayer->GetGender(); std::string strPath = ""; if (0 == cbGender) { strPath += "man/m_compare"; } else { strPath += "woman/f_compare"; } playEffect(strPath); for (uint8 i = 0; i < 6; i++) { uint8 cbWinChairID = pCompare->aryShootState[i][0]; uint8 cbLoseChairID = pCompare->aryShootState[i][1]; if (cbWinChairID != 255) { if (!m_GameOverAni->isExist(cbWinChairID, cbLoseChairID)) { uint16 wWinViewID = SwitchViewChairID(cbWinChairID); tagSSSGunInfo* pWinInfo = new tagSSSGunInfo; pWinInfo->wViewID = wWinViewID; pWinInfo->ptPos = m_aryPlayer[wWinViewID]->getHandCardPos(1, 2); pWinInfo->cbGender = m_aryPlayer[wWinViewID]->GetGender(); pWinInfo->nScore = pCompare->aryShootDaoShu[cbWinChairID][cbLoseChairID]; uint16 wLoseViewID = SwitchViewChairID(cbLoseChairID); tagSSSGunInfo* pLoseInfo = new tagSSSGunInfo; pLoseInfo->wViewID = wLoseViewID; pLoseInfo->ptPos = m_aryPlayer[wLoseViewID]->getHandCardPos(1, 2); pLoseInfo->cbGender = m_aryPlayer[wLoseViewID]->GetGender(); pLoseInfo->nScore = pCompare->aryShootDaoShu[cbLoseChairID][cbWinChairID]; tagSSSTwoGunInfos* pInfo = new tagSSSTwoGunInfos; pInfo->pWinnerInfo = pWinInfo; pInfo->pLoserInfo = pLoseInfo; m_GameOverAni->addGunPlay(pInfo); } } } } //带庄家比牌结果; void SSSGameScene::onSubBankerCompareCard(const void * pBuffer, uint16 wDataSize) { CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_BankerCompareCard)); SSS_CMD_S_BankerCompareCard* pCompare = (SSS_CMD_S_BankerCompareCard*)pBuffer; _OperatePanel->setVisible(false); _txtTip->setString(""); closeClock(_imgGameClock); memcpy(_aryActiveStatus, pCompare->cbHandStatus, sizeof(_aryActiveStatus)); memcpy(_aryFrontCard, pCompare->cbFrontCard, sizeof(_aryFrontCard)); memcpy(_aryMidCard, pCompare->cbMidCard, sizeof(_aryMidCard)); memcpy(_aryBackCard, pCompare->cbBackCard, sizeof(_aryBackCard)); int aryCompareResult[SSS_GAME_PLAYER][SSS_GROUP_COUNT] = {0}; for (int i = 0; i < SSS_GAME_PLAYER; i++) { for (int j = 0; j < SSS_GROUP_COUNT; j++) { aryCompareResult[i][j] = pCompare->cbOtherCmResult[i][j]; } } // 展示所有手牌; for (uint16 i = 0; i < SSS_GAME_PLAYER; i++) { if (SSS_HAND_STATUS_NULL == _aryActiveStatus[i]) { continue; } bool bShowScore = (i != _wBankerUser); uint16 wViewID = SwitchViewChairID(i); // 特殊处理A32; for (uint8 j = 0; j < SSS_GROUP_COUNT; j++) { uint8 aryTmpCardData[SSS_MAX_ITEM_COUNT] = { 0 }; int nItemCount = j > 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT; if (0 == j) { if (cardTypeTo32A(_aryFrontCard[i], nItemCount, aryTmpCardData, nItemCount)) { memcpy(_aryFrontCard[i], aryTmpCardData, sizeof(uint8)*nItemCount); } } else if (1 == j) { if (cardTypeTo32A(_aryMidCard[i], nItemCount, aryTmpCardData, nItemCount)) { memcpy(_aryMidCard[i], aryTmpCardData, sizeof(uint8)*nItemCount); } } else if (2 == j) { if (cardTypeTo32A(_aryBackCard[i], nItemCount, aryTmpCardData, nItemCount)) { memcpy(_aryBackCard[i], aryTmpCardData, sizeof(uint8)*nItemCount); } } } m_aryPlayer[wViewID]->showCard(_aryFrontCard[i], _aryMidCard[i], _aryBackCard[i], _aryActiveStatus[i], true); m_aryPlayer[wViewID]->setGameScore(aryCompareResult[i], pCompare->wHandCardType[i], bShowScore); } _cbCurOpenCardAniIndex = 0; ArmatureAnimation* pAniStart = _pArmatureStart->getAnimation(); if (pAniStart != nullptr) { pAniStart->play("GameStart1", -1, 0); _pArmatureStart->setVisible(true); } uint8 cbGender = m_pLocalPlayer->GetGender(); std::string strPath = ""; if (0 == cbGender) { strPath += "man/m_compare"; } else { strPath += "woman/f_compare"; } playEffect(strPath); } //发牌结束; void SSSGameScene::sendSendCardOverMsg() { SendSocketData(SSS_SUB_C_SEND_OVER); } //开牌操作; void SSSGameScene::sendOpenCardMsg() { SSS_CMD_C_OpenCard mOpenCard; memset(&mOpenCard, 0, sizeof(mOpenCard)); memcpy(mOpenCard.cbFrontCard, _aryTricksFrontCard, sizeof(_aryTricksFrontCard)); memcpy(mOpenCard.cbMidCard, _aryTricksMidCard, sizeof(_aryTricksMidCard)); memcpy(mOpenCard.cbBackCard, _aryTricksBackCard, sizeof(_aryTricksBackCard)); SendSocketData(SSS_SUB_C_OPEN_CARD, &mOpenCard, sizeof(SSS_CMD_C_OpenCard)); } //比牌完成; void SSSGameScene::sendCompareOverMsg() { if (m_IsGameRecord) { onSubGameEnd(&m_GameEnd, sizeof(SSS_CMD_S_GameEnd)); } else { SendSocketData(SSS_SUB_C_COMPARE_OVER); } } //显示当前手牌; void SSSGameScene::showCurHandCard(uint8 cbCardCount) { _SendCardPanel->setVisible(true); _SendCardPanel->removeAllChildren(); float fInitX = _SendCardPanel->getContentSize().width; float fTargetX = (SSS_MAX_COUNT == cbCardCount) ? 0.f : 200.f; for (int i = 0; i < cbCardCount; i++) { SSSBigCardSprite* pCardSprite = SSSBigCardSprite::create(_aryHandCardData[i]); pCardSprite->setPositionX(fTargetX); _SendCardPanel->addChild(pCardSprite); fTargetX += 56.f; } } //显示庄家图标; void SSSGameScene::showBankerIcon() { if (INVALID_CHAIR != _wBankerUser) { uint16 wViewID = SwitchViewChairID(_wBankerUser); m_aryPlayer[wViewID]->setBankerVisible(true); } } // 设置状态; void SSSGameScene::setOperateStatus(SSS_OPERATE_STATUS ops) { _sprOtherCallBanker->setVisible(ops == SSS_OS_CALLBANK); _sprOtherAddScore->setVisible(ops == SSS_OS_ADDSCORE0); _sprSelfAddScore->setVisible(ops == SSS_OS_ADDSCORE1); } void SSSGameScene::showOperatePanel(bool bShow) { _OperatePanel->setVisible(bShow); if ( bShow ) { openClock(_imgOperClock, _wBuildCardTime, nullptr); openClock(_imgGameClock, _wBuildCardTime, nullptr); _btnCompare->setVisible(false); _btnReset->setVisible(false); m_GameLogic.SortCardList(_aryHandCardData, SSS_MAX_COUNT); _OperateCardPanel->showHandCard(_aryHandCardData, SSS_MAX_COUNT); _OperateCardPanel->setVisible(true); m_AnalyseType = m_GameLogic.GetType(_aryHandCardData, SSS_HAND_CARD_COUNT); updateCardTypeButtons(); } } //显示特殊牌面板; void SSSGameScene::showSpecialPanel(bool bShow) { _SpecialPanel->setVisible(bShow); if (bShow) { openClock(_imgGameClock, _wBuildCardTime, nullptr); string strImagePath = C13SGameLogic::getCardTypeImagePath(_wSelfSpecialType); if (!strImagePath.empty()) { _sprSpecialType->setTexture(strImagePath); _sprSpecialType->setVisible(true); } else { _sprSpecialType->setVisible(false); } _btnRefuseCards->setVisible(true); _btnCommitSpecial->setVisible(true); } } //点击随便机组牌按钮; void SSSGameScene::onRandomButtonClick(Ref* pSender) { tag13SAnalyseType AnalyseType = m_GameLogic.GetType(_aryHandCardData, SSS_HAND_CARD_COUNT); uint8 aryFrontCard[SSS_MIN_ITEM_COUNT] = {0}; uint8 aryMidCard[SSS_MAX_ITEM_COUNT] = { 0 }; uint8 aryBackCard[SSS_MAX_ITEM_COUNT] = { 0 }; m_GameLogic.TheBestCard(AnalyseType, _aryHandCardData, SSS_HAND_CARD_COUNT, aryFrontCard, aryMidCard, aryBackCard); if (0 == aryFrontCard[0] || 0 == aryMidCard[0] || 0 == aryBackCard[0]) { PopScene::Instance().show(utility::a_u8("未找到合适牌型请手工配牌!")); return; } addTricksCard(0, aryFrontCard, SSS_MIN_ITEM_COUNT); addTricksCard(1, aryMidCard, SSS_MAX_ITEM_COUNT); addTricksCard(2, aryBackCard, SSS_MAX_ITEM_COUNT); _OperateCardPanel->showHandCard(nullptr, 0); disableCardTypeButtons(); onChooseFinished(); } //重置按钮被点击; void SSSGameScene::onResetButtonClick(Ref* pSender) { playBtnClickEffect(); if (_aryTricksFrontCard[0] + _aryTricksMidCard[0] + _aryTricksBackCard[0] == 0) { return; } uint16 wSelfChairID = getSelfChairID(); if (_aryActiveStatus[wSelfChairID] != SSS_HAND_STATUS_NULL) { for (int i = 0; i < SSS_GROUP_COUNT; i++) { _aryTricksCardPanel[i]->removeAllChildren(); _aryButtonRechoose[i]->setEnabled(false); _arySprCardType[i]->setVisible(false); } m_GameLogic.SortCardList(_aryHandCardData, sizeof(_aryHandCardData)); _OperateCardPanel->showHandCard(_aryHandCardData, sizeof(_aryHandCardData)); zeromemory(_aryTricksFrontCard, sizeof(_aryTricksFrontCard)); zeromemory(_aryTricksMidCard, sizeof(_aryTricksMidCard)); zeromemory(_aryTricksBackCard, sizeof(_aryTricksBackCard)); _OperateCardPanel->setVisible(true); m_AnalyseType = m_GameLogic.GetType(_aryHandCardData, sizeof(_aryHandCardData)); updateCardTypeButtons(); } } void SSSGameScene::onCompareButtonClick(Ref* pSender) { playBtnClickEffect(); for (int i = 0; i < SSS_GROUP_COUNT; i++) { if (_aryTricksCardPanel[i]->getChildrenCount() == 0) { PopScene::Instance().show(utility::a_u8("请分配好你的牌序~")); return; } } if (false==checkCardPutRule()) { return; } uint16 wSelfChairID = getSelfChairID(); if (_aryActiveStatus[wSelfChairID] != SSS_HAND_STATUS_NULL) { showOperatePanel(false); sendOpenCardMsg(); } } //邀请按钮被点击; void SSSGameScene::onInviteButtonClick(Ref* pSender) { playBtnClickEffect(); std::string strUTFGameTitle = utility::a_u8(m_strGameTitle); std::string strUrl = GlobalJosn::getInstance()->getShareInfoByKind(SH_KIND_WEIXIN_URL); std::string strUrlInfo = StringUtils::format("%s?param=%d", strUrl.c_str(), m_PrivateRoomInfo.dwRoomNum); std::string strRoomID = StringUtils::format("房间号(%d), ", m_PrivateRoomInfo.dwRoomNum); std::string strShareRule = strRoomID + m_strGameRuleInfo + StringUtils::format("人数: %d/%d", getCurPlayerCount(), SSS_GAME_PLAYER); MissionWeiXin::Instance().shareUrlWeiXin(strUrlInfo, utility::a_u8(m_strGameTitle), utility::a_u8(strShareRule)); //SelectShareScene::Instance().shareRoomInfo(strUrlInfo, strUTFGameTitle, strShareRule, 0); } //重选按钮被点击; void SSSGameScene::onRechooseButtonClick(Ref* pSender) { Button* pBtn = (Button*)pSender; int nIndex = pBtn->getTag(); CC_ASSERT(nIndexgetChildrenCount() == 0) { return; } log("reset----%d", nIndex); _aryTricksCardPanel[nIndex]->removeAllChildren(); uint8 aryCardData[SSS_MAX_COUNT] = { 0 }; uint8 cbCardCount = _OperateCardPanel->getHandCardData(aryCardData, sizeof(aryCardData)); int nItemCount = nIndex > 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT; for (int j = 0; j < nItemCount; j++) { if (0 == nIndex) { aryCardData[cbCardCount++] = _aryTricksFrontCard[j]; _aryTricksFrontCard[j] = 0; } else if (1 == nIndex) { aryCardData[cbCardCount++] = _aryTricksMidCard[j]; _aryTricksMidCard[j] = 0; } else if (2 == nIndex) { aryCardData[cbCardCount++] = _aryTricksBackCard[j]; _aryTricksBackCard[j] = 0; } if (cbCardCount >= SSS_MAX_COUNT) { break; } } m_GameLogic.SortCardList(aryCardData, cbCardCount); _OperateCardPanel->showHandCard(aryCardData, cbCardCount); _OperateCardPanel->setVisible(true); _arySprCardType[nIndex]->setVisible(false); _aryButtonRechoose[nIndex]->setEnabled(false); _arySprCardShadow[nIndex]->setVisible(false); _btnCompare->setVisible(false); _btnReset->setVisible(false); m_AnalyseType = m_GameLogic.GetType(aryCardData, cbCardCount); updateCardTypeButtons(); } //面板触摸事件; void SSSGameScene::onPanelTouchEvent(Ref* pSender, Widget::TouchEventType iEventType) { Layout* panel = (Layout*)pSender; int nIndex = panel->getTag(); CC_ASSERT(nIndexgetChildrenCount() >0) { return; } log("set card data ----%d", nIndex); uint8 aryCardData[SSS_MAX_COUNT] = { 0 }; uint8 cbCardCount = 0; _OperateCardPanel->getShootCardData(aryCardData, cbCardCount, sizeof(aryCardData)); int nItemCount = nIndex > 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT; //bool bRet = checkCardPutRule(); if (cbCardCount == nItemCount) { addTricksCard(nIndex, aryCardData, cbCardCount); zeromemory(aryCardData, sizeof(aryCardData)); cbCardCount = 0; _OperateCardPanel->getDownCardData(aryCardData, cbCardCount, sizeof(aryCardData)); _OperateCardPanel->showHandCard(aryCardData, cbCardCount); m_AnalyseType = m_GameLogic.GetType(aryCardData, cbCardCount); updateCardTypeButtons(); } else { return; } onChooseFinished(); } else if(iEventType == Widget::TouchEventType::ENDED) { uint8 aryCardData[SSS_MAX_COUNT] = { 0 }; uint8 cbCardCount = 0; _OperateCardPanel->getDownCardData(aryCardData, cbCardCount, sizeof(aryCardData)); //当还剩下3张牌时自动被填充到空面板处; if (SSS_MIN_ITEM_COUNT == cbCardCount || SSS_MAX_ITEM_COUNT == cbCardCount) { int nNullIndex = -1; for (int i = 0; i < SSS_GROUP_COUNT; i++) { if (_aryTricksCardPanel[i]->getChildrenCount() == 0) { nNullIndex = i; break; } } //bool bRet = checkCardPutRule(); if (nNullIndex >= 0) { int nItemCount = nNullIndex > 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT; addTricksCard(nNullIndex, aryCardData, nItemCount); //清空手牌面板; _OperateCardPanel->showHandCard(nullptr, 0); disableCardTypeButtons(); onChooseFinished(); } } } } //抢注按钮点击事件; void SSSGameScene::onRobYesButtonClick(Ref* pSender) { SSS_CMD_C_RobBanker mRob; mRob.bRob = true; SendSocketData(SSS_SUB_C_ROB_BANKER, &mRob, sizeof(SSS_CMD_C_RobBanker)); } //抢注按钮点击事件; void SSSGameScene::onRobNoButtonClick(Ref* pSender) { SSS_CMD_C_RobBanker mRob; mRob.bRob = false; SendSocketData(SSS_SUB_C_ROB_BANKER, &mRob, sizeof(SSS_CMD_C_RobBanker)); } //压注按钮点击事件; void SSSGameScene::onYaZhuButtonClick(Ref* pSender) { _YaZhuPanel->setVisible(false); Button* pBtn = (Button*)pSender; int nScore = __min(5, __max(3, pBtn->getTag())); SSS_CMD_C_ChipScore ChipScore = {0}; ChipScore.lScore = nScore; SendSocketData(SSS_SUB_C_CHIP_SCORE, &ChipScore, sizeof(ChipScore)); } //不摆特殊牌按钮点击事件; void SSSGameScene::onRefuseCardsButtonClick(Ref* pSender) { _SendCardPanel->setVisible(false); _SendCardPanel->removeAllChildren(); showSpecialPanel(false); showOperatePanel(true); } //确定特殊牌按钮点击事件; void SSSGameScene::onCommitSpecialButtonClick(Ref* pSender) { _SendCardPanel->setVisible(false); _SendCardPanel->removeAllChildren(); showSpecialPanel(false); SSS_CMD_C_OpenCard mOpenCard; zeromemory(&mOpenCard, sizeof(SSS_CMD_C_OpenCard)); mOpenCard.wSpecialType = _wSelfSpecialType; SendSocketData(SSS_SUB_C_OPEN_CARD, &mOpenCard, sizeof(SSS_CMD_C_OpenCard)); } //一对; void SSSGameScene::onDuiZiButtonClick(Ref* pSender) { uint8 aryShootIndex[2] = {0}; uint8 cbCardCount = 2; for (uint8 i = 0; i < 20; i++) { if (false==m_AnalyseType.bbOnePare[i]) { if (m_AnalyseType.cbOnePare[i * 2] == 0 && m_AnalyseType.cbOnePare[i * 2 + 1] == 0) { zeromemory(m_AnalyseType.bbOnePare, sizeof(m_AnalyseType.bbOnePare)); i = 0; } aryShootIndex[0] = m_AnalyseType.cbOnePare[i * 2]; aryShootIndex[1] = m_AnalyseType.cbOnePare[i * 2 + 1]; _OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount); m_AnalyseType.bbOnePare[i] = true; break; } } } //两对; void SSSGameScene::onLiangDuiButtonClick(Ref* pSender) { uint8 aryShootIndex[4] = { 0 }; uint8 cbCardCount = 4; for (uint8 i = 0; i < 20; i++) { if (false == m_AnalyseType.bbTwoPare[i]) { if (m_AnalyseType.cbTwoPare[i * 4] == 0 && m_AnalyseType.cbTwoPare[i * 4 + 1] == 0) { zeromemory(m_AnalyseType.bbTwoPare, sizeof(m_AnalyseType.bbTwoPare)); i = 0; } aryShootIndex[0] = m_AnalyseType.cbTwoPare[i * 4]; aryShootIndex[1] = m_AnalyseType.cbTwoPare[i * 4 + 1]; aryShootIndex[2] = m_AnalyseType.cbTwoPare[i * 4 + 2]; aryShootIndex[3] = m_AnalyseType.cbTwoPare[i * 4 + 3]; _OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount); m_AnalyseType.bbTwoPare[i] = true; break; } } } //三条; void SSSGameScene::onSanTiaoButtonClick(Ref* pSender) { uint8 aryShootIndex[3] = { 0 }; uint8 cbCardCount = 3; for (uint8 i = 0; i < 20; i++) { if (false == m_AnalyseType.bbThreeSame[i]) { if (m_AnalyseType.cbThreeSame[i * 3] == 0 && m_AnalyseType.cbThreeSame[i * 3 + 1] == 0) { zeromemory(m_AnalyseType.bbThreeSame, sizeof(m_AnalyseType.bbThreeSame)); i = 0; } aryShootIndex[0] = m_AnalyseType.cbThreeSame[i * 3]; aryShootIndex[1] = m_AnalyseType.cbThreeSame[i * 3 + 1]; aryShootIndex[2] = m_AnalyseType.cbThreeSame[i * 3 + 2]; _OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount); m_AnalyseType.bbThreeSame[i] = true; break; } } } //顺子; void SSSGameScene::onShunZiButtonClick(Ref* pSender) { uint8 aryShootIndex[5] = { 0 }; uint8 cbCardCount = 5; for (uint8 i = 0; i < 20; i++) { if (false == m_AnalyseType.bbStraight[i]) { if (m_AnalyseType.cbStraight[i * 5] == 0 && m_AnalyseType.cbStraight[i * 5 + 1] == 0) { zeromemory(m_AnalyseType.bbStraight, sizeof(m_AnalyseType.bbStraight)); i = 0; } aryShootIndex[0] = m_AnalyseType.cbStraight[i * 5]; aryShootIndex[1] = m_AnalyseType.cbStraight[i * 5 + 1]; aryShootIndex[2] = m_AnalyseType.cbStraight[i * 5 + 2]; aryShootIndex[3] = m_AnalyseType.cbStraight[i * 5 + 3]; aryShootIndex[4] = m_AnalyseType.cbStraight[i * 5 + 4]; _OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount); m_AnalyseType.bbStraight[i] = true; break; } } } //同花; void SSSGameScene::onTongHuaButtonClick(Ref* pSender) { uint8 aryShootIndex[5] = { 0 }; uint8 cbCardCount = 5; for (uint8 i = 0; i < 20; i++) { if (false == m_AnalyseType.bbFlush[i]) { if (m_AnalyseType.cbFlush[i * 5] == 0 && m_AnalyseType.cbFlush[i * 5 + 1] == 0) { zeromemory(m_AnalyseType.bbFlush, sizeof(m_AnalyseType.bbFlush)); i = 0; } aryShootIndex[0] = m_AnalyseType.cbFlush[i * 5]; aryShootIndex[1] = m_AnalyseType.cbFlush[i * 5 + 1]; aryShootIndex[2] = m_AnalyseType.cbFlush[i * 5 + 2]; aryShootIndex[3] = m_AnalyseType.cbFlush[i * 5 + 3]; aryShootIndex[4] = m_AnalyseType.cbFlush[i * 5 + 4]; _OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount); m_AnalyseType.bbFlush[i] = true; break; } } } //葫芦; void SSSGameScene::onHuLuButtonClick(Ref* pSender) { uint8 aryShootIndex[5] = { 0 }; uint8 cbCardCount = 5; for (uint8 i = 0; i < 20; i++) { if (false == m_AnalyseType.bbGourd[i]) { if (m_AnalyseType.cbGourd[i * 5] == 0 && m_AnalyseType.cbGourd[i * 5 + 1] == 0) { zeromemory(m_AnalyseType.bbGourd, sizeof(m_AnalyseType.bbGourd)); i = 0; } aryShootIndex[0] = m_AnalyseType.cbGourd[i * 5]; aryShootIndex[1] = m_AnalyseType.cbGourd[i * 5 + 1]; aryShootIndex[2] = m_AnalyseType.cbGourd[i * 5 + 2]; aryShootIndex[3] = m_AnalyseType.cbGourd[i * 5 + 3]; aryShootIndex[4] = m_AnalyseType.cbGourd[i * 5 + 4]; _OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount); m_AnalyseType.bbGourd[i] = true; break; } } } //铁支; void SSSGameScene::onTieZhiButtonClick(Ref* pSender) { uint8 aryShootIndex[4] = { 0 }; uint8 cbCardCount = 4; for (uint8 i = 0; i < 20; i++) { if (false == m_AnalyseType.bbFourSame[i]) { if (m_AnalyseType.cbFourSame[i * 4] == 0 && m_AnalyseType.cbFourSame[i * 4 + 1] == 0) { zeromemory(m_AnalyseType.bbFourSame, sizeof(m_AnalyseType.bbFourSame)); i = 0; } aryShootIndex[0] = m_AnalyseType.cbFourSame[i * 4]; aryShootIndex[1] = m_AnalyseType.cbFourSame[i * 4 + 1]; aryShootIndex[2] = m_AnalyseType.cbFourSame[i * 4 + 2]; aryShootIndex[3] = m_AnalyseType.cbFourSame[i * 4 + 3]; _OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount); m_AnalyseType.bbFourSame[i] = true; break; } } } //同花顺; void SSSGameScene::onTongHuaShunButtonClick(Ref* pSender) { uint8 aryShootIndex[5] = { 0 }; uint8 cbCardCount = 5; for (uint8 i = 0; i < 20; i++) { if (false == m_AnalyseType.bbStraightFlush[i]) { if (m_AnalyseType.cbStraightFlush[i * 5] == 0 && m_AnalyseType.cbStraightFlush[i * 5 + 1] == 0) { zeromemory(m_AnalyseType.bbStraightFlush, sizeof(m_AnalyseType.bbStraightFlush)); i = 0; } aryShootIndex[0] = m_AnalyseType.cbStraightFlush[i * 5]; aryShootIndex[1] = m_AnalyseType.cbStraightFlush[i * 5 + 1]; aryShootIndex[2] = m_AnalyseType.cbStraightFlush[i * 5 + 2]; aryShootIndex[3] = m_AnalyseType.cbStraightFlush[i * 5 + 3]; aryShootIndex[4] = m_AnalyseType.cbStraightFlush[i * 5 + 4]; _OperateCardPanel->shootCardIndex(aryShootIndex, cbCardCount); m_AnalyseType.bbStraightFlush[i] = true; break; } } } // 开始发牌; void SSSGameScene::startSendCardAni() { _SendCardPanel->setVisible(true); _SendCardPanel->removeAllChildren(); float fActionTime = 0.12f; float fInitX = _SendCardPanel->getContentSize().width; float fTargetX = (SSS_MAX_COUNT==_cbSendCardCount) ? 0.f : 200.f; float fDelaySendTime = 0.01f; for (int i = 0; i < _cbSendCardCount; i++) { SSSBigCardSprite* pCardSprite = SSSBigCardSprite::create(_aryHandCardData[i]); pCardSprite->setPositionX(fInitX); pCardSprite->setPositionY(30.f); pCardSprite->setScale(0.5f); _SendCardPanel->addChild(pCardSprite); auto pAction = Spawn::create(MoveTo::create(fActionTime, Vec2(fTargetX, 0.f)), ScaleTo::create(fActionTime, 1.0f), nullptr); pCardSprite->runAction(Sequence::create(DelayTime::create(fDelaySendTime), pAction, nullptr)); fTargetX += 56.f; fDelaySendTime += 0.05f; } playSendCardEffect(); auto callback = [=]() { if ((m_PrivateRoomInfo.bGameRuleIdex&eSSSGameRuleClassic)>0) { uint8 aryFrontCard[SSS_MIN_ITEM_COUNT] = { 0 }; uint8 aryMidCard[SSS_MAX_ITEM_COUNT] = { 0 }; uint8 aryBackCard[SSS_MAX_ITEM_COUNT] = { 0 }; for (int i = 0; i < SSS_GAME_PLAYER; i++) { if (SSS_HAND_STATUS_NULL == _aryActiveStatus[i]) { continue; } uint16 wViewID = SwitchViewChairID(i); m_aryPlayer[wViewID]->showCard(aryFrontCard, aryMidCard, aryBackCard, SSS_HAND_STATUS_DISORDER, true); } } sendSendCardOverMsg(); }; _SendCardPanel->runAction(Sequence::create(DelayTime::create(fActionTime + fDelaySendTime), CallFunc::create(callback), nullptr)); } // 开始比牌; void SSSGameScene::startCompareCardAni() { uint8 cbGamePlayerCount = 0; uint8 cbSpecialTypeCount = 0; for (uint16 i = 0; i < SSS_GAME_PLAYER; i++) { if (SSS_HAND_STATUS_NULL == _aryActiveStatus[i]) { continue; } cbGamePlayerCount++; if (SSS_CT_INVALID != _arySpecialType[i]) { cbSpecialTypeCount++; } } if (cbGamePlayerCount != cbSpecialTypeCount) { oneGroupFinished(); } else { checkSpecialTypeAni(); } } // 动画回调; void SSSGameScene::movementEventCallFunc(cocostudio::Armature *armature, cocostudio::MovementEventType movementType, const std::string& movementID) { // 播放完成; if (movementType == cocostudio::COMPLETE) { if ("GameStart2" == movementID) { // 发牌动画; startSendCardAni(); _pArmatureStart->setVisible(false); } else if ("GameStart1" == movementID) { startCompareCardAni(); _pArmatureStart->setVisible(false); } else if ("KillAlleffect" == movementID) { _pArmaAllKillEffect->setVisible(false); killAllAniFinished(); } } } void SSSGameScene::addTricksCard(int nIndex, uint8 aryCardData[SSS_MAX_ITEM_COUNT], uint8 cbCardCount) { CC_ASSERT(nIndex 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT; uint8 cbTmpCardData[SSS_MAX_ITEM_COUNT] = { 0 }; if (false==cardTypeTo32A(aryCardData, nItemCount, cbTmpCardData, nItemCount)) { memcpy(cbTmpCardData, aryCardData, cbCardCount); } uint8* pTrickCard = nullptr; if (0 == nIndex) { memcpy(_aryTricksFrontCard, cbTmpCardData, SSS_MIN_ITEM_COUNT*sizeof(uint8)); pTrickCard = _aryTricksFrontCard; } else if (1 == nIndex) { memcpy(_aryTricksMidCard, cbTmpCardData, SSS_MAX_ITEM_COUNT*sizeof(uint8)); pTrickCard = _aryTricksMidCard; } else if (2 == nIndex) { memcpy(_aryTricksBackCard, cbTmpCardData, SSS_MAX_ITEM_COUNT*sizeof(uint8)); pTrickCard = _aryTricksBackCard; } _aryTricksCardPanel[nIndex]->removeAllChildren(); int iHandCardSpace = 0; for (int i = 0; igetContentSize(); iHandCardSpace = (cardSize.width - pCardSprite->getContentSize().width) / (nItemCount - 1); } pCardSprite->setPosition(i * iHandCardSpace, 0); _aryTricksCardPanel[nIndex]->addChild(pCardSprite); } uint8 cbCardType = m_GameLogic.GetCardType(aryCardData, nItemCount, m_GameLogic.btCardSpecialData); if (cbCardType>0) { std::string strPath = C13SGameLogic::getCardTypeImagePath(cbCardType); if (strPath.size()>0) { _arySprCardType[nIndex]->setTexture(strPath); _arySprCardType[nIndex]->setVisible(true); } else { _arySprCardType[nIndex]->setVisible(false); } } _aryButtonRechoose[nIndex]->setEnabled(true); if (nIndex < 1) { _arySprCardShadow[0]->setVisible(false); } else { _arySprCardShadow[1]->setVisible(false); _arySprCardShadow[2]->setVisible(false); } } bool SSSGameScene::inTricksCardPanel(int nIndex, uint8 cbCardData) { CC_ASSERT(nIndex 0 ? SSS_MAX_ITEM_COUNT : SSS_MIN_ITEM_COUNT; uint8* pTrickCard = nullptr; if (0 == nIndex) { pTrickCard = _aryTricksFrontCard; } else if (1 == nIndex) { pTrickCard = _aryTricksMidCard; } else if (2 == nIndex) { pTrickCard = _aryTricksBackCard; } else { return false; } for (int i = 0; i < nItemCount; i++) { if (pTrickCard[i] == cbCardData) { return true; } } return false; } void SSSGameScene::onChooseFinished() { int nTricksCount = 0; for (int n = 0; n < SSS_GROUP_COUNT; n++) { nTricksCount += _aryTricksCardPanel[n]->getChildrenCount(); } if (nTricksCount == SSS_MAX_COUNT) { _btnCompare->setVisible(true); _OperateCardPanel->setVisible(false); _btnReset->setVisible(true); } } void SSSGameScene::oneGroupFinished() { if (_cbCurOpenCardAniIndex >= 3) { m_GameOverAni->showAnimation(CC_CALLBACK_1(SSSGameScene::oneShootFinished, this)); } else { bool bSetCallback = false; for (uint16 i = 0; i < SSS_GAME_PLAYER; i++) { if ((_aryActiveStatus[i] != SSS_HAND_STATUS_NULL)&&(SSS_CT_INVALID==_arySpecialType[i])) { uint16 wViewID = SwitchViewChairID(i); bool bPlaySubScore = (i != _wBankerUser); if (false==bSetCallback) { m_aryPlayer[wViewID]->playScoreAni(_cbCurOpenCardAniIndex, CC_CALLBACK_0(SSSGameScene::oneGroupFinished, this), true, bPlaySubScore); bSetCallback = true; } else { m_aryPlayer[wViewID]->playScoreAni(_cbCurOpenCardAniIndex, nullptr, false, (i != _wBankerUser)); } } } _cbCurOpenCardAniIndex++; } } void SSSGameScene::oneShootFinished(tagSSSTwoGunInfos* pGunInfos) { if (nullptr==pGunInfos) { checkSpecialTypeAni(); } else { uint16 wLoserViewID = pGunInfos->pLoserInfo->wViewID; m_aryPlayer[wLoserViewID]->playSubScoreAni(1, pGunInfos->pLoserInfo->nScore); uint16 wWinnerViewID = pGunInfos->pWinnerInfo->wViewID; m_aryPlayer[wWinnerViewID]->playSubScoreAni(1, pGunInfos->pWinnerInfo->nScore, CC_CALLBACK_0(SSSGameScene::shootScoreAniFinished, this)); } } //打枪加分动画结束; void SSSGameScene::shootScoreAniFinished() { tagSSSTwoGunInfos* pTmpGunInfo = m_GameOverAni->getNoPlayInfo(); if (nullptr == pTmpGunInfo) { checkSpecialTypeAni(); } else { m_GameOverAni->showAnimation(CC_CALLBACK_1(SSSGameScene::oneShootFinished, this)); } } void SSSGameScene::checkSpecialTypeAni() { uint8 cbSpecialTypeCount = 0; for (uint16 i = 0; i < SSS_GAME_PLAYER; i++) { if (SSS_HAND_STATUS_NULL == _aryActiveStatus[i]) { continue; } if (SSS_CT_INVALID != _arySpecialType[i]) { cbSpecialTypeCount++; } } if (cbSpecialTypeCount>0) { for (uint16 i = 0; i < SSS_GAME_PLAYER; i++) { if (SSS_HAND_STATUS_NULL == _aryActiveStatus[i]) { continue; } uint16 wViewID = SwitchViewChairID(i); if (SSS_VIEW_SELF_ID == wViewID) { m_aryPlayer[wViewID]->playSubScoreAni(1, _arySpecialCompareResult[i], CC_CALLBACK_0(SSSGameScene::specialTypeAniFinished, this)); } else { m_aryPlayer[wViewID]->playSubScoreAni(1, _arySpecialCompareResult[i]); } if (_arySpecialType[i] != SSS_CT_INVALID) { m_aryPlayer[wViewID]->showSepShadow(false); m_aryPlayer[wViewID]->showCardType(_arySpecialType[i]); playSpecialTypeEffect(m_aryPlayer[wViewID]->GetGender(), _arySpecialType[i]); } } } else { sendCompareOverMsg(); } } //特殊牌动画播放完成; void SSSGameScene::specialTypeAniFinished() { checkKillAllAni(); } void SSSGameScene::checkKillAllAni() { if (INVALID_CHAIR==_wKillAllUserChairID) { sendCompareOverMsg(); } else { ArmatureAnimation* pAniKillAll = _pArmaAllKillEffect->getAnimation(); if (pAniKillAll != nullptr) { pAniKillAll->play("KillAlleffect", -1, 0); _pArmaAllKillEffect->setVisible(true); } } } //全垒打动画播放完成; void SSSGameScene::killAllAniFinished() { for (uint16 i = 0; i < SSS_GAME_PLAYER; i++) { if (SSS_HAND_STATUS_NULL == _aryActiveStatus[i]) { continue; } uint16 wViewID = SwitchViewChairID(i); if (SSS_VIEW_LEFT_ID == wViewID) { m_aryPlayer[wViewID]->playSubScoreAni(1, _aryThreeKillResult[i], CC_CALLBACK_0(SSSGameScene::sendCompareOverMsg, this)); } else { m_aryPlayer[wViewID]->playSubScoreAni(1, _aryThreeKillResult[i]); } } } //更新牌类型按钮状态; void SSSGameScene::updateCardTypeButtons() { _btnDuiZi->setEnabled(m_AnalyseType.bOnePare); _btnLiangDui->setEnabled(m_AnalyseType.bTwoPare); _btnSanTiao->setEnabled(m_AnalyseType.bThreeSame); _btnShunZi->setEnabled(m_AnalyseType.bStraight); _btnTongHua->setEnabled(m_AnalyseType.bFlush); _btnHuLu->setEnabled(m_AnalyseType.bGourd); _btnTieZhi->setEnabled(m_AnalyseType.bFourSame); _btnTongHuaShun->setEnabled(m_AnalyseType.bStraightFlush); } //禁用牌类型按钮状态; void SSSGameScene::disableCardTypeButtons() { _btnDuiZi->setEnabled(false); _btnLiangDui->setEnabled(false); _btnSanTiao->setEnabled(false); _btnShunZi->setEnabled(false); _btnTongHua->setEnabled(false); _btnHuLu->setEnabled(false); _btnTieZhi->setEnabled(false); _btnTongHuaShun->setEnabled(false); } //游戏结束; void SSSGameScene::onSubGameEnd(const void * pBuffer, uint16 wDataSize) { //校验数据; CC_ASSERT(wDataSize == sizeof(SSS_CMD_S_GameEnd)); SSS_CMD_S_GameEnd* pGameEnd = (SSS_CMD_S_GameEnd*)pBuffer; _txtTip->setString(""); uint16 wSelfChairID = getSelfChairID(); SCORE lMyResultScore = pGameEnd->lGameScore[wSelfChairID]; if (false==m_IsGameRecord) { if (pGameEnd->isPrivateEnd) { _btnReady->setVisible(false); _btnPrivateEnd->setVisible(true); } else { _btnReady->setVisible(true); _btnPrivateEnd->setVisible(false); } } else { _btnReady->setVisible(false); _btnPrivateEnd->setVisible(false); } _ResultPanel->setVisible(true); ArmatureAnimation* pAniResult = _pArmatureResult->getAnimation(); if (pAniResult != nullptr) { if (lMyResultScore > 0) { pAniResult->play("Win", -1, 0); playEffect("Win"); } else if (lMyResultScore < 0) { pAniResult->play("Lose", -1, 0); playEffect("Loss"); } else { pAniResult->play("Draw", -1, 0); } _pArmatureResult->setVisible(true); } for (int i = 0; i < SSS_GAME_PLAYER; i++) { if (_aryActiveStatus[i] != SSS_HAND_STATUS_NULL) { uint16 wViewID = SwitchViewChairID(i); SCORE lTotalScore = pGameEnd->lGameScore[i]; playResultScoreAni(wViewID, lTotalScore, 0); } } } //用户进入; void SSSGameScene::OnEventUserEnter(GamePlayer * pPlayer) { if (pPlayer->GetChairID() == getSelfChairID()) { //更新准备按钮状态; uint8 cbUserStatus = pPlayer->GetUserStatus(); if (cbUserStatus >= US_READY || _cbGameStatus>SSS_GS_WK_FREE) { _btnStartGame->setEnabled(false); //_ResultPanel->setVisible(false); } else { //_btnStartGame->setVisible(true); } } } //玩家状态改变; void SSSGameScene::OnEventUserStatus(GamePlayer * pPlayer) { OnEventUserEnter(pPlayer); } //选牌回调; void SSSGameScene::selectCardCallback(uint8* arySelCardData, uint8 cbSelCardCount) { uint8 aryShootCardData[SSS_MAX_COUNT] = { 0 }; uint8 cbShootCardCount = 0; _OperateCardPanel->getShootCardData(aryShootCardData, cbShootCardCount, SSS_MAX_COUNT); if (3==cbShootCardCount) { if (0==_aryTricksCardPanel[0]->getChildrenCount()) { _arySprCardShadow[0]->setVisible(true); } } else if (5 == cbShootCardCount) { for (uint8 i = 1; i < SSS_GROUP_COUNT; i++) { if (0 == _aryTricksCardPanel[i]->getChildrenCount()) { _arySprCardShadow[i]->setVisible(true); } } } else { for (uint8 i = 0; i < SSS_GROUP_COUNT; i++) { _arySprCardShadow[i]->setVisible(false); } } } // 播放结束积分动画; void SSSGameScene::playResultScoreAni(int nIndex, SCORE lScore, SCORE lXinScore) { CC_ASSERT(nIndex < SSS_GAME_PLAYER); auto pAction1 = ScaleTo::create(0.15f, 0.8f); auto pAction2 = ScaleTo::create(0.18f, 1.5f); auto pAction3 = ScaleTo::create(0.12f, 1.2f); TextAtlas* txtResult = _pTxtResultScore[nIndex]; //TextAtlas* txtXin = _pTxtXinScore[nIndex]; //if (0 != lXinScore) //{ // txtXin->setVisible(true); // txtXin->setScale(0); // if (lXinScore >= 0) // { // txtXin->setString(StringUtils::format(".%d", lXinScore)); // } // else // { // txtXin->setString(StringUtils::format("/%d", std::abs(lXinScore))); // } // txtXin->runAction(Sequence::create(pAction1->clone(), pAction2->clone(), pAction3->clone(), nullptr)); //} //else //{ // txtXin->setVisible(false); //} if (0 != lScore) { txtResult->setVisible(true); txtResult->setScale(0); if (lScore >= 0) { txtResult->setProperty(StringUtils::format("/%d", lScore), "Games/13S/Table/imgPositiveFont.png", 26, 35, "/"); } else { txtResult->setProperty(StringUtils::format("/%d", std::abs(lScore)), "Games/13S/Table/imgNegativeFont.png", 26, 35, "/"); } txtResult->runAction(Sequence::create(pAction1, pAction2, pAction3, nullptr)); } else { txtResult->setVisible(false); } } void SSSGameScene::showAllPlayersCard() { for (int i = 0; ishowCard(_aryFrontCard[i], _aryMidCard[i], _aryBackCard[i], _aryActiveStatus[i], true); } } } void SSSGameScene::openClock(Sprite* sprClock, int iLeftTime, const std::function& callFunc/* = nullptr*/) { sprClock->setVisible(true); sprClock->stopAllActions(); TextAtlas* txtClockNum = static_cast(sprClock->getChildByName("txtClockNum")); txtClockNum->setString(StringUtils::format("%02d", iLeftTime)); txtClockNum->setTag(iLeftTime); auto callback = [=]() { int iTime = __max(txtClockNum->getTag(), 0); txtClockNum->setString(StringUtils::format("%02d", iTime--)); txtClockNum->setTag(iTime); if (iTime == 3) { sprClock->runAction(RepeatForever::create(JumpBy::create(0.9f, Vec2(0, 0), 20, 3))); } if (iTime == 0) { //sprClock->stopAllActions(); if (callFunc != nullptr) { callFunc(); } } }; sprClock->runAction(RepeatForever::create(Sequence::create(DelayTime::create(1.0f), CallFunc::create(callback), nullptr))); } void SSSGameScene::closeClock(Sprite* sprClock) { sprClock->stopAllActions(); sprClock->setVisible(false); } //玩家金币改变; void SSSGameScene::OnUserScore(GamePlayer* pPlayer) { CC_ASSERT(pPlayer!=nullptr); if (pPlayer == nullptr) return; // 不再桌子上; CC_ASSERT(pPlayer->GetTableID() != INVALID_TABLE && pPlayer->GetChairID() != INVALID_CHAIR); if (pPlayer->GetTableID() == INVALID_TABLE || pPlayer->GetChairID() == INVALID_CHAIR) return; // 不是同一桌子玩家; CC_ASSERT(pPlayer->GetTableID() == getSelfGamePlayer()->GetTableID()); if (pPlayer->GetTableID() != getSelfGamePlayer()->GetTableID()) return; cocos2d::log(a_u8c("用户%s,score = %d"), pPlayer->GetNickName().c_str(), pPlayer->GetUserScore()); ((SSS_GamePlayer*)pPlayer)->updateScore(); } // 玩家坐标; Vec2 SSSGameScene::GetPlayerPosByUserID(uint32 dwUserID) { SSS_GamePlayer* pPlayer = (SSS_GamePlayer*)getPlayerByUserID(dwUserID); if (pPlayer == nullptr) { return Vec2(); } //const Vec2& ptHeadPos = pPlayer->getHeadPos(); //Vec2 ptWorldPos = pPlayer->convertToWorldSpace(ptHeadPos); return pPlayer->getHeadPos(); } //调用; GamePlayer* SSSGameScene::CreatePlayer(IClientUserItem * pIClientUserItem) { if (pIClientUserItem->GetChairID() == INVALID_CHAIR) { return NULL; } if (pIClientUserItem->GetUserID() == UserInfo::Instance().getUserID()) { m_pLocalPlayer->setUserItem(pIClientUserItem); return m_pLocalPlayer; } else { WORD wViewID = SwitchViewChairID(pIClientUserItem->GetChairID()); CC_ASSERT(wViewID!=INVALID_CHAIR); SSS_GamePlayer* pPlayer = m_aryPlayer[wViewID]; pPlayer->setUserItem(pIClientUserItem); return pPlayer; } return NULL; } //椅子号视图转换; WORD SSSGameScene::SwitchViewChairID(WORD wChairID) { //参数判断; if (wChairID == INVALID_CHAIR) return INVALID_CHAIR; WORD wSelfChairID = getSelfChairID(); if (wSelfChairID == INVALID_CHAIR) return INVALID_CHAIR; //转换椅子; WORD wChairCount = SSS_GAME_PLAYER; WORD wViewChairID = (wChairID + wChairCount - wSelfChairID + SSS_VIEW_SELF_ID) % wChairCount; return wViewChairID; } //本人进入游戏 GameFrameBase.cpp调用; void SSSGameScene::upSelfPlayerInfo() { log("Self Enter!!"); return; } //牌型A32转32A; bool SSSGameScene::cardTypeTo32A(const uint8 arySrcCardData[SSS_MIN_ITEM_COUNT], const uint8 cbCardCount, uint8* aryTargetCardData, const uint8 cbTargetCardCount) { CC_ASSERT(cbCardCount >= SSS_MIN_ITEM_COUNT && cbCardCount == cbTargetCardCount); if (cbCardCountgetChildrenCount()>0 && _aryTricksCardPanel[1]->getChildrenCount() > 0) { // 首道比中道; uint8 cbResult = m_GameLogic.CompareCard(_aryTricksFrontCard, _aryTricksMidCard, SSS_MIN_ITEM_COUNT, SSS_MAX_ITEM_COUNT, m_bClassicRule); if (0 == cbResult) { bShowTip = true; _aryTricksCardPanel[0]->removeAllChildren(); _aryTricksCardPanel[1]->removeAllChildren(); uint8 aryCardData[SSS_MAX_COUNT] = { 0 }; uint8 cbCardCount = _OperateCardPanel->getHandCardData(aryCardData, sizeof(aryCardData)); if ((cbCardCount + SSS_MIN_ITEM_COUNT) <= SSS_MAX_COUNT) { memcpy(&aryCardData[cbCardCount], _aryTricksFrontCard, SSS_MIN_ITEM_COUNT); memset(_aryTricksFrontCard, 0, sizeof(_aryTricksFrontCard)); cbCardCount += SSS_MIN_ITEM_COUNT; } if ((cbCardCount + SSS_MAX_ITEM_COUNT) <= SSS_MAX_COUNT) { memcpy(&aryCardData[cbCardCount], _aryTricksMidCard, SSS_MAX_ITEM_COUNT); memset(_aryTricksMidCard, 0, sizeof(_aryTricksMidCard)); cbCardCount += SSS_MAX_ITEM_COUNT; } m_GameLogic.SortCardList(aryCardData, cbCardCount); _OperateCardPanel->showHandCard(aryCardData, cbCardCount); _OperateCardPanel->setVisible(true); _arySprCardType[0]->setVisible(false); _arySprCardType[1]->setVisible(false); _aryButtonRechoose[0]->setEnabled(false); _aryButtonRechoose[1]->setEnabled(false); _arySprCardShadow[0]->setVisible(false); _arySprCardShadow[1]->setVisible(false); _btnCompare->setVisible(false); _btnReset->setVisible(false); m_AnalyseType = m_GameLogic.GetType(aryCardData, cbCardCount); updateCardTypeButtons(); break; } } if (_aryTricksCardPanel[1]->getChildrenCount() > 0 && _aryTricksCardPanel[2]->getChildrenCount() > 0) { // 中道比尾道; uint8 cbResult = m_GameLogic.CompareCard(_aryTricksMidCard, _aryTricksBackCard, SSS_MAX_ITEM_COUNT, SSS_MAX_ITEM_COUNT, m_bClassicRule); if (0 == cbResult) { bShowTip = true; _aryTricksCardPanel[1]->removeAllChildren(); _aryTricksCardPanel[2]->removeAllChildren(); uint8 aryCardData[SSS_MAX_COUNT] = { 0 }; uint8 cbCardCount = _OperateCardPanel->getHandCardData(aryCardData, sizeof(aryCardData)); if ((cbCardCount + SSS_MAX_ITEM_COUNT) <= SSS_MAX_COUNT) { memcpy(&aryCardData[cbCardCount], _aryTricksMidCard, SSS_MAX_ITEM_COUNT); memset(_aryTricksMidCard, 0, sizeof(_aryTricksMidCard)); cbCardCount += SSS_MAX_ITEM_COUNT; } if ((cbCardCount + SSS_MAX_ITEM_COUNT) <= SSS_MAX_COUNT) { memcpy(&aryCardData[cbCardCount], _aryTricksBackCard, SSS_MAX_ITEM_COUNT); memset(_aryTricksBackCard, 0, sizeof(_aryTricksBackCard)); cbCardCount += SSS_MAX_ITEM_COUNT; } m_GameLogic.SortCardList(aryCardData, cbCardCount); _OperateCardPanel->showHandCard(aryCardData, cbCardCount); _OperateCardPanel->setVisible(true); _arySprCardType[1]->setVisible(false); _arySprCardType[2]->setVisible(false); _aryButtonRechoose[1]->setEnabled(false); _aryButtonRechoose[2]->setEnabled(false); _arySprCardShadow[1]->setVisible(false); _arySprCardShadow[2]->setVisible(false); _btnCompare->setVisible(false); _btnReset->setVisible(false); m_AnalyseType = m_GameLogic.GetType(aryCardData, cbCardCount); updateCardTypeButtons(); break; } } } while (false); if (bShowTip) { // 缩放提示; _imgQualifiedTips->setScale(0.5f); auto actSeq = Sequence::create(Show::create(), EaseElasticOut::create(ScaleTo::create(0.5f, 1.0f)), DelayTime::create(2.0f), Hide::create(), nullptr); _imgQualifiedTips->runAction(actSeq); return false; } return true; } // 获取当前玩家数量; uint8 SSSGameScene::getCurPlayerCount() { uint8 cbPlayerCount = 0; for (int i = 0; i < SSS_GAME_PLAYER; i++) { GamePlayer* pPlayer = m_aryPlayer[i]; if (pPlayer != nullptr && pPlayer->getUserItem(false) != nullptr) { cbPlayerCount++; } } return cbPlayerCount; } /************************************* 语音 ***********************************************************/ // 按住语音按钮; void SSSGameScene::OnButtonVoiceTouched(Ref*, Widget::TouchEventType type) { if (Widget::TouchEventType::BEGAN == type) { // 暂停播放背景音乐; CocosDenshion::SimpleAudioEngine::getInstance()->pauseBackgroundMusic(); if (m_pVoiceNode->isVisible()) { m_pVoiceNode->setVisible(false); m_pVoiceNode->stopAllActions(); YvVoiceManager::GetInstance()->StopRecord(); return; } m_pVoiceNode->setVisible(true); // 启动帧动画; auto action = CSLoader::createTimeline("Games/13S/VoiceNode.csb"); action->gotoFrameAndPlay(0); m_pVoiceNode->runAction(action); YvVoiceManager::GetInstance()->StartRecord(); } else if ((Widget::TouchEventType::CANCELED == type) || (Widget::TouchEventType::ENDED == type)) { // 继续播放背景音乐; CocosDenshion::SimpleAudioEngine::getInstance()->resumeBackgroundMusic(); if (!m_pVoiceNode->isVisible()) { return; } m_pVoiceNode->setVisible(false); m_pVoiceNode->stopAllActions(); YvVoiceManager::GetInstance()->StopRecord(); } } //获到性别字符串; std::string SSSGameScene::getUserGender(int cbGender) { if (cbGender == 0) { return "man"; } return "woman"; } //播放发牌声音; void SSSGameScene::playSendCardEffect() { CocosDenshion::SimpleAudioEngine* pAudio = CocosDenshion::SimpleAudioEngine::getInstance(); pAudio->playEffect("Games/13S/Sound/deal.mp3"); } // 播放特殊牌型声音; void SSSGameScene::playSpecialTypeEffect(uint8 cbGender, uint8 cbCardType) { CocosDenshion::SimpleAudioEngine* pAudio = CocosDenshion::SimpleAudioEngine::getInstance(); std::string strCardTypePath = C13SGameLogic::getCardTypeSoundPath(cbGender, cbCardType); log("the strAudioRes is== %s", strCardTypePath.c_str()); pAudio->playEffect(strCardTypePath.c_str()); } //播放快捷语音; void SSSGameScene::playFastVoice(int cbGender, int voiceIndex) { CocosDenshion::SimpleAudioEngine* pAudio = CocosDenshion::SimpleAudioEngine::getInstance(); std::string strGender = getUserGender(cbGender); std::string strAudioRes = StringUtils::format("Games/13S/Sound/FastVoice/%s/%d.mp3", strGender.c_str(), voiceIndex); log("the strAudioRes is== %s", strAudioRes.c_str()); pAudio->playEffect(strAudioRes.c_str()); } //播放音效; void SSSGameScene::playEffect(std::string strPath) { CocosDenshion::SimpleAudioEngine* pAudio = CocosDenshion::SimpleAudioEngine::getInstance(); std::string strAudioRes = StringUtils::format("Games/13S/Sound/%s.mp3", strPath.c_str()); pAudio->playEffect(strAudioRes.c_str()); } //播放点击音效; void SSSGameScene::playBtnClickEffect() { CocosDenshion::SimpleAudioEngine* pAudio = CocosDenshion::SimpleAudioEngine::getInstance(); pAudio->playEffect("Games/13S/Sound/button_click.mp3"); } /************************************* 房间信息 ***********************************************************/ // 房间信息消息; void SSSGameScene::OnSocketSubPrivateRoomInfo(CMD_GF_Private_Room_Info* pNetInfo) { m_PrivateRoomInfo = *pNetInfo; m_dwRoomID = pNetInfo->dwRoomNum; string strRoomID = StringUtils::format("%d", m_dwRoomID); _txtRoomID->setString(strRoomID); _txtRoomID->setVisible(true); uint32 dwPlayCout = __max(pNetInfo->dwPlayCout+1, 1); dwPlayCout = __min(dwPlayCout, pNetInfo->dwPlayTotal); m_dwPlayCout = dwPlayCout; string strPlayCount = StringUtils::format("%u/%u", dwPlayCout, pNetInfo->dwPlayTotal); cocos2d::log("dwPlayCout = %d", pNetInfo->dwPlayCout); _txtJushu->setString(utility::a_u8(strPlayCount)); _txtJushu->setVisible(true); ShowGameRule(pNetInfo); DWORD dwGameRule = m_PrivateRoomInfo.bGameRuleIdex; m_bClassicRule = (dwGameRule & eSSSGameRuleClassic) > 0; m_GameLogic.setClassicRule(m_bClassicRule); SSS_GamePlayer* pPlayer = (SSS_GamePlayer*)getPlayerByUserID(pNetInfo->dwCreateUserID); if (pPlayer != nullptr) { pPlayer->setOwner(true); } if (pNetInfo->bStartGame) { //如果游戏已开始则隐藏“返回大厅”按钮,显示“解散房间”按钮; _btnInvite->setVisible(false); _btnStartGame->setVisible(false); _btnDismiss->setVisible(true); _btnLeave->setVisible(false); //私人场已经开始,重连上游戏自带发送准备消息; GamePlayer* pSelfPlayer = getSelfGamePlayer(); if (!_ResultPanel->isVisible() && (pSelfPlayer != nullptr) && (pSelfPlayer->GetUserStatus() == US_SIT) && (_cbGameStatus == SSS_GS_WK_FREE)) { SendUserReady(); } } else { GamePlayer* pPlayer = getSelfGamePlayer(); //如果房间主人是自已则隐藏“返回大厅”按钮,显示“解散房间”按钮; if (pPlayer != nullptr && pNetInfo->dwCreateUserID == pPlayer->GetUserID()) { _btnLeave->setVisible(false); _btnDismiss->setVisible(true); } //游戏未开始显示微信分享按钮; if (pNetInfo->dwPlayCout <= 0) { _btnInvite->setVisible(true); _btnStartGame->setVisible(true); } } } // 游戏规则 void SSSGameScene::ShowGameRule(CMD_GF_Private_Room_Info* pNetInfo) { if (pNetInfo == nullptr) return; std::string strPlayCount = StringUtils::format("%d局, ", pNetInfo->dwPlayTotal); std::string strGameSet = ""; uint32 dwGameRule = m_PrivateRoomInfo.bGameRuleIdex; m_strGameTitle = "十三张~抢庄玩法"; if ((dwGameRule & eSSSGameRuleRobBanker) > 0) { strGameSet += "抢庄玩法, "; _txtRoomRule->setString(utility::a_u8("抢庄玩法")); } if ((dwGameRule & eSSSGameRuleFixBanker) > 0) { strGameSet += "霸王庄玩法, "; _txtRoomRule->setString(utility::a_u8("霸王庄玩法")); m_strGameTitle = "十三张~霸王庄玩法"; } if ((dwGameRule & eSSSGameRuleTurnBanker) > 0) { strGameSet += "轮庄玩法, "; _txtRoomRule->setString(utility::a_u8("轮庄玩法")); m_strGameTitle = "十三张~轮庄玩法"; } if ((dwGameRule & eSSSGameRuleClassic) > 0) { strGameSet += "经典玩法, "; _txtRoomRule->setString(utility::a_u8("经典玩法")); m_strGameTitle = "十三张~经典玩法"; } m_strGameRuleInfo = strPlayCount + strGameSet; } // 私人场结束; void SSSGameScene::OnSocketSubPrivateEnd(void* data, int dataSize) { m_bPrivateEnd = true; // 申请解散界面; DismissScene::Instance().hide(); DataStream kDataStream(data, dataSize); SSS_CMD_S_Private_End_Info kNetInfo; kNetInfo.StreamValue(kDataStream, false); _aryResultItem.clear(); // 是不是欢乐场; bool bUnionScore = (m_PrivateRoomInfo.cbUnionGoldOpen == 1); for (int i = 0; i < SSS_GAME_PLAYER; i++) { if (kNetInfo.aryActiveStatus[i] == 0) { continue; } tagSSSOpenResultItem mItem; mItem.lGameScore = kNetInfo.lUserScore[i]; //if (bUnionScore) //{ // mItem.lUnionScore = mItem.lGameScore * m_PrivateRoomInfo.lScoreMultiple; //} //else { mItem.lUnionScore = mItem.lGameScore * m_PrivateRoomInfo.cbBaseScore; } GamePlayer* player = getPlayerByChairID(i); if (player!=nullptr) { std::string strName = player->GetNickName(); strncpy(mItem.szNickName, strName.c_str(), countarray(mItem.szNickName) - 1); mItem.dwGameID = player->GetGameID(); mItem.bOwner = (player->GetUserID() == m_PrivateRoomInfo.dwCreateUserID); std::string strHttpHead = player->GetHeadHttp(); strncpy(mItem.szHttpHead, strHttpHead.c_str(), countarray(mItem.szHttpHead) - 1); } mItem.cbWinTimes = kNetInfo.aryWinTimes[i]; mItem.cbLoseTimes = kNetInfo.aryLoseTimes[i]; mItem.cbShootTimes = kNetInfo.aryShootTimes[i]; mItem.cbKillAllTimes = kNetInfo.aryKillAllTimes[i]; _aryResultItem.push_back(mItem); } // 工会欢乐场; if (bUnionScore) { int nCount = _aryResultItem.size(); // 寻找大赢家; SCORE lMaxScore = 0; for (size_t i = 0; i < nCount; i++) { tagSSSOpenResultItem* pData = &(_aryResultItem.at(i)); if (pData->lGameScore > lMaxScore) { lMaxScore = pData->lGameScore; } } // 统计大赢家数量; int iMaxScoreCount = 0; for (int j = 0; j < nCount; j++) { tagSSSOpenResultItem* pData = &(_aryResultItem.at(j)); if ((lMaxScore > 0) && (pData->lGameScore == lMaxScore)) { iMaxScoreCount++; } } if (iMaxScoreCount > 0) { SCORE lGameGold = m_PrivateRoomInfo.lGameGold*m_PrivateRoomInfo.dwPlayCost; // 计算玩家积分; SCORE lRevenue = floor(lGameGold / iMaxScoreCount); // 重新计算积分, 统计扣税; for (int k = 0; k < nCount; k++) { tagSSSOpenResultItem* pData = &(_aryResultItem.at(k)); if ((lMaxScore > 0) && (pData->lGameScore == lMaxScore)) { if (pData->lUnionScore > lRevenue) { pData->lUnionScore -= lRevenue; } else { pData->lUnionScore = 0; } } // 这里直接设置为欢乐总积分 pData->lAllUnionScore = pData->lUnionScore + m_PrivateScoreInfo.kScoreInfoArray[k]; } } } if (_ResultPanel->isVisible() == false) { _OpenResultScene->updateUIData(m_dwRoomID, &_aryResultItem, true); _OpenResultScene->setVisible(true); } else { _btnPrivateEnd->setVisible(true); _btnReady->setVisible(false); } // 游戏结束停止网络; PrivateRoomEnd(); } void SSSGameScene::onEventShowPrivate(cocos2d::EventCustom *event) { //if (m_pPrivateScene) //{ // m_pPrivateScene->pushScene(); //} } // 请求解散房间; void SSSGameScene::OnSocketSubPrivateDismissInfo(CMD_GF_Private_Dismiss_Info* pNetInfo) { std::string aryName[SSS_GAME_PLAYER]; BYTE aryResult[SSS_GAME_PLAYER] = { 0 }; // 0 未选择 1 同意 2 不同意; bool bHasSelf = false; uint32 dwMyChairID = getSelfChairID(); for (uint32 i = 0; i < pNetInfo->dwDissUserCout; i++) { uint32 dwChairID = pNetInfo->dwDissChairID[i]; GamePlayer* pPlayer = getPlayerByChairID(dwChairID); if (pPlayer != nullptr && dwChairID < SSS_GAME_PLAYER) { aryResult[dwChairID] = 1; } if (dwMyChairID == dwChairID) { bHasSelf = true; } } for (uint32 i = 0; i < pNetInfo->dwNotAgreeUserCout; i++) { uint32 dwChairID = pNetInfo->dwNotAgreeChairID[i]; GamePlayer* pPlayer = getPlayerByChairID(dwChairID); if (pPlayer != nullptr && dwChairID < SSS_GAME_PLAYER) { aryResult[dwChairID] = 2; } if (dwMyChairID == dwChairID) { bHasSelf = true; } } GamePlayer* players[SSS_GAME_PLAYER]; for (int i = 0; i < SSS_GAME_PLAYER; i++) { players[i] = getPlayerByChairID(i); } DismissScene::Instance().show(aryResult, players, !bHasSelf, SSS_GAME_PLAYER); } void SSSGameScene::OnSocketSubPrivateDismissResult(CMD_GF_Private_Dismiss_Result* pNetInfo) { if (pNetInfo->bSuccess && false == m_PrivateRoomInfo.bStartGame) { EventLeaveGame(nullptr); } else { DismissScene::Instance().hide(); } } //////////////////////////////// 游戏录像 ////////////////////////////////////////// // 开始录像播放 void SSSGameScene::StartGameRecord() { if (m_GameRecord.playersVec.size() < 2) { return; } // 初始化房间信息; OnSocketSubPrivateRoomInfo(&m_GameRecord.roomInfo); m_iActRecordIdex = 0; m_txtRecordPercent->setString(utility::toString(m_iActRecordIdex * 100 / m_GameRecord.actionVec.size(), "%")); schedule(schedule_selector(GameFrameBase::NextRecordAction), m_RecordTime); if ((m_GameRecord.wBankerUser != INVALID_CHAIR)&&(m_GameRecord.wBankerUser= (int)m_GameRecord.actionVec.size() || !isVisible()) { m_txtRecordPercent->setString("100%"); m_btnPlay->setVisible(true); m_btnPause->setVisible(false); unschedule(schedule_selector(GameFrameBase::NextRecordAction)); return; } // 下一个操作记录; tagGameRecordOperateResult& kAction = m_GameRecord.actionVec[m_iActRecordIdex]; // 游戏开始; if (kAction.wSubCmdID == SSS_SUB_S_USER_ROB) { SSS_CMD_S_UserRob userRob; kAction.subMessageData.popValue(&userRob, sizeof(SSS_CMD_S_UserRob)); onSubUserRob(&userRob, sizeof(SSS_CMD_S_UserRob)); } // 玩家叫分; else if (kAction.wSubCmdID == SSS_SUB_S_START_CHIP) { SSS_CMD_S_StartChip startChip; kAction.subMessageData.popValue(&startChip, sizeof(SSS_CMD_S_StartChip)); onSubStartChip(&startChip, sizeof(SSS_CMD_S_StartChip)); } // 确认地主; else if (kAction.wSubCmdID == SSS_SUB_S_USER_CHIP) { SSS_CMD_S_UserChip userChip; kAction.subMessageData.popValue(&userChip, sizeof(SSS_CMD_S_UserChip)); onSubUserChip(&userChip, sizeof(SSS_CMD_S_UserChip)); } // 玩家出牌; else if (kAction.wSubCmdID == SSS_SUB_S_CLASSIC_CMP_CARD) { SSS_CMD_S_ClassicCompareCard cmpCard; kAction.subMessageData.popValue(&cmpCard, sizeof(SSS_CMD_S_ClassicCompareCard)); onSubClassicCompareCard(&cmpCard, sizeof(SSS_CMD_S_ClassicCompareCard)); } // 玩家放弃出牌; else if (kAction.wSubCmdID == SSS_SUB_S_BANKER_CMP_CARD) { SSS_CMD_S_BankerCompareCard cmpCard; kAction.subMessageData.popValue(&cmpCard, sizeof(SSS_CMD_S_BankerCompareCard)); onSubBankerCompareCard(&cmpCard, sizeof(SSS_CMD_S_BankerCompareCard)); } // 游戏结束; else if (kAction.wSubCmdID == SSS_SUB_S_GAME_END) { //SSS_CMD_S_GameEnd GameEnd; kAction.subMessageData.popValue(&m_GameEnd, sizeof(SSS_CMD_S_GameEnd)); //onSubGameEnd(&GameEnd, sizeof(SSS_CMD_S_GameEnd)); } m_iActRecordIdex++; m_txtRecordPercent->setString(utility::toString(m_iActRecordIdex * 100 / m_GameRecord.actionVec.size(), "%")); } std::string SSSGameScene::getGameRule(uint32 dwGameRule) { std::string strGameSet = ""; if ((dwGameRule & eSSSGameRuleRobBanker) > 0) { strGameSet += "抢庄玩法, "; } if ((dwGameRule & eSSSGameRuleFixBanker) > 0) { strGameSet += "霸王庄玩法, "; } if ((dwGameRule & eSSSGameRuleTurnBanker) > 0) { strGameSet += "轮庄玩法, "; } if ((dwGameRule & eSSSGameRuleClassic) > 0) { strGameSet += "经典玩法, "; } return strGameSet; }