Files
wnmj-normal/Classes/Games/DDZ/DDZ_Player.cpp
2026-03-03 13:56:44 +08:00

513 lines
12 KiB
C++

#include "DDZ_Player.h"
#include "ImagicDownManager.h"
#include "DDZ_BigCardSprite.h"
#include "DDZ_SmallCardSprite.h"
#include "ActionEx.h"
DDZPlayer::DDZPlayer(WORD wViewID, Layout* pRootLayout) :
GamePlayer(NULL), m_bLandlord(false), m_bReady(false), m_cbViewID(wViewID), m_pRootLayout(pRootLayout)
{
init();
}
DDZPlayer::~DDZPlayer()
{
}
bool DDZPlayer::init()
{
//玩家昵称;
m_pTxtNickName = static_cast<Text*>(m_pRootLayout->getChildByName("nickname"));
CC_ASSERT(m_pTxtNickName!=nullptr);
m_pTxtNickName->setString("");
//工会名称;
m_pTxtUnionName = static_cast<Text*>(m_pRootLayout->getChildByName("txtUnionName"));
CC_ASSERT(m_pTxtUnionName != nullptr);
m_pTxtUnionName->setString("");
//闹钟背景;
auto sprNaoZhong = static_cast<Sprite*>(m_pRootLayout->getChildByName("naozhong"));
CC_ASSERT(sprNaoZhong!=nullptr);
//闹钟倒计时;
m_pTxtAtlClock = static_cast<TextAtlas*>(sprNaoZhong->getChildByName("txtAtlTime"));
CC_ASSERT(m_pTxtAtlClock != nullptr);
//头像;
m_pSprHead = static_cast<Sprite*>(m_pRootLayout->getChildByName("head"));
CC_ASSERT(m_pSprHead!=nullptr);
m_pSprHead->setVisible(false);
//积分;
m_pTxtScore = static_cast<Text*>(m_pRootLayout->getChildByName("score"));
CC_ASSERT(m_pTxtScore != nullptr);
m_pTxtScore->setVisible(false);
//地主标志;
m_pLandFlag = static_cast<Sprite*>(m_pRootLayout->getChildByName("landlord"));
CC_ASSERT(m_pLandFlag!=nullptr);
//操作标志;
m_pSprOper = static_cast<Sprite*>(m_pRootLayout->getChildByName("oper"));
CC_ASSERT(m_pSprOper != nullptr);
m_pSprOper->setVisible(false);
//断线标志;
m_pSprOffline = static_cast<Sprite*>(m_pRootLayout->getChildByName("offline"));
CC_ASSERT(m_pSprOffline != nullptr);
m_pSprOffline->setVisible(false);
//剩余牌;
m_pSprSurplusCard = static_cast<Sprite*>(m_pRootLayout->getChildByName("sprSurplusCard"));
CC_ASSERT(m_pSprSurplusCard != nullptr);
//剩余牌文本;
m_pTxtAtlSurplus = static_cast<TextAtlas*>(m_pSprSurplusCard->getChildByName("txtAtlSurplus"));
CC_ASSERT(m_pTxtAtlSurplus != nullptr);
//出牌面板;
m_pPanelOutCard = static_cast<Layout*>(m_pRootLayout->getChildByName("panelOutCard"));
CC_ASSERT(m_pPanelOutCard != nullptr);
//聊天框背景;
m_pImgChatView = static_cast<ImageView*>(m_pRootLayout->getChildByName("imgChat"));
CC_ASSERT(m_pImgChatView != nullptr);
m_pImgChatView->setVisible(false);
auto panelChat = static_cast<Layout*>(m_pImgChatView->getChildByName("panelChat"));
CC_ASSERT(panelChat != nullptr);
//聊天内容;
m_pTxtChatInfo = static_cast<Text*>(panelChat->getChildByName("txtMsg"));
CC_ASSERT(m_pTxtChatInfo != nullptr);
//语音气泡;
m_pVoiceBubble = static_cast<Node*>(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);
//手牌;
m_pHandCardLayout = static_cast<Layout*>(m_pRootLayout->getChildByName("panelHandCard"));
return true;
}
void DDZPlayer::PlayerEnter()
{
setInfoVisible(true);
std::string strHttp = GetHeadHttp();
cocos2d::log("%s", strHttp.c_str());
uint32 dwUserID = GetUserID();
ImagicDownManager::Instance().addDown(m_pSprHead, strHttp, dwUserID);
}
void DDZPlayer::PlayerLeave()
{
setInfoVisible(false);
setReadyVisible(false);
setOfflineVisible(false);
}
//显示玩家聊天内容;
void DDZPlayer::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 DDZPlayer::showVoiceBubble()
{
CC_ASSERT(m_pVoiceBubble != nullptr);
m_pVoiceBubble->setVisible(true);
// 启动帧动画;
auto action = CSLoader::createTimeline("Games/DDZ/PlayerVoiceNode.csb");
action->gotoFrameAndPlay(0);
m_pSprVoiceAni->runAction(action);
}
//隐藏语音气泡;
void DDZPlayer::hideVoiceBubble()
{
CC_ASSERT(m_pVoiceBubble != nullptr);
m_pSprVoiceAni->stopAllActions();
m_pVoiceBubble->setVisible(false);
}
//重置界面
void DDZPlayer::resetUI(bool bAll/* = false*/)
{
if ( bAll )
{
setInfoVisible(false);
setReadyVisible(false);
setOfflineVisible(false);
}
//倒计时
m_pTxtAtlClock->stopAllActions();
m_pTxtAtlClock->setString("");
m_pTxtAtlClock->getParent()->setVisible(false);
//剩余牌
m_pTxtAtlSurplus->setString("");
m_pTxtAtlSurplus->getParent()->setVisible(false);
//地主标志
m_pLandFlag->setVisible(false);
////断线标志
//m_pSprOffline->setVisible(false);
if (!m_bReady)
{
//操作标志
m_pSprOper->setVisible(false);
}
//剩余牌
m_pSprSurplusCard->setVisible(false);
//出牌面板
m_pPanelOutCard->removeAllChildren();
m_pPanelOutCard->setVisible(false);
}
//玩家信息可见性
void DDZPlayer::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_pTxtUnionName != nullptr);
m_pTxtUnionName->setString(bVisible ? GetUnionName() : "");
m_pTxtUnionName->setVisible(bVisible);
CC_ASSERT(m_pTxtScore != nullptr);
SCORE lScore = bVisible? GetUserScore() : 0;
m_pTxtScore->setString(utility::toString<SCORE>(lScore));
m_pTxtScore->setVisible(bVisible);
}
//设置是否为地主;
void DDZPlayer::setLand(bool bLandlord)
{
CC_ASSERT(m_pLandFlag!=nullptr);
m_pLandFlag->setVisible(true);
if (bLandlord)
{
m_pLandFlag->setTexture(DDZ_LANDLORD_FLAG_PNG_FILE);
}
else
{
m_pLandFlag->setTexture(DDZ_FARMER_FLAG_PNG_FILE);
}
}
//设置准备状态;
void DDZPlayer::setReadyVisible(bool bVisible)
{
CC_ASSERT(m_pSprOper != nullptr);
if (bVisible)
{
m_pSprOper->setTexture(DDZ_READY_PNG_FILE);
}
m_pSprOper->setVisible(bVisible);
m_bReady = bVisible;
}
//设置断线状态;
void DDZPlayer::setOfflineVisible(bool bVisible)
{
CC_ASSERT(m_pSprOffline != nullptr);
m_pSprOffline->setVisible(bVisible);
}
//设置叫分;
void DDZPlayer::setCallVisible(bool bVisible, uint8 cbScore/* = 255*/)
{
CC_ASSERT(m_pSprOper != nullptr);
if (bVisible)
{
if (cbScore>=1 && cbScore<=4)
{
m_pSprOper->setTexture(StringUtils::format(DDZ_CALL_SCORE_PNG_FILE, cbScore));
}
else
{
m_pSprOper->setTexture(DDZ_PASS_SCORE_PNG_FILE);
}
}
m_pSprOper->setVisible(bVisible);
}
//设置不出;
void DDZPlayer::setPassVisible(bool bVisible)
{
CC_ASSERT(m_pSprOper != nullptr);
if (bVisible)
{
m_pSprOper->setTexture(DDZ_PASS_CARD_PNG_FILE);
}
m_pSprOper->setVisible(bVisible);
}
//设置玩家打出去的牌;
void DDZPlayer::setOutCardData(uint8* pData, uint8 cbCount)
{
CC_ASSERT(m_pPanelOutCard != nullptr);
if (pData == nullptr)
{
m_pPanelOutCard->setVisible(false);
}
else
{
m_pPanelOutCard->setVisible(true);
}
int iStartPosX = 0;
int iCardWidth = DDZ_BIG_CARD_WIDTH*0.5 + (cbCount - 1) * 25;
if (m_cbViewID == DDZ_SELF_VIEW_ID)
{
iStartPosX = (m_pPanelOutCard->getContentSize().width - iCardWidth) / 2;
}
else if (m_cbViewID == DDZ_RIGHT_VIEW_ID)
{
iStartPosX = m_pPanelOutCard->getContentSize().width - iCardWidth;
}
m_pPanelOutCard->removeAllChildren();
for (uint8 i = 0; i < cbCount; i++)
{
bool bLordSign = false;
if ((i + 1) == cbCount && m_bLandlord)
{
bLordSign = true;
}
DDZBigCardSprite* pOutCardSprite = DDZBigCardSprite::create(pData[i], bLordSign);
pOutCardSprite->setScale(0.5);
pOutCardSprite->setPosition(iStartPosX + 25 * i, 1.5);
m_pPanelOutCard->addChild(pOutCardSprite);
}
}
//显示倒计时;
void DDZPlayer::showClock(uint16 wSeconds, const std::function<void()>& callback/* = nullptr*/)
{
CC_ASSERT(m_pTxtAtlClock!=nullptr);
Node* pNode = m_pTxtAtlClock->getParent();
CC_ASSERT(pNode!=nullptr);
if (!(pNode->isVisible()))
{
pNode->setVisible(true);
}
m_pTxtAtlClock->setVisible(true);
m_pTxtAtlClock->stopAllActions();
if (callback)
{
m_pTxtAtlClock->runAction(cocos2d::MoveExTxtTimeCallBack::create(wSeconds, wSeconds, 0, callback, 0));
}
else
{
m_pTxtAtlClock->runAction(cocos2d::MoveExTxtTime::create(wSeconds));
}
float fDelayTime = 0.1f;
if (wSeconds > 3)
{
fDelayTime = wSeconds - 3;
}
auto rotCallFunc = CallFuncN::create([=](Node* target){
float fTime = 0.05f;
RotateTo* rotate1 = RotateTo::create(fTime, 10);
RotateTo* rerotate1 = RotateTo::create(fTime, 0);
RotateTo* rotate2 = RotateTo::create(fTime, -10);
RepeatForever* actForever = RepeatForever::create(Sequence::create(rotate1, rerotate1, rotate2, rerotate1, nullptr));
target->runAction(actForever);
});
//重置旋转角度;
pNode->setRotation(0);
pNode->runAction(Sequence::create(DelayTime::create(fDelayTime), rotCallFunc, nullptr));
}
//隐藏倒计时;
void DDZPlayer::killClock()
{
CC_ASSERT(m_pTxtAtlClock != nullptr);
Node* pNode = m_pTxtAtlClock->getParent();
CC_ASSERT(pNode != nullptr);
pNode->stopAllActions();
pNode->setVisible(false);
m_pTxtAtlClock->stopAllActions();
m_pTxtAtlClock->setVisible(false);
}
//更新积分;
void DDZPlayer::updateScore()
{
CC_ASSERT(m_pTxtScore != nullptr);
SCORE lScore = GetUserScore();
m_pTxtScore->setString(utility::toString<SCORE>(lScore));
}
//更新手中扑克牌数量;
void DDZPlayer::setHandCardCount(uint8 cbCount)
{
CC_ASSERT(m_pSprSurplusCard != nullptr);
if ( !m_pSprSurplusCard->isVisible() )
{
m_pSprSurplusCard->setVisible(true);
}
m_pTxtAtlSurplus->setVisible(true);
m_pTxtAtlSurplus->setString(utility::toString<short>(cbCount));
}
//设置玩家手牌;
void DDZPlayer::setHandCardData(uint8* pData, uint8 cbCount)
{
if (m_pHandCardLayout != nullptr)
{
m_pHandCardLayout->removeAllChildren();
int nPosY = m_pHandCardLayout->getContentSize().height;
for (uint8 i = 0; i < cbCount; i++)
{
DDZSmallCardSprite* pCardSprite = DDZSmallCardSprite::create(pData[i]);
pCardSprite->setPositionY(nPosY - i * 21 - DDZ_SMALL_CARD_HEIGHT);
pCardSprite->setLocalZOrder(i);
m_pHandCardLayout->addChild(pCardSprite);
}
}
}
//获取发牌位置
const Vec2 DDZPlayer::getCardPos()
{
CC_ASSERT(m_pSprSurplusCard!=nullptr);
return m_pSprSurplusCard->getPosition() + m_pRootLayout->getPosition();
}
//获取出牌位置
const Vec2& DDZPlayer::getOutCardPos()
{
CC_ASSERT(m_pPanelOutCard != nullptr);
return m_pPanelOutCard->getPosition();
}
//获取头像位置
const Vec2& DDZPlayer::getHeadPos()
{
CC_ASSERT(m_pSprHead!=nullptr);
return m_pSprHead->getPosition();
}
//转换到世界坐标系
Vec2 DDZPlayer::convertToWorldSpace(const Vec2& nodePoint) const
{
CC_ASSERT(m_pRootLayout != nullptr);
return m_pRootLayout->convertToWorldSpace(nodePoint);
}
//增加子节点
void DDZPlayer::addChild(Node* pNode)
{
CC_ASSERT(m_pRootLayout != nullptr);
m_pRootLayout->addChild(pNode);
}
void DDZPlayer::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;
}
}