#include "ZJH_GamePlayer.h" #include "ImagicDownManager.h" #include "ActionEx.h" #include "ZJH_CMD.h" #include "ZJH_GameLogic.h" #include "SimpleAudioEngine.h" ZJHGamePlayer::ZJHGamePlayer(WORD wViewID, Layout* pRootLayout) : GamePlayer(NULL), m_bReady(false), m_cbViewID(wViewID), m_pRootLayout(pRootLayout) { init(); } ZJHGamePlayer::~ZJHGamePlayer() { } bool ZJHGamePlayer::init() { // 已下注精灵; m_pSprAllAddChip = static_cast(m_pRootLayout->getChildByName("sprAllAddChip")); CC_ASSERT(m_pSprAllAddChip != nullptr); m_pSprAllAddChip->setVisible(false); // 已下注文本; m_pTxtAllAddChip = static_cast(m_pSprAllAddChip->getChildByName("txtNum")); CC_ASSERT(m_pTxtAllAddChip != nullptr); // 当前下注精灵; m_pSprCurAddChip = static_cast(m_pRootLayout->getChildByName("sprCurAddChip")); CC_ASSERT(m_pSprCurAddChip != nullptr); m_pSprCurAddChip->setVisible(false); // 当前下注文本; m_pTxtCurAddChip = static_cast(m_pSprCurAddChip->getChildByName("txtNum")); CC_ASSERT(m_pTxtCurAddChip != nullptr); // 超时精灵; m_pSprTimeOut = static_cast(m_pRootLayout->getChildByName("sprTimeOut")); CC_ASSERT(m_pSprTimeOut != nullptr); // 时钟节点; Node* pNodeTimer = m_pRootLayout->getChildByName("nodeTimer"); CC_ASSERT(pNodeTimer!=nullptr); int nTimerZOrder = pNodeTimer->getLocalZOrder(); pNodeTimer->removeFromParent(); Sprite* sprTimerBg = Sprite::create("Games/ZJH/Table/Timer.png"); CC_ASSERT(sprTimerBg != nullptr); //sprTimerBg->setColor(Color3B(0x5a, 0xff, 0)); // 时钟进度条; m_pProgressTimer = ProgressTimer::create(sprTimerBg); CC_ASSERT(m_pProgressTimer != nullptr); m_pProgressTimer->setType(ProgressTimer::Type::RADIAL); m_pProgressTimer->setPosition(m_pSprTimeOut->getPosition()); m_pProgressTimer->setLocalZOrder(nTimerZOrder); m_pProgressTimer->setVisible(false); m_pRootLayout->addChild(m_pProgressTimer); // 玩家昵称; m_pTxtNickName = static_cast(m_pRootLayout->getChildByName("txtNickName")); CC_ASSERT(m_pTxtNickName!=nullptr); m_pTxtNickName->setString(""); // 头像按钮; m_pBtnUserHead = static_cast(m_pRootLayout->getChildByName("btnUserHead")); CC_ASSERT(m_pBtnUserHead != nullptr); // 比牌按钮; m_pBtnCompareCard = static_cast(m_pRootLayout->getChildByName("btnUserCompare")); //CC_ASSERT((ZJH_VIEW_SELF_ID == m_cbViewID)&&(m_pBtnCompareCard==nullptr)); if (m_pBtnCompareCard!=nullptr) { m_pBtnCompareCard->setVisible(false); m_pBtnCompareCard->addClickEventListener(CC_CALLBACK_1(ZJHGamePlayer::onCompareButtonClick, this)); } // 看牌按钮; m_pBtnLookCard = static_cast(m_pRootLayout->getChildByName("btnLookCard")); //CC_ASSERT((ZJH_VIEW_SELF_ID == m_cbViewID) && (m_pBtnLookCard != nullptr)); if (m_pBtnLookCard != nullptr) { m_pBtnLookCard->setVisible(false); } //头像; m_pSprHead = static_cast(m_pBtnUserHead->getChildByName("imgUserHead")); CC_ASSERT(m_pSprHead!=nullptr); m_pSprHead->setVisible(false); //积分; m_pTxtScore = static_cast(m_pRootLayout->getChildByName("txtScore")); CC_ASSERT(m_pTxtScore != nullptr); m_pTxtScore->setString(""); //房主标志; m_pSprOwner = static_cast(m_pRootLayout->getChildByName("sprOwner")); CC_ASSERT(m_pSprOwner != nullptr); m_pSprOwner->setVisible(false); //准备标志; m_pSprReady = static_cast(m_pRootLayout->getChildByName("sprReadyIcon")); CC_ASSERT(m_pSprReady != nullptr); m_pSprReady->setVisible(false); //状态标志; m_pSprStatus = static_cast(m_pRootLayout->getChildByName("sprStatus")); CC_ASSERT(m_pSprStatus != nullptr); m_pSprStatus->setVisible(false); m_pArmatureCardType = static_cast(m_pRootLayout->getChildByName("armCardType")); CC_ASSERT(m_pArmatureCardType != nullptr); m_pArmatureCardType->setVisible(false); //选择动画; m_pArmatureSelect = static_cast(m_pRootLayout->getChildByName("armSelect")); //CC_ASSERT((ZJH_VIEW_SELF_ID == m_cbViewID) && (m_pArmatureSelect == nullptr)); if (m_pArmatureSelect != nullptr) { m_pArmatureSelect->setVisible(false); } //断线标志; m_pSprOffline = static_cast(m_pRootLayout->getChildByName("sprOffline")); CC_ASSERT(m_pSprOffline != nullptr); m_pSprOffline->setVisible(false); auto panelCard = static_cast(m_pRootLayout->getChildByName("panelHandCard")); CC_ASSERT(panelCard != nullptr); m_aryPanelHandCard = panelCard; for (int i = 0; i < ZJH_MAX_COUNT; i++) { Sprite* sprCard = static_cast(panelCard->getChildByName(StringUtils::format("sprCard%d", i))); CC_ASSERT(sprCard != nullptr); sprCard->setVisible(false); m_arySpriteCard[i] = sprCard; } m_sprCardType = static_cast(m_pRootLayout->getChildByName("sprCardType")); //CC_ASSERT((ZJH_VIEW_SELF_ID != m_cbViewID) && (m_sprCardType != nullptr)); if (m_sprCardType!=nullptr) { m_sprCardType->setVisible(false); } m_pTxtOperTip = static_cast(m_pRootLayout->getChildByName("fntOperTip")); CC_ASSERT(m_pTxtOperTip != nullptr); m_pTxtOperTip->setVisible(false); m_ptInitOperTip = m_pTxtOperTip->getPosition(); //聊天框背景; m_pImgChatView = static_cast(m_pRootLayout->getChildByName("img9ChatBubble")); CC_ASSERT(m_pImgChatView != nullptr); m_pImgChatView->setVisible(false); auto panelChat = static_cast(m_pImgChatView->getChildByName("ChatMsgPanel")); CC_ASSERT(panelChat != nullptr); //聊天内容; m_pTxtChatInfo = static_cast(panelChat->getChildByName("txtChatMsg")); CC_ASSERT(m_pTxtChatInfo != nullptr); //语音气泡; m_pVoiceBubble = static_cast(m_pRootLayout->getChildByName("voice")); CC_ASSERT(m_pVoiceBubble != nullptr); m_pVoiceBubble->setVisible(false); auto speek_bg = (Sprite*)m_pVoiceBubble->getChildByName("speek_bg"); CC_ASSERT(speek_bg != nullptr); m_pSprVoiceAni = (Sprite*)speek_bg->getChildByName("voice_ing"); CC_ASSERT(m_pSprVoiceAni != nullptr); //比牌选择回调; _fnCompareCardSelect = nullptr; return true; } void ZJHGamePlayer::PlayerEnter() { setInfoVisible(true); std::string strHttp = GetHeadHttp(); cocos2d::log("%s", strHttp.c_str()); uint32 dwUserID = GetUserID(); ImagicDownManager::Instance().addDown(m_pSprHead, strHttp, dwUserID); //showChatInfo(utility::a_u8("作用:让目标动作赋予反弹力,且以目标动作结束位子开始反弹")); } void ZJHGamePlayer::PlayerLeave() { if (m_isAllowLeave) { setInfoVisible(false); setReadyVisible(false); setOfflineVisible(false); } } //显示玩家聊天内容; void ZJHGamePlayer::showChatInfo(const std::string strChatString) { auto label = Label::createWithSystemFont(strChatString, "", 28); CC_ASSERT(label!=nullptr); m_pTxtChatInfo->setString(strChatString); const Size& labelSize = label->getContentSize(); const Size& frameSize = m_pTxtChatInfo->getContentSize(); int nRows = labelSize.width / frameSize.width; //int nRemainder = (int)labelSize.width % (int)frameSize.width; //if (nRemainder>0) //{ // nRows++; //} m_pImgChatView->setVisible(true); m_pTxtChatInfo->setPositionY(28.0f); auto callback = CallFunc::create([=](){ m_pImgChatView->setVisible(false); }); //有几行文字就向上移动几次; if (nRows > 0) { auto move = EaseSineInOut::create(MoveBy::create(0.4f, Vec2(0, labelSize.height))); auto seq = Sequence::create(DelayTime::create(2.5f), move, nullptr); m_pTxtChatInfo->runAction(Sequence::create(Repeat::create(seq, nRows), DelayTime::create(2.5f), callback, nullptr)); } else { m_pTxtChatInfo->runAction(Sequence::create(DelayTime::create(2.5f), callback, nullptr)); } } //显示语音气泡; void ZJHGamePlayer::showVoiceBubble() { CC_ASSERT(m_pVoiceBubble != nullptr); m_pVoiceBubble->setVisible(true); // 启动帧动画; auto action = CSLoader::createTimeline("Games/ZJH/PlayerVoiceNode.csb"); action->gotoFrameAndPlay(0); m_pSprVoiceAni->runAction(action); } //隐藏语音气泡; void ZJHGamePlayer::hideVoiceBubble() { CC_ASSERT(m_pVoiceBubble != nullptr); m_pSprVoiceAni->stopAllActions(); m_pVoiceBubble->setVisible(false); } //重置界面; void ZJHGamePlayer::resetUI(bool bAll/* = false*/) { if ( bAll ) { setInfoVisible(false); setReadyVisible(false); setOfflineVisible(false); } ////断线标志; //m_pSprOffline->setVisible(false); m_pSprAllAddChip->setVisible(false); m_pSprCurAddChip->setVisible(false); m_pSprTimeOut->setVisible(false); m_pProgressTimer->setVisible(false); //手牌面板; for (int i = 0; i < ZJH_MAX_COUNT; i++) { m_arySpriteCard[i]->setVisible(false); } if (m_sprCardType != nullptr) { m_sprCardType->setVisible(false); } m_pSprStatus->setVisible(false); ArmatureAnimation* pAniCardType = m_pArmatureCardType->getAnimation(); if (pAniCardType != nullptr) { pAniCardType->stop(); } m_pArmatureCardType->setVisible(false); if (m_pArmatureSelect!=nullptr) { ArmatureAnimation* pAniStatus = m_pArmatureSelect->getAnimation(); if (pAniStatus != nullptr) { pAniStatus->stop(); } m_pArmatureSelect->setVisible(false); } m_pTxtOperTip->stopAllActions(); m_pTxtOperTip->setVisible(false); if (m_pBtnCompareCard != nullptr) { m_pBtnCompareCard->setVisible(false); } if (m_pBtnLookCard != nullptr) { m_pBtnLookCard->setVisible(false); } memset(m_aryCardData, 0, sizeof(m_aryCardData)); } //玩家信息可见性; void ZJHGamePlayer::setInfoVisible(bool bVisible) { CC_ASSERT(m_pSprHead!=nullptr); m_pSprHead->setVisible(bVisible); CC_ASSERT(m_pTxtNickName!=nullptr); m_pTxtNickName->setString(bVisible?GetNickName():""); m_pTxtNickName->setVisible(bVisible); CC_ASSERT(m_pTxtScore != nullptr); SCORE lScore = bVisible? GetUserScore() : 0; m_pTxtScore->setString(utility::toString(lScore)); m_pTxtScore->setVisible(bVisible); } //设置是否为房主; void ZJHGamePlayer::setOwner(bool bOwenr) { CC_ASSERT(m_pSprOwner != nullptr); m_pSprOwner->setVisible(bOwenr); } //设置准备状态; void ZJHGamePlayer::setReadyVisible(bool bVisible) { CC_ASSERT(m_pSprReady != nullptr); m_pSprReady->setVisible(bVisible); m_bReady = bVisible; } //设置断线状态; void ZJHGamePlayer::setOfflineVisible(bool bVisible) { CC_ASSERT(m_pSprOffline != nullptr); m_pSprOffline->setVisible(bVisible); } //开启时钟; void ZJHGamePlayer::openClock(float fTime) { auto callFunc = CallFunc::create([this]{ m_pSprTimeOut->setVisible(true); auto actRepeat = RepeatForever::create(Sequence::create(FadeIn::create(1.0f), FadeOut::create(1.0f), nullptr)); m_pSprTimeOut->runAction(actRepeat); }); auto action = Sequence::create(Show::create(), ProgressTo::create(fTime, 100.f), Hide::create(), callFunc, nullptr); m_pProgressTimer->setColor(Color3B(0x5a, 0xff, 0)); m_pProgressTimer->setPercentage(0.f); m_pProgressTimer->runAction(action); m_pProgressTimer->runAction(TintTo::create(fTime, 255, 0, 0)); } //关闭时钟; void ZJHGamePlayer::closeClock() { m_pSprTimeOut->stopAllActions(); m_pSprTimeOut->setVisible(false); m_pProgressTimer->stopAllActions(); m_pProgressTimer->setVisible(false); } //设置选择比牌按钮状态; void ZJHGamePlayer::setCompareVisible(bool bVisible) { if (m_pBtnCompareCard == nullptr) { return; } m_pBtnCompareCard->setVisible(bVisible); ArmatureAnimation* pAniSelect = m_pArmatureSelect->getAnimation(); if (pAniSelect != nullptr) { if (bVisible) { pAniSelect->play("SelectArrow", -1, 1); } else { pAniSelect->stop(); } } m_pArmatureSelect->setVisible(bVisible); } //设置选择比牌按钮点击回调; void ZJHGamePlayer::setCompareClickCallback(const std::function& callback) { _fnCompareCardSelect = callback; } //设置选择看牌按钮状态; void ZJHGamePlayer::setLookCardVisible(bool bVisible) { if (m_pBtnLookCard == nullptr) { return; } m_pBtnLookCard->setVisible(bVisible); } //设置选择看牌按钮点击回调; void ZJHGamePlayer::setLookCardClickCallback(const Widget::ccWidgetClickCallback& callback) { if (m_pBtnLookCard != nullptr) { m_pBtnLookCard->addClickEventListener(callback); } } //显示背牌; void ZJHGamePlayer::showBackCard() { //加载牌; SpriteFrameCache* pSpriteFrameCache = SpriteFrameCache::getInstance(); SpriteFrame* pSpriteFrame = pSpriteFrameCache->getSpriteFrameByName("L_0x00.png"); CC_ASSERT(pSpriteFrame != nullptr); for (int i = 0; i < ZJH_MAX_COUNT; i++) { Sprite* sprCard = m_arySpriteCard[i]; sprCard->setTag(0); sprCard->setSpriteFrame(pSpriteFrame); sprCard->setVisible(true); } } //显示操作提示; void ZJHGamePlayer::showOperateTip(uint32 dwOper, int nData) { std::string strOper; if ((dwOper&ZJH_OPERATE_FOLLOW)>0) { strOper = StringUtils::format("跟注%d", nData); } else if ((dwOper&ZJH_OPERATE_ADD_CHIP)>0) { strOper = StringUtils::format("加注%d", nData); } else if ((dwOper&ZJH_OPERATE_COMPARE_CARD)>0) { strOper = StringUtils::format("比牌%d", nData); } if (!strOper.empty()) { m_pTxtOperTip->setString(utility::a_u8(strOper)); //移动动画; auto moveby = EaseExponentialOut::create(MoveBy::create(1.0f, Vec2(0, 100))); m_pTxtOperTip->setPosition(m_ptInitOperTip); auto actSeq = Spawn::create(FadeOut::create(0.2f), ScaleTo::create(0.3f, 0.4f), nullptr); m_pTxtOperTip->setOpacity(255); m_pTxtOperTip->setScale(1.0f); m_pTxtOperTip->runAction(Sequence::create(Show::create(), moveby, DelayTime::create(0.8f), actSeq, Hide::create(), nullptr)); } } //显示牌类型; void ZJHGamePlayer::showCardType(uint8 cbCardType) { ArmatureAnimation* pAniCardType = m_pArmatureCardType->getAnimation(); if (pAniCardType == nullptr) { return; } m_pArmatureCardType->setVisible(true); switch (cbCardType) { case ZJH_CT_ERROR: { m_pArmatureCardType->setVisible(false); break; } case ZJH_CT_SINGLE: { pAniCardType->play("PokerType6"); break; } case ZJH_CT_DOUBLE: { pAniCardType->play("PokerType5"); break; } case ZJH_CT_SHUN_ZI: { pAniCardType->play("PokerType4"); break; } case ZJH_CT_JIN_HUA: { pAniCardType->play("PokerType3"); break; } case ZJH_CT_SHUN_JIN: { pAniCardType->play("PokerType2"); break; } case ZJH_CT_BAO_ZI: { pAniCardType->play("PokerType1"); break; } case ZJH_CT_SPECIAL: { pAniCardType->play("PokerType7"); break; } default: break; } } //显示牌类型; void ZJHGamePlayer::showCardTypeEx(uint8 cbCardType) { if (nullptr==m_sprCardType) { return; } switch (cbCardType) { case ZJH_CT_ERROR: { m_sprCardType->setVisible(false); break; } case ZJH_CT_SINGLE: { m_sprCardType->setTexture("Games/ZJH/CardType/GaoPai.png"); break; } case ZJH_CT_DOUBLE: { m_sprCardType->setTexture("Games/ZJH/CardType/DuiZi.png"); break; } case ZJH_CT_SHUN_ZI: { m_sprCardType->setTexture("Games/ZJH/CardType/ShunZi.png"); break; } case ZJH_CT_JIN_HUA: { m_sprCardType->setTexture("Games/ZJH/CardType/JinHua.png"); break; } case ZJH_CT_SHUN_JIN: { m_sprCardType->setTexture("Games/ZJH/CardType/ShunJin.png"); break; } case ZJH_CT_BAO_ZI: { m_sprCardType->setTexture("Games/ZJH/CardType/Baozi.png"); break; } case ZJH_CT_SPECIAL: { m_sprCardType->setTexture("Games/ZJH/CardType/235.png"); break; } default: break; } if (cbCardType>ZJH_CT_ERROR) { m_sprCardType->runAction(Sequence::create(DelayTime::create(0.5f), Show::create(), nullptr)); } } //隐藏牌类型; void ZJHGamePlayer::hideCardTypeEx() { if (m_sprCardType != nullptr) { m_sprCardType->setVisible(false); } } //增加牌; void ZJHGamePlayer::addOneCard(uint8 cbData, uint8 cbIndex) { CC_ASSERT(cbIndex= ZJH_MAX_COUNT) { return; } //加载牌; SpriteFrameCache* pSpriteFrameCache = SpriteFrameCache::getInstance(); std::string strName = StringUtils::format("L_0x%02X.png", cbData); SpriteFrame* pSpriteFrame = pSpriteFrameCache->getSpriteFrameByName(strName); CC_ASSERT(pSpriteFrame != nullptr); Sprite* sprCard = m_arySpriteCard[cbIndex]; CC_ASSERT(sprCard!=nullptr); sprCard->setTag(cbData); sprCard->setSpriteFrame(pSpriteFrame); sprCard->setVisible(true); } //设置总下注; void ZJHGamePlayer::setAllChip(SCORE lChip) { m_pSprAllAddChip->setVisible(true); m_pTxtAllAddChip->setString(StringUtils::format("%d", lChip)); } //设置加注; void ZJHGamePlayer::setAddChip(SCORE lChip) { m_pSprCurAddChip->setVisible(true); m_pTxtCurAddChip->setString(StringUtils::format("%d", lChip)); } //更新积分; void ZJHGamePlayer::updateScore() { CC_ASSERT(m_pTxtScore != nullptr); SCORE lScore = GetUserScore(); m_pTxtScore->setString(utility::toString(lScore)); } //显示牌; void ZJHGamePlayer::showCard(uint8 aryCardData[ZJH_MAX_COUNT]) { SpriteFrameCache* pSpriteFrameCache = SpriteFrameCache::getInstance(); for (uint8 i = 0; i < ZJH_MAX_COUNT; i++) { // 有牌值则跳过; if (m_arySpriteCard[i]->getTag()>0) { continue; } m_arySpriteCard[i]->setTag(aryCardData[i]); m_arySpriteCard[i]->setVisible(true); CallFuncN* callback = CallFuncN::create([=](Node* pNode){ Sprite* pCardSprite = static_cast(pNode); //加载牌; std::string strName = StringUtils::format("L_0x%02X.png", pCardSprite->getTag()); SpriteFrame* pSpriteFrame = pSpriteFrameCache->getSpriteFrameByName(strName); CC_ASSERT(pSpriteFrame != nullptr); pCardSprite->setSpriteFrame(pSpriteFrame); }); Action* pAction = Sequence::create(OrbitCamera::create(0.25f, 1, 0, 0, 90, 0, 0), callback, OrbitCamera::create(0.25f, 1, 0, 270, 90, 0, 0), nullptr); m_arySpriteCard[i]->runAction(pAction); } } void ZJHGamePlayer::showHandStatus(uint8 cbHandStatus) { m_pSprStatus->setVisible(true); if (ZJH_ST_GAMING_LOOK == cbHandStatus) { m_pSprStatus->setTexture("Games/ZJH/Table/imgLookCard.png"); } else if (ZJH_ST_GAMING_LOSE == cbHandStatus) { m_pSprStatus->setTexture("Games/ZJH/Table/imgCompLoser.png"); } else if (ZJH_ST_GAMING_GIVEUP == cbHandStatus) { m_pSprStatus->setTexture("Games/ZJH/Table/imgGiveUp.png"); } else { m_pSprStatus->setVisible(false); } } //隐藏手牌状态; void ZJHGamePlayer::hideHandStatus() { m_pSprStatus->setVisible(false); } //获取头像位置; const Vec2 ZJHGamePlayer::getHeadPos() { CC_ASSERT(m_pSprHead != nullptr); Vec2 pos = m_pSprHead->convertToWorldSpace(Vec2(m_pSprHead->getContentSize().width / 2, m_pSprHead->getContentSize().height / 2)); return Vec2(pos.x, pos.y); } //获取手牌位置; const Vec2 ZJHGamePlayer::getHandCardPos(uint8 cbIndex) { CC_ASSERT(cbIndex= ZJH_MAX_COUNT) { cbIndex = 0; } Sprite* sprCard = m_arySpriteCard[cbIndex]; CC_ASSERT(sprCard!=nullptr); return sprCard->getParent()->convertToWorldSpace(sprCard->getPosition()); } //转换到世界坐标系; Vec2 ZJHGamePlayer::convertToWorldSpace(const Vec2& nodePoint) const { CC_ASSERT(m_pRootLayout != nullptr); return m_pRootLayout->convertToWorldSpace(nodePoint); } //增加子节点; void ZJHGamePlayer::addChild(Node* pNode) { CC_ASSERT(m_pRootLayout != nullptr); m_pRootLayout->addChild(pNode); } void ZJHGamePlayer::upPlayerState() { //状态发生改变的用户; uint8 cbUserStatus = GetUserStatus(); switch (cbUserStatus) { case US_SIT: { break; } case US_READY: { setReadyVisible(true); setOfflineVisible(false); break; } case US_PLAYING: { setReadyVisible(false); setOfflineVisible(false); break; } case US_OFFLINE: { setOfflineVisible(true); break; } default: break; } } //点击比牌按钮; void ZJHGamePlayer::onCompareButtonClick(Ref* pSender) { if (_fnCompareCardSelect != nullptr) { _fnCompareCardSelect(GetChairID()); } }