Files
wnmj/Classes/GameFrame/GameFrameBase.cpp
2026-02-13 14:34:15 +08:00

1238 lines
31 KiB
C++

#include "GameFrameBase.h"
//#include "ArmFun.h"
#include "SimpleAudioEngine.h"
#include "UserInfo.h"
#include "GlobalJosn.h"
#include "Utility.h"
#include "MainScene.h"
#include "JniFun.h"
#include "LoadingScene.h"
#include "PopScene.h"
#include "SelectShareScene.h"
#define ANIM_DELAY_TIME 0.3f
#define RECORD_PLAY_TIME 1.6f
const BYTE cbFaceCount[] = {5, 9, 3, 10, 4, 4, 6, 6, 4, 4, 4, 8};
GameFrameBase::GameFrameBase()
:m_pSelfPlayer(NULL)
//,m_bEnterGetUserInfo(true)
{
// 设置游戏TAG
this->setTag(SCENE_TAG_GAME);
m_bPrivateEnd = false;
m_pChatLayer = nullptr;
m_kGameMission.SetClientKernelSink(this);
auto dispatcher = Director::getInstance()->getEventDispatcher();
dispatcher->addCustomEventListener(CONTINUE_GAME, CC_CALLBACK_1(GameFrameBase::onEventContinueGame, this));
dispatcher->addCustomEventListener(SEND_USER_CHAT_TEXT, CC_CALLBACK_1(GameFrameBase::onEventUserChat, this));
dispatcher->addCustomEventListener(SEND_USER_CHAT_FACE, CC_CALLBACK_1(GameFrameBase::onEventUserFace, this));
dispatcher->addCustomEventListener(LEAVE_GAME, CC_CALLBACK_1(GameFrameBase::EventLeaveGame, this));
dispatcher->addCustomEventListener(DISMISS_ROOM_EVENT, CC_CALLBACK_1(GameFrameBase::onEventDismissRoom, this));
dispatcher->addCustomEventListener(WEIXIN_SHOW, CC_CALLBACK_1(GameFrameBase::onButtonWeiXinImagic, this));
dispatcher->addCustomEventListener(AUTO_USER_READY_EVENT, CC_CALLBACK_1(GameFrameBase::onEventAutoUserReady, this));
// 录像信息;
m_GameRecord = tagGameRecord(); // 游戏记录
m_iActRecordIdex = 0;
m_RecordTime = 0.f;
m_wRecordSelfChairID = INVALID_CHAIR;
m_wMainGameID = 0; // 主视角GAMEID
m_IsGameRecord = false;
m_voicechairid.clear();
m_VoiceList.clear();
m_fLocationTimer = 0.f;
m_fMusicVolume = 0.f;
m_txtNetWorkTime = nullptr;
m_SystemInfo = nullptr;
m_PlatformNotic = nullptr;
}
GameFrameBase::~GameFrameBase()
{
this->stopAllActions();
auto dispatcher = Director::getInstance()->getEventDispatcher();
dispatcher->removeCustomEventListeners(CONTINUE_GAME);
dispatcher->removeCustomEventListeners(SEND_USER_CHAT_TEXT);
dispatcher->removeCustomEventListeners(SEND_USER_CHAT_FACE);
dispatcher->removeCustomEventListeners(LEAVE_GAME);
dispatcher->removeCustomEventListeners(DISMISS_ROOM_EVENT);
dispatcher->removeCustomEventListeners(WEIXIN_SHOW);
dispatcher->removeCustomEventListeners(AUTO_USER_READY_EVENT);
m_kGameMission.SetClientKernelSink(nullptr);
m_kGameMission.stop();
m_voicechairid.clear();
m_VoiceList.clear();
}
bool GameFrameBase::init()
{
if (!Scene::init())
{
return false;
}
return true;
}
void GameFrameBase::onEnterTransitionDidFinish()
{
Scene::onEnterTransitionDidFinish();
LoadingScene::Instance().show(this);
// 注册语音监听;
YvVoiceManager::GetInstance()->setUploadListern(this);
YvVoiceManager::GetInstance()->setPlayFinishFunc(CC_CALLBACK_0(GameFrameBase::onPlayFinish, this));
}
void GameFrameBase::onExit()
{
Scene::onExit();
CocosDenshion::SimpleAudioEngine::getInstance()->stopBackgroundMusic();
unschedule(schedule_selector(GameFrameBase::onGetNetWorkTime));
}
void GameFrameBase::onClickExitGameButton(cocos2d::Ref*)
{
if (m_kGameMission.isAlive())
{
m_kGameMission.PerformStandUpAction();
}
else
{
ExitGame();
}
}
void GameFrameBase::clearInfo()
{
while (m_kPlayers.size())
{
GamePlayer* pTempPlayer = m_kPlayers[0];
removeGamePlayerToList(pTempPlayer);
DeletePlayer(pTempPlayer);
}
}
void GameFrameBase::ExitGame()
{
clearInfo();
m_kGameMission.stop();
//ScenceManagerBase::Instance().GameBackScence();
//UserInfo::Instance().reqAccountInfo();
}
//继续游戏事件
void GameFrameBase::onEventContinueGame(EventCustom* event)
{
SendUserReady();
}
void GameFrameBase::onEventUserFace(EventCustom* event)
{
CMD_GF_C_UserExpression* pkSendNet = static_cast<CMD_GF_C_UserExpression *>(event->getUserData());
m_kGameMission.SendSocketData(MDM_GF_FRAME, SUB_GF_USER_EXPRESSION, pkSendNet, sizeof(CMD_GF_C_UserExpression));
}
void GameFrameBase::onEventUserChat(EventCustom* event)
{
CMD_GF_C_UserChat* pkSendNet = static_cast<CMD_GF_C_UserChat *>(event->getUserData());
WORD wDataSize = sizeof(CMD_GF_C_UserChat) - sizeof(pkSendNet->szChatString) + pkSendNet->wChatLength*sizeof(pkSendNet->szChatString[0]);
m_kGameMission.SendSocketData(MDM_GF_FRAME, SUB_GF_USER_CHAT, pkSendNet, wDataSize);
}
bool GameFrameBase::RevTalkFile(void* data,int dataSize)
{
DataStream kDataStream(data, dataSize);
tagCloudVoice cloudVoice;
cloudVoice.StreamValue(kDataStream, false);
//if (cloudVoice.dwUserID != getSelfGamePlayer()->GetUserID())
{
m_voicechairid[cloudVoice.strFileID] = cloudVoice.dwUserID;
m_VoiceList.push_back(cloudVoice.strFileID);
cocos2d::log("ADD voice file = %s", cloudVoice.strFileID.c_str());
//m_fMusicVolume = CocosDenshion::SimpleAudioEngine::getInstance()->getBackgroundMusicVolume();
//if (m_fMusicVolume>0.3f)
//{
// CocosDenshion::SimpleAudioEngine::getInstance()->setBackgroundMusicVolume(0.3f);
//}
bool bMusicPlaying = CocosDenshion::SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying();
if (bMusicPlaying)
{
CocosDenshion::SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
}
showVoiceTip();
}
return true;
}
bool GameFrameBase::OnSocketSubUserChat(void* data, int dataSize) //用户文字
{
CMD_GF_S_UserChat* pUserChat = (CMD_GF_S_UserChat*)data;
//效验参数
ASSERT(dataSize <= sizeof(CMD_GF_S_UserChat));
ASSERT(dataSize >= (sizeof(CMD_GF_S_UserChat) - sizeof(pUserChat->szChatString)));
ASSERT(dataSize == (sizeof(CMD_GF_S_UserChat) - sizeof(pUserChat->szChatString) + pUserChat->wChatLength*sizeof(pUserChat->szChatString[0])));
//效验参数
if (dataSize > sizeof(CMD_GF_S_UserChat)) return false;
if (dataSize < (sizeof(CMD_GF_S_UserChat) - sizeof(pUserChat->szChatString))) return false;
if (dataSize != (sizeof(CMD_GF_S_UserChat) - sizeof(pUserChat->szChatString) + pUserChat->wChatLength*sizeof(pUserChat->szChatString[0]))) return false;
GamePlayer* pGamePlayer = getPlayerByUserID(pUserChat->dwSendUserID);
if (pGamePlayer == nullptr) return true;
std::string strChat = utility::a_u8(pUserChat->szChatString);
pGamePlayer->showChatInfo(strChat);
//WORD wViewChairID = SwitchViewChairID(pGamePlayer->GetChairID());
//std::string strChat = utility::a_u8(pUserChat->szChatString);
//showUserChatMsg(wViewChairID, (char*)strChat.c_str(), pos);
return true;
}
bool GameFrameBase::OnSocketSubUserFace(void* data, int dataSize) //用户表情
{
ASSERT(dataSize == sizeof(CMD_GF_S_UserExpression));
if (dataSize != sizeof(CMD_GF_S_UserExpression)) return false;
CMD_GF_S_UserExpression* pUserFace = (CMD_GF_S_UserExpression*)data;
Vec2 pos = GetPlayerPosByUserID(pUserFace->dwSendUserID);
GamePlayer* pGamePlayer = getPlayerByUserID(pUserFace->dwSendUserID);
if (pGamePlayer == nullptr) return true;
WORD wViewChairID = SwitchViewChairID(pGamePlayer->GetChairID());
// 表情;
if (pUserFace->isExpression)
{
ShowUserFace(pUserFace);
}
else
{
// 短语语音路径;
std::string strSoundPath = getShortChatSoundPath(pGamePlayer->GetUserInfo()->cbGender, pUserFace->wItemIndex);
// 短语内容;
std::string strChatInfo = getShortChatInfoByIndex(pUserFace->wItemIndex);
pGamePlayer->showChatInfo(strChatInfo);
if (!strSoundPath.empty())
{
YSAudioEngine::Instance().playEffect(strSoundPath.c_str());
}
}
return true;
}
bool GameFrameBase::ShowUserFace(CMD_GF_S_UserExpression* pUserFace) //用户表情
{
if (pUserFace == nullptr) return false;
Vec2 pos = GetPlayerPosByUserID(pUserFace->dwSendUserID);
//动画
Animation* pAnimate = LoadFaceAnimations(pUserFace->wItemIndex);
ASSERT(pAnimate != nullptr);
if (pAnimate)
{
auto animate = Animate::create(pAnimate);
auto reani = Repeat::create(animate, 2);
auto spritAni = Sprite::create();
spritAni->setAnchorPoint(Point(0.5, 0.5));
spritAni->setPosition(pos);
this->addChild(spritAni, Max_Zorder);
spritAni->runAction(Sequence::create(reani, DelayTime::create(0.2f), RemoveSelf::create(), nullptr));
}
return true;
}
Animation* GameFrameBase::LoadFaceAnimations(uint16 wItemIndex)
{
Animation* pAnimate = nullptr;
AnimationCache* pAnimationCache = AnimationCache::getInstance();
SpriteFrameCache * spriteCache = SpriteFrameCache::getInstance();
std::string strAnimation = StringUtils::format("Platform_Chat_%d", wItemIndex);
pAnimate = pAnimationCache->getAnimation(strAnimation);
if (pAnimate == nullptr)
{
// 创建集合,存每一张图片
Vector< SpriteFrame* > sfme;
std::string strImg;
for (int i = 1; i <= cbFaceCount[wItemIndex]; ++i)
{
// 获取图片名字,加入到集合中
strImg = __String::createWithFormat("Platform/Talk/%d/%d.png", wItemIndex+1, i)->getCString();
Texture2D* pTexture = Director::getInstance()->getTextureCache()->addImage(strImg);
if (nullptr == pTexture) continue;
Rect rect(0, 0, pTexture->getContentSize().width, pTexture->getContentSize().height);
SpriteFrame *fname = SpriteFrame::createWithTexture(pTexture, rect);//spriteCache->getSpriteFrameByName(strImg);
if (fname)
{
sfme.pushBack(fname);
}
}
// ⑤ 创建动画,设置播放速度
pAnimate = Animation::createWithSpriteFrames(sfme, ANIM_DELAY_TIME);
pAnimationCache->addAnimation(pAnimate, strAnimation);
}
return pAnimate;
}
void GameFrameBase::showVoiceTip()
{
if (m_VoiceList.empty())
{
//// 还原背景音乐音量;
//CocosDenshion::SimpleAudioEngine::getInstance()->setBackgroundMusicVolume(m_fMusicVolume);
CocosDenshion::SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
return;
}
std::string strfile = m_VoiceList.front();
std::map<std::string, WORD>::iterator it = m_voicechairid.find(strfile);
if (it != m_voicechairid.end())
{
uint32 dwUserID = it->second;
GamePlayer* pPlayer = getPlayerByUserID(dwUserID);
if (pPlayer == nullptr) return;
pPlayer->showVoiceBubble();
YvVoiceManager::GetInstance()->PlayRecord(strfile);
}
}
void GameFrameBase::hideVoiceTip(const char *filePath)
{
cocos2d::log("hideVoiceTip file = %s", filePath);
m_VoiceList.remove(filePath);
std::map<std::string, WORD>::iterator it = m_voicechairid.find(filePath);
if (it != m_voicechairid.end())
{
uint32 dwUserID = it->second;
GamePlayer* pPlayer = getPlayerByUserID(dwUserID);
if (pPlayer == nullptr) return;
pPlayer->hideVoiceBubble();
cocos2d::log("del voice file = %s", filePath);
}
else
{
#if (CC_PLATFORM_WIN32 == CC_TARGET_PLATFORM)
cocos2d::log("not find voice file = %s", filePath);
ASSERT(false);
#endif
hideAllPlayerVoiceBubble();
}
showVoiceTip();
}
//设置公告控件
void GameFrameBase::SetSystemNode(ImageView* img)
{
if (img == nullptr) return;
// 公告;
m_SystemInfo = img;
CC_ASSERT(m_SystemInfo);
m_SystemInfo->setVisible(false);
m_PlatformNotic = SystemNotice::createSystemNotice("common/Img/Msg_BG.png");
ASSERT(m_PlatformNotic != nullptr);
if (m_PlatformNotic)
{
m_PlatformNotic->setPosition(Vec2(m_SystemInfo->getContentSize().width / 2, m_SystemInfo->getContentSize().height / 2));
m_PlatformNotic->setCascadeOpacityEnabled(true);
m_PlatformNotic->setCallBack([this](){
m_SystemInfo->setVisible(false);
});
m_SystemInfo->addChild(m_PlatformNotic);
}
}
//系统消息
bool GameFrameBase::OnSocketSubGameSystemMessage(void* data, int dataSize)
{
CMD_CM_SystemMessage * pSystemMessage = (CMD_CM_SystemMessage *)data;
uint16 wHeadSize = sizeof(CMD_CM_SystemMessage) - sizeof(pSystemMessage->szString);
//效验参数
ASSERT((dataSize > wHeadSize) && (dataSize == (wHeadSize + pSystemMessage->wLength*sizeof(char))));
if ((dataSize <= wHeadSize) || (dataSize != (wHeadSize + pSystemMessage->wLength*sizeof(char)))) return false;
uint16 wType = pSystemMessage->wType;
//弹出消息
if (wType&SMT_EJECT)
{
PopScene::Instance().show(utility::a_u8(pSystemMessage->szString));
}
//系统消息
if (wType&SMT_TABLE_ROLL)
{
ShowRollMessage(pSystemMessage->szString, 0, true);
}
//关闭游戏
if (((wType&(SMT_EJECT | SMT_TABLE_ROLL)) == 0) && (wType&(SMT_CLOSE_ROOM | SMT_CLOSE_GAME | SMT_CLOSE_LINK)) != 0)
{
EventLeaveGame(nullptr);
}
return true;
}
// 添加公告信息;
void GameFrameBase::ShowRollMessage(const std::string& message, int repeat /*= 0*/, bool bForever /*= false*/)
{
if (m_PlatformNotic)
{
m_PlatformNotic->postMessage(utility::a_u8(message), repeat, bForever);
m_SystemInfo->setVisible(true);
}
}
//旁观消息
bool GameFrameBase::OnEventLookonMode(void* data, int dataSize)
{
return true;
}
//场景消息
bool GameFrameBase::OnEventSceneMessage(uint8 cbGameStatus, bool bLookonUser, void* data, int dataSize)
{
return true;
}
//场景消息
bool GameFrameBase::OnEventGameMessage(int sub, void* data, int dataSize)
{
std::vector<NET_CBInfo*> kCallFun;
NET_CBInfoList::iterator itor1 = m_kCBInfoList.begin();
while (itor1 != m_kCBInfoList.end())
{
if (itor1->iIdex == sub)
{
kCallFun.push_back(&(*itor1));
}
itor1++;
}
std::vector<NET_CBInfo*>::iterator itor2 = kCallFun.begin();
while (itor2 != kCallFun.end())
{
utility::mlog((*itor2)->kCallFunName.c_str());
((*itor2)->pCallBack)(data, dataSize);
itor2++;
}
return true;
}
//发送函数
bool GameFrameBase::SendSocketData(uint16 wSubCmdID)
{
utility::mlog("GameFrameBase::SendSocketData ", (int)wSubCmdID);
return m_kGameMission.SendSocketData(MDM_GF_GAME, wSubCmdID);
}
//发送函数
bool GameFrameBase::SendSocketData(uint16 wSubCmdID, void * data, uint16 dataSize)
{
return m_kGameMission.SendSocketData(MDM_GF_GAME, wSubCmdID, data, dataSize);
}
//发送准备
bool GameFrameBase::SendUserReady()
{
ResetAllData();
return m_kGameMission.SendSocketData(MDM_GF_FRAME, SUB_GF_USER_READY, 0, 0);
}
void GameFrameBase::addNetCB(int iIdex, cocos2d::Ref* pScence, std::function<void(void*, int)> pCallBack, std::string kCallName)
{
NET_CBInfo kInfo;
kInfo.iIdex = iIdex;
kInfo.pCallBack = pCallBack;
kInfo.pSrc1 = pScence;
kInfo.kCallFunName = kCallName;
m_kCBInfoList.push_back(kInfo);
}
//关闭游戏
void GameFrameBase::CloseGameClient()
{
ExitGame();
return;
}
//游戏重连
void GameFrameBase::ReconnectServer()
{
if (!m_bPrivateEnd && !m_IsGameRecord)
{
LoadingScene::Instance().show(this);
this->stopAllActions();
m_kGameMission.stop();
ResetTable();
// 清空语音信息;
m_voicechairid.clear();
m_VoiceList.clear();
m_kGameMission.start();
}
}
//获取快捷语音文件路径;
const std::string GameFrameBase::getShortChatSoundPath(uint8 cbGender, int nIndex)
{
// 短语;
std::string strFilePath = "common/sound/chat/";
if ( cbGender == enMan)
{
strFilePath += StringUtils::format("man_chat%d.mp3", nIndex+1);
}
else
{
strFilePath += StringUtils::format("woman_chat%d.mp3", nIndex+1);
}
return strFilePath;
}
GamePlayer* GameFrameBase::getPoolPlayer(IClientUserItem * pIClientUserItem)
{
GamePlayer* pPlayer = NULL;
if (m_kPoolPlayer.size())
{
pPlayer = m_kPoolPlayer.back();
m_kPoolPlayer.pop_back();
pPlayer->setUserItem(pIClientUserItem);
}
return pPlayer;
}
GamePlayer* GameFrameBase::CreatePlayer(IClientUserItem * pIClientUserItem)
{
GamePlayer* pPlayer = getPoolPlayer(pIClientUserItem);
if (pPlayer)
{
return pPlayer;
}
return new GamePlayer(pIClientUserItem);
}
void GameFrameBase::DeletePlayer(GamePlayer* pPlayer)
{
if (utility::haveInVector(m_kPoolPlayer, pPlayer))
{
return;
}
m_kPoolPlayer.push_back(pPlayer);
}
GamePlayer* GameFrameBase::getGamePlayerByUserItem(IClientUserItem * pIClientUserItem)
{
std::vector<GamePlayer*>::iterator itor = m_kPlayers.begin();
for (; itor != m_kPlayers.end(); itor++)
{
if ((*itor)->getUserItem() == pIClientUserItem)
{
return (*itor);
}
}
return NULL;
}
GamePlayer* GameFrameBase::getPlayerByChairID(uint16 wChairID)
{
std::vector<GamePlayer*>::iterator itor = m_kPlayers.begin();
for (; itor != m_kPlayers.end(); itor++)
{
if ((*itor)->GetChairID() == wChairID)
{
return (*itor);
}
}
cocos2d::log("getPlayerByChairID(%d) is null", wChairID);
return NULL;
}
GamePlayer* GameFrameBase::getPlayerByUserID(uint32 wUserID)
{
std::vector<GamePlayer*>::iterator itor = m_kPlayers.begin();
for (; itor != m_kPlayers.end(); itor++)
{
if ((*itor)->GetUserID() == wUserID)
{
return (*itor);
}
}
return NULL;
}
void GameFrameBase::addGamePlayerToList(GamePlayer* pPlayer)
{
CCAssert(pPlayer->getUserItem(), "");
if (!utility::haveInVector(m_kPlayers, pPlayer))
{
m_kPlayers.push_back(pPlayer);
}
pPlayer->PlayerEnter();
pPlayer->upPlayerInfo();
pPlayer->upPlayerState();
// 玩家进入;
OnEventUserEnter(pPlayer);
}
void GameFrameBase::removeGamePlayerToList(GamePlayer* pPlayer)
{
if (m_pSelfPlayer == pPlayer)
{
m_pSelfPlayer = NULL;
}
utility::removeInVector(m_kPlayers, pPlayer);
pPlayer->PlayerLeave();
pPlayer->setUserItem(NULL);
}
GamePlayer* GameFrameBase::getSelfGamePlayer()
{
return m_pSelfPlayer;
}
uint16 GameFrameBase::getSelfChairID()
{
if (m_pSelfPlayer == NULL)
{
return 0;
}
return m_pSelfPlayer->GetChairID();
}
void GameFrameBase::hideAllPlayerVoiceBubble()
{
std::vector<GamePlayer*>::iterator itor = m_kPlayers.begin();
for (; itor != m_kPlayers.end(); itor++)
{
GamePlayer* pPlayer = (*itor);
if (pPlayer != nullptr)
{
pPlayer->hideVoiceBubble();
}
}
}
//用户进入;
void GameFrameBase::OnEventUserEnter(IClientUserItem * pIClientUserItem, bool bLookonUser)
{
GamePlayer* pPlayer = getGamePlayerByUserItem(pIClientUserItem);
if (pPlayer)
{
pPlayer->upPlayerInfo();
return;
}
IClientUserItem * pMeItem = GetMeUserItem();
if (!pMeItem)
{
return;
}
if (pMeItem->GetTableID() != pIClientUserItem->GetTableID())
{
return;
}
if (pIClientUserItem->GetUserStatus() == US_LOOKON)
{
return;
}
if ( GetMeUserItem() == pIClientUserItem)
{
CCAssert(m_pSelfPlayer == NULL, "");
m_pSelfPlayer = CreatePlayer(pIClientUserItem);
if (m_pSelfPlayer == NULL)
{
return;
}
//m_pSelfPlayer->SetHeadHttp(UserInfo::Instance().getHeadHttp());
addGamePlayerToList(m_pSelfPlayer);
upSelfPlayerInfo();
// 同步地理位置;
tagUserAddr* pUserAddr = CGlobalUserInfo::GetInstance()->GetUserAddr();
m_pSelfPlayer->SetLocation(pUserAddr);
int iIdex = 0;
while (true)
{
IClientUserItem* pTempUserItem = GetTableUserItem(iIdex);
iIdex++;
if (!pTempUserItem)
{
break;
}
if (pTempUserItem->GetTableID() != pMeItem->GetTableID())
{
continue;
}
if (pTempUserItem->GetUserStatus() == US_LOOKON)
{
continue;
}
//if (m_bEnterGetUserInfo)
//{
// m_kIndividualMission.query(pIClientUserItem->GetUserID(), false);
//}
if (pTempUserItem == pIClientUserItem)
{
continue;
}
GamePlayer* pTempPlayer = CreatePlayer(pTempUserItem);
addGamePlayerToList(pTempPlayer);
}
// 启动网络延迟获取
if (!m_IsGameRecord)
{
m_PingTime.dwPingCount = 0;
schedule(schedule_selector(GameFrameBase::onGetNetWorkTime), 5.f);
}
}
else
{
if (m_pSelfPlayer)
{
GamePlayer* pTempPlayer = CreatePlayer(pIClientUserItem);
addGamePlayerToList(pTempPlayer);
}
}
}
//用户离开
void GameFrameBase::OnEventUserLeave(IClientUserItem * pIClientUserItem, bool bLookonUser)
{
GamePlayer* pPlayer = getGamePlayerByUserItem(pIClientUserItem);
if (pPlayer)
{
OnEventUserLeave(pPlayer);
removeGamePlayerToList(pPlayer);
DeletePlayer(pPlayer);
}
}
//用户积分
void GameFrameBase::OnEventUserScore(IClientUserItem * pIClientUserItem, bool bLookonUser)
{
GamePlayer* pPlayer = getGamePlayerByUserItem(pIClientUserItem);
if (pPlayer)
{
pPlayer->upPlayerInfo();
OnUserScore(pPlayer);
}
//if (pPlayer == m_pSelfPlayer)
//{
// upSelfPlayerInfo();
//}
}
//用户状态
void GameFrameBase::OnEventUserStatus(IClientUserItem * pIClientUserItem, bool bLookonUser)
{
GamePlayer* pPlayer = getGamePlayerByUserItem(pIClientUserItem);
if (pPlayer)
{
pPlayer->upPlayerState();
OnEventUserStatus(pPlayer);
}
}
//用户属性
void GameFrameBase::OnEventUserAttrib(IClientUserItem * pIClientUserItem, bool bLookonUser)
{
GamePlayer* pPlayer = getGamePlayerByUserItem(pIClientUserItem);
if (pPlayer)
{
pPlayer->upPlayerInfo();
}
if (pPlayer == m_pSelfPlayer)
{
upSelfPlayerInfo();
}
}
//用户头像
void GameFrameBase::OnEventCustomFace(IClientUserItem * pIClientUserItem, bool bLookonUser)
{
GamePlayer* pPlayer = getGamePlayerByUserItem(pIClientUserItem);
if (pPlayer)
{
pPlayer->upPlayerInfo();
}
}
void GameFrameBase::onGPAccountInfoHttpIP(uint32 dwUserID, std::string strIP, std::string strHttp)
{
GamePlayer * pPlayer = getPlayerByUserID(dwUserID);
if (!pPlayer)
{
return;
}
IClientUserItem * pIClientUserItem = pPlayer->getUserItem(false);
if (!pIClientUserItem)
{
return;
}
//获取用户
tagUserInfo * pUserInfo = pIClientUserItem->GetUserInfo();
strncpy(pUserInfo->szLogonIP, strIP.c_str(), countarray(pUserInfo->szLogonIP));
strncpy(pUserInfo->szHeadHttp, strHttp.c_str(), countarray(pUserInfo->szHeadHttp));
pPlayer->upPlayerInfo();
}
//用户位置
void GameFrameBase::onEventUserLocation(IClientUserItem * pIClientUserItem, CMD_GF_S_UserLocation* pLocation)
{
GamePlayer* pPlayer = getGamePlayerByUserItem(pIClientUserItem);
if (pPlayer)
{
pPlayer->SetLocation(pLocation);
}
}
IClientUserItem* GameFrameBase::GetMeUserItem()
{
return m_kGameMission.GetMeUserItem();
}
IClientUserItem* GameFrameBase::GetTableUserItem(uint16 wChariID)
{
return m_kGameMission.GetTableUserItem(wChariID);
}
//设置连接服务器
void GameFrameBase::SetServerItem(CGameServerItem* pServerItem)
{
return m_kGameMission.SetServerItem(pServerItem);
}
//加载短语内容;
void GameFrameBase::loadShortChat(const std::string& strFilePath)
{
std::vector <std::string>().swap(m_vecShortChatList);
auto str = cocos2d::FileUtils::getInstance()->getStringFromFile(strFilePath);
rapidjson::Document doc;
doc.Parse<0>(str.c_str());
if (doc.HasParseError() || !doc.IsArray())
{
return;
}
if (!doc.HasParseError() && doc.IsArray())
{
for (rapidjson::SizeType i = 0; i < doc.Size(); ++i)
{
const rapidjson::Value& v = doc[i];
std::string strChatInfo = v.GetString();
m_vecShortChatList.push_back(strChatInfo);
}
}
}
//获取快捷语列表;
const std::vector<std::string>& GameFrameBase::getShortChatList()
{
return m_vecShortChatList;
}
//获取快捷语文字;
std::string GameFrameBase::getShortChatInfoByIndex(int nIndex)
{
if ((int)m_vecShortChatList.size() <= nIndex)
{
return "";
}
return m_vecShortChatList[nIndex];
}
/**************************************************** 游戏内事件处理 BEGIN ****************************************************/
// 离开游戏事件
void GameFrameBase::EventLeaveGame(cocos2d::EventCustom *event)
{
Director::getInstance()->popScene();
}
void GameFrameBase::onEventDismissRoom(cocos2d::EventCustom *event)
{
__Bool* pBool = (__Bool*)event->getUserData();
onEventAgreeDismissRoom(pBool->getValue());
}
// 自由人数场玩家准备
void GameFrameBase::onEventAutoUserReady(cocos2d::EventCustom *event)
{
__Bool* pBool = (__Bool*)event->getUserData();
bool bAgree = pBool->getValue();
m_kGameMission.SendSocketData(MDM_GF_FRAME, SUB_GF_USER_START_READY, &bAgree, sizeof(bAgree));
//if (bAgree)
//{
// ResetAllData();
// m_kGameMission.SendSocketData(MDM_GF_FRAME, SUB_GF_USER_START_READY, 0, 0);
//}
//else
//{
// ResetAllData();
// m_kGameMission.SendSocketData(MDM_GF_FRAME, SUB_GF_USER_NO_READY, 0, 0);
//}
}
// 私人场结束(子游戏掉线主动关闭网络);
void GameFrameBase::PrivateRoomEnd()
{
std::vector<GamePlayer*>::iterator itor = m_kPlayers.begin();
for (; itor != m_kPlayers.end(); itor++)
{
GamePlayer* player = (*itor);
player->setAllowLeave(false);
}
m_kGameMission.stop();
}
// 同意解散房间
void GameFrameBase::onEventAgreeDismissRoom(bool bAgree/* = true*/)
{
CMD_GR_Dismiss_Private kNetInfo;
kNetInfo.bDismiss = bAgree ? 1 : 0;
m_kGameMission.SendSocketData(MDM_GR_PRIVATE, SUB_GR_PRIVATE_DISMISS, &kNetInfo, sizeof(kNetInfo));
}
// 截图分享
void GameFrameBase::onButtonWeiXinImagic(Ref*)
{
std::function<void(bool, const std::string&)> afterCaptured = [this](bool bSucceed, std::string name)
{
if (bSucceed)
{
MissionWeiXin::Instance().shareScreenWeiXin(name);
#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS
// 删除文件;
FileUtils::getInstance()->removeFile(name);
#endif
}
};
cocos2d::utils::captureScreen(afterCaptured, "screenshot.jpg");
//SelectShareScene::Instance().shareImage();
}
/**/
void GameFrameBase::OnSocketSubPrivateScoreInfo(CMD_GF_Private_Score_Info* pNetInfo)
{
m_PrivateScoreInfo = *pNetInfo;
}
/**************************************************** 游戏内事件处理 END ****************************************************/
//////////////////////////////// 游戏录像 //////////////////////////////////////////
// 设置游戏录像资源
bool GameFrameBase::SetGameRecord(DataStream &kDataStream)
{
return m_GameRecord.StreamValue(kDataStream, false);
}
// 设置自己的视角
void GameFrameBase::SetMainGameID(DWORD dwGameID, bool isGameRecord)
{
m_wMainGameID = dwGameID;
m_IsGameRecord = isGameRecord;
// 操作菜单
m_pMeunNOde = static_cast<Node*>(CSLoader::createNode("Games/GameRecord/GameRecordNode.csb"));
this->addChild(m_pMeunNOde, 999);
this->uiMenuInit();
}
// 菜单初始化
void GameFrameBase::uiMenuInit()
{
if (m_pMeunNOde == nullptr) return;
m_sprRepBg = (Sprite*)m_pMeunNOde->getChildByName("rep_btnbackui");
CC_ASSERT(m_sprRepBg!=nullptr);
m_btnExit = (Button*)m_pMeunNOde->getChildByName("btnExit");
ASSERT(m_btnExit);
m_btnExit->addClickEventListener([=](Ref *pSender){
YSAudioEngine::Instance().playBtnClickEffect();
Director::getInstance()->popScene();
});
m_btnBackWard = (Button*)m_sprRepBg->getChildByName("btnBackWard");
ASSERT(m_btnBackWard);
m_btnBackWard->addClickEventListener(CC_CALLBACK_1(GameFrameBase::LeftRecordAction, this));
m_btnForward = (Button*)m_sprRepBg->getChildByName("btnForward");
ASSERT(m_btnForward);
m_btnForward->addClickEventListener(CC_CALLBACK_1(GameFrameBase::RightRecordAction, this));
m_btnPlay = (Button*)m_sprRepBg->getChildByName("btnPlay");
ASSERT(m_btnPlay);
m_btnPlay->setVisible(false);
m_btnPlay->addClickEventListener([=](Ref *pSender){
YSAudioEngine::Instance().playBtnClickEffect();
if (m_iActRecordIdex >= (int)m_GameRecord.actionVec.size())
{
m_btnPlay->setVisible(true);
m_btnPause->setVisible(false);
return;
}
m_btnPlay->setVisible(false);
m_btnPause->setVisible(true);
schedule(schedule_selector(GameFrameBase::NextRecordAction), m_RecordTime);
});
m_btnPause = (Button*)m_sprRepBg->getChildByName("btnPause");
ASSERT(m_btnPause);
m_btnPause->addClickEventListener([=](Ref *pSender){
YSAudioEngine::Instance().playBtnClickEffect();
m_btnPlay->setVisible(true);
m_btnPause->setVisible(false);
unschedule(schedule_selector(GameFrameBase::NextRecordAction));
});
m_txtRecordPercent = (Text*)m_pMeunNOde->getChildByName("txtRecordPercent");
ASSERT(m_txtRecordPercent);
m_txtRecordPercent->setString("0%");
}
// 开始录像播放
bool GameFrameBase::StartRecord(WORD wGamePlayer)
{
LoadingScene::Instance().hide();
if (m_GameRecord.playersVec.size() > wGamePlayer)
{
return false;
}
m_RecordTime = RECORD_PLAY_TIME;
m_wRecordSelfChairID = 0;
// 初始化房间信息;
OnSocketSubPrivateRoomInfo(&m_GameRecord.roomInfo);
int nRealUserCount = m_GameRecord.playersVec.size();
// 获取自己椅子号
for (int i = 0; i < nRealUserCount; i++)
{
tagGameRecordPlayer& kRecordPlayer = m_GameRecord.playersVec[i];
if (kRecordPlayer.dwGameID == m_wMainGameID)
{
m_wRecordSelfChairID = kRecordPlayer.wChairID;
break;
}
}
// 显示所有玩家(从自己开始);
tagGameRecordPlayer& kSelfRecordPlayer = m_GameRecord.playersVec[m_wRecordSelfChairID];
m_kGameMission.InitRecordGamePlayer(m_wRecordSelfChairID, kSelfRecordPlayer);
for (WORD i = 0; i < nRealUserCount; i++)
{
if (i == m_wRecordSelfChairID) continue;
//WORD wNext = (m_wRecordSelfChairID + i) % wGamePlayer;
tagGameRecordPlayer& kRecordPlayer = m_GameRecord.playersVec[i];
m_kGameMission.InitRecordGamePlayer(kRecordPlayer.wChairID, kRecordPlayer);
}
m_iActRecordIdex = 0;
m_txtRecordPercent->setString(utility::toString(m_iActRecordIdex * 100 / m_GameRecord.actionVec.size(), "%"));
StartGameRecord();
return true;
}
void GameFrameBase::LeftRecordAction(Ref* ref)
{
YSAudioEngine::Instance().playBtnClickEffect();
if (m_iActRecordIdex < (int)m_GameRecord.actionVec.size())
{
unschedule(schedule_selector(GameFrameBase::NextRecordAction));
m_RecordTime += 0.5f;
schedule(schedule_selector(GameFrameBase::NextRecordAction), m_RecordTime);
}
}
void GameFrameBase::RightRecordAction(Ref* ref)
{
YSAudioEngine::Instance().playBtnClickEffect();
if (m_iActRecordIdex < (int)m_GameRecord.actionVec.size())
{
unschedule(schedule_selector(GameFrameBase::NextRecordAction));
m_RecordTime -= 0.5f;
if (m_RecordTime < 0.2f)
{
m_RecordTime = 0.5f;
}
schedule(schedule_selector(GameFrameBase::NextRecordAction), m_RecordTime);
}
}
void GameFrameBase::onUpLoadFileListern(YVSDK::UpLoadFileRespond* resp)
{
GamePlayer* pGamePlayer = getSelfGamePlayer();
if (pGamePlayer!=nullptr)
{
std::string url = resp->fileurl;
tagCloudVoice cloudVoice;
cloudVoice.dwUserID = pGamePlayer->GetUserID();
cloudVoice.strFileID = url;
DataStream kDataStream;
cloudVoice.StreamValue(kDataStream, true);
m_kGameMission.SendSocketData(MDM_GF_FRAME, SUB_GR_TABLE_TALK, &kDataStream[0], kDataStream.size());
}
}
// 语音播放完成;
void GameFrameBase::onPlayFinish()
{
if (m_VoiceList.size()>0)
{
std::string strfile = m_VoiceList.front();
hideVoiceTip(strfile.c_str());
}
else
{
hideAllPlayerVoiceBubble();
}
}
// 定时获取网络延迟
void GameFrameBase::onGetNetWorkTime(float delta)
{
if (m_kGameMission.isAlive())
{
m_PingTime.dwPingCount++;
m_llNetWorkTime = JniFun::getCurrTime();
m_kGameMission.SendSocketData(MDM_GF_FRAME, SUB_GF_PING_TIME, &m_PingTime, sizeof(m_PingTime));
m_fLocationTimer += delta;
if (m_fLocationTimer>180.f)
{
//发送地里位置;
tagUserAddr* pUserAddr = CGlobalUserInfo::GetInstance()->GetUserAddr();
if (pUserAddr && pUserAddr->isInit)
{
CMD_GF_C_UserLocation _location;
zeromemory(&_location, sizeof(_location));
_location.lLatitude = pUserAddr->latitude * DOUBLE_TO_SCORE;
_location.lLongitude = pUserAddr->longitude * DOUBLE_TO_SCORE;
_location.lAccuracy = pUserAddr->accuracy * DOUBLE_TO_SCORE;
strncpy(_location.szAddress, pUserAddr->strAddress.c_str(), countarray(_location.szAddress));
m_kGameMission.SendSocketData(MDM_GF_FRAME, SUB_GF_USER_LOCATION, &_location, sizeof(_location));
m_fLocationTimer = 0.f;
}
}
}
}
bool GameFrameBase::OnSocketSubNetWorkTime(void* data, int dataSize)
{
ASSERT(sizeof(CMD_GF_S_PingTime) == dataSize);
if (sizeof(CMD_GF_S_PingTime) != dataSize) return false;
CMD_GF_S_PingTime* pingtime = (CMD_GF_S_PingTime*)data;
if (m_PingTime.dwPingCount != pingtime->dwPingCount) return false;
long long llNetTime = JniFun::getCurrTime() - m_llNetWorkTime;
if ((llNetTime >= 0) && m_txtNetWorkTime)
{
m_txtNetWorkTime->setString(StringUtils::format("%lldms", llNetTime));
if (llNetTime > 500)
{
m_txtNetWorkTime->setTextColor(Color4B(255, 0, 0, 255));
}
else if (llNetTime > 300)
{
m_txtNetWorkTime->setTextColor(Color4B(255, 255, 0, 255));
}
else
{
m_txtNetWorkTime->setTextColor(Color4B(0, 255, 0, 255));
}
}
return true;
}