#pragma once #include "cocos2d.h" #include "cocostudio/CocoStudio.h" #include "cocostudio/CCArmature.h" #include "ui/CocosGUI.h" #include "GameFrameBase.h" #include "PlatformHeader.h" #include "13S_CMD.h" #include "13S_GamePlayer.h" #include "13S_GameLogic.h" #include "13S_OperateCardPanel.h" #include "13S_OpenResultScene.h" #include "13S_GameOverAni.h" USING_NS_CC; using namespace cocostudio; using namespace std; using namespace ui; namespace SSS_SPACE { enum SSS_OPERATE_STATUS { SSS_OS_NULL = 0, // 无操作; SSS_OS_CALLBANK, // 其他人叫庄; SSS_OS_ADDSCORE0, // 其他人加注; SSS_OS_ADDSCORE1, // 自己加注; }; class SSSGameScene : public GameFrameBase { public: //创建场景; CREATE_FUNC(SSSGameScene); static std::string getGameRule(uint32 dwGameRule); //场景初始化; virtual bool init(); //进场动画完成回调; virtual void onEnterTransitionDidFinish(); //场景退出; virtual void onExit(); public: //椅子号视图转换; virtual WORD SwitchViewChairID(WORD wChairID); //更新玩家信息; virtual void upSelfPlayerInfo(); //初始化场景; void initScene(); //绑定网络消息; void initNet(); //重置场景; void resetScene(bool bAll=false); //重置数据; void resetData(); //重置数据; void ResetAllData(); //重置桌子(相当于玩家离开); virtual void ResetTable(); //获取快捷语音文件路径; virtual const std::string getShortChatSoundPath(uint8 cbGender, int nIndex); private: //场景消息; virtual bool OnEventSceneMessage(uint8 cbGameStatus, bool bLookonUser, void* pData, int nDataSize); //恢复空闭场景; bool onGameSceneFree(void* pData, int nDataSize); //抢庄场景; bool onGameSceneRobBanker(void* pData, int nDataSize); //下注场景; bool onGameSceneUserChip(void* pData, int nDataSize); //发牌场景; bool onGameSceneSendCard(void* pData, int nDataSize); //开牌场景; bool onGameSceneOpenCard(void* pData, int nDataSize); //比牌场景; bool onGameSceneCompareCard(void* pData, int nDataSize); //游戏消息处理; //游戏开始; void onSubGameStart(const void * pBuffer, uint16 wDataSize); //开始抢庄; void onSubStartRob(const void * pBuffer, uint16 wDataSize); //玩家抢庄; void onSubUserRob(const void * pBuffer, uint16 wDataSize); //开始下注; void onSubStartChip(const void * pBuffer, uint16 wDataSize); //玩家下注; void onSubUserChip(const void * pBuffer, uint16 wDataSize); //发送剩下的牌; void onSubSendLeftCard(const void * pBuffer, uint16 wDataSize); //开始开牌; void onSubStartOpen(const void * pBuffer, uint16 wDataSize); //开牌; void onSubOpenCard(const void * pBuffer, uint16 wDataSize); //经典玩法比牌结果; void onSubClassicCompareCard(const void * pBuffer, uint16 wDataSize); //带庄家比牌结果; void onSubBankerCompareCard(const void * pBuffer, uint16 wDataSize); //游戏结束; void onSubGameEnd(const void * pBuffer, uint16 wDataSize); //用户进入; virtual void OnEventUserEnter(GamePlayer * pPlayer); //玩家状态改变; virtual void OnEventUserStatus(GamePlayer * pPlayer); //玩家金币改变; virtual void OnUserScore(GamePlayer* pPlayer); //玩家坐标; virtual Vec2 GetPlayerPosByUserID(uint32 dwUserID); //创建玩家; virtual GamePlayer* CreatePlayer(IClientUserItem * pIClientUserItem); //点击比牌按钮; void onCompareButtonClick(Ref* pSender); //点击随便机组牌按钮; void onRandomButtonClick(Ref* pSender); //点击重置按钮; void onResetButtonClick(Ref* pSender); //点击邀请按钮; void onInviteButtonClick(Ref* pSender); //点击重选按钮; void onRechooseButtonClick(Ref* pSender); //面板触摸事件; void onPanelTouchEvent(Ref* pSender, Widget::TouchEventType iEventType); //抢注按钮点击事件; void onRobYesButtonClick(Ref* pSender); //抢注按钮点击事件; void onRobNoButtonClick(Ref* pSender); //压注按钮点击事件; void onYaZhuButtonClick(Ref* pSender); //不摆特殊牌按钮点击事件; void onRefuseCardsButtonClick(Ref* pSender); //确定特殊牌按钮点击事件; void onCommitSpecialButtonClick(Ref* pSender); //一对; void onDuiZiButtonClick(Ref* pSender); //两对; void onLiangDuiButtonClick(Ref* pSender); //三条; void onSanTiaoButtonClick(Ref* pSender); //顺子; void onShunZiButtonClick(Ref* pSender); //同花; void onTongHuaButtonClick(Ref* pSender); //葫芦; void onHuLuButtonClick(Ref* pSender); //铁支; void onTieZhiButtonClick(Ref* pSender); //同花顺; void onTongHuaShunButtonClick(Ref* pSender); // 开始发牌; void startSendCardAni(); // 开始比牌; void startCompareCardAni(); // 动画回调; void movementEventCallFunc(cocostudio::Armature *armature, cocostudio::MovementEventType movementType, const std::string& movementID); // 定时器; void openClock(Sprite* sprClock, int iLeftTime, const std::function& callFunc=nullptr); // 开启定时器; void closeClock(Sprite* sprClock); //选牌回调; void selectCardCallback(uint8* pCardData, uint8 cbCardCount); // 显示玩家牌; void showAllPlayersCard(); // 播放结束积分动画; void playResultScoreAni(int nIndex, SCORE lScore, SCORE lXinScore); //显示操作面板; void showOperatePanel(bool bShow); //显示特殊牌面板; void showSpecialPanel(bool bShow); void addTricksCard(int nIndex, uint8 aryCardData[SSS_MAX_ITEM_COUNT], uint8 cbCardCount); //加入选择面板; bool inTricksCardPanel(int nIndex, uint8 cbCardData); //选择结束; void onChooseFinished(); //一道牌动画播放完成; void oneGroupFinished(); //检测是否有特殊牌动画; void checkSpecialTypeAni(); //特殊牌动画播放完成; void specialTypeAniFinished(); //检测是否有全垒打动画; void checkKillAllAni(); //全垒打动画播放完成; void killAllAniFinished(); void oneShootFinished(tagSSSTwoGunInfos* pGunInfos); //打枪加分动画结束; void shootScoreAniFinished(); //更新牌类型按钮状态; void updateCardTypeButtons(); //禁用牌类型按钮状态; void disableCardTypeButtons(); // 获到性别字符串; std::string getUserGender(int cbGender); // 播放发牌声音; void playSendCardEffect(); // 播放特殊牌型声音; void playSpecialTypeEffect(uint8 cbGender, uint8 cbCardType); // 播放快捷语音; void playFastVoice(int cbGender, int voiceIndex); // 播放音效; void playEffect(std::string strPath); // 播放点击音效; void playBtnClickEffect(); //发牌结束; void sendSendCardOverMsg(); //开牌操作; void sendOpenCardMsg(); //比牌完成; void sendCompareOverMsg(); //显示当前手牌; void showCurHandCard(uint8 cbCardCount); //显示庄家图标; void showBankerIcon(); // 设置状态; void setOperateStatus(SSS_OPERATE_STATUS ops); //牌型A32转32A; bool cardTypeTo32A(const uint8 arySrcCardData[SSS_MAX_ITEM_COUNT], const uint8 cbCardCount, uint8* aryTargetCardData, const uint8 cbTargetCardCount); //检测扑克牌摆放规则; bool checkCardPutRule(); // 获取当前玩家数量; uint8 getCurPlayerCount(); //私人场; public: //私人场信息; virtual void OnSocketSubPrivateRoomInfo(CMD_GF_Private_Room_Info* pNetInfo); //私人场结束; virtual void OnSocketSubPrivateEnd(void* data, int dataSize); //私人场解散信息; virtual void OnSocketSubPrivateDismissInfo(CMD_GF_Private_Dismiss_Info* pNetInfo); //私人场解散结果; virtual void OnSocketSubPrivateDismissResult(CMD_GF_Private_Dismiss_Result* pNetInfo); //自由人数场玩家状态; virtual void OnSocketSubPrivateAutoUserStatus(tagAutoUserStatus* pNetInfo){} //自由人数 virtual void OnSocketSubPrivateAutoUserReady(CMD_GR_Private_ReadyInfo* pNetInfo){} //显示结算信息; void onEventShowPrivate(cocos2d::EventCustom *event); //按住语音按钮; void OnButtonVoiceTouched(Ref*, Widget::TouchEventType); void ShowGameRule(CMD_GF_Private_Room_Info* pNetInfo); //录像处理; public: virtual void StartGameRecord(); virtual void NextRecordAction(float dt); private: //私人场信息; CMD_GF_Private_Room_Info m_PrivateRoomInfo; uint32 m_dwRoomID; //房间号; uint32 m_dwPlayCout; //局数; Node* m_pVoiceNode; //语音标志; bool m_bClassicRule; //是否是经典规则; uint8 _cbGameStatus; //游戏状态; uint16 _wBuildCardTime; //配置时间; uint16 _wRobBankerTime; //抢庄时间; uint16 _wUserChipTime; //下注时间; SCORE _iBaseScore; //底注; uint8 _cbSendCardCount; //发牌数量; uint16 _wBankerUser; //庄家玩家; uint8 _cbCurOpenCardAniIndex; //当前播放动画索引; uint16 _wSelfSpecialType; //特殊牌型; uint16 _wKillAllUserChairID; //全垒打用户椅子号; uint8 _aryActiveStatus[SSS_GAME_PLAYER]; //玩家手牌状态; uint8 _aryHandCardData[SSS_HAND_CARD_COUNT]; //手牌数据; uint16 _arySpecialType[SSS_GAME_PLAYER]; //特殊牌类型; int _arySpecialCompareResult[SSS_GAME_PLAYER]; //特殊牌型比较结果; int _aryThreeKillResult[SSS_GAME_PLAYER]; //全垒打加减分; uint8 _aryTricksFrontCard[SSS_MIN_ITEM_COUNT]; uint8 _aryTricksMidCard[SSS_MAX_ITEM_COUNT]; uint8 _aryTricksBackCard[SSS_MAX_ITEM_COUNT]; uint8 _aryFrontCard[SSS_GAME_PLAYER][SSS_MIN_ITEM_COUNT]; //玩家前墩; uint8 _aryMidCard[SSS_GAME_PLAYER][SSS_MAX_ITEM_COUNT]; //玩家中墩; uint8 _aryBackCard[SSS_GAME_PLAYER][SSS_MAX_ITEM_COUNT]; //玩家后墩; //界面; Node* m_rootNode; //场景; Layout* _MainPanel; ImageView* _imgRoomInfo; Layout* _RoundPanel; Text* _txtRoomID; Text* _txtRoomRule; Text* _txtJushu; Layout* _ButtonPanel; Layout* _SendCardPanel; Button* _btnInvite; Button* _btnDismiss; Button* _btnLeave; // 离开按钮; Button* _btnVoice; Button* _btnChat; Button* _btnStartGame; Layout* _RobPanel; // 抢庄面板; Layout* _YaZhuPanel; // 压注面板; Button* _btnRobYes; // 抢庄; Button* _btnRobNo; // 不抢庄; Button* _aryButtonScore[3]; // 压注按钮; Layout* _SpecialPanel; Layout* _OperatePanel; SSSOperateCardPanel* _OperateCardPanel; SSSOpenResultScene* _OpenResultScene; Layout* _aryTricksCardPanel[SSS_GROUP_COUNT]; Button* _aryButtonRechoose[SSS_GROUP_COUNT]; Sprite* _arySprCardType[SSS_GROUP_COUNT]; Sprite* _arySprCardShadow[SSS_GROUP_COUNT]; Sprite* _sprSpecialType; Button* _btnRefuseCards; Button* _btnCommitSpecial; Button* _btnCompare; Button* _btnReset; Button* _btnRandomCard; Button* _btnDuiZi; Button* _btnLiangDui; Button* _btnSanTiao; Button* _btnShunZi; Button* _btnTongHua; Button* _btnHuLu; Button* _btnTieZhi; Button* _btnTongHuaShun; Text* _txtTip; Sprite* _imgOperClock; Sprite* _imgGameClock; Sprite* _imgQualifiedTips; // 头道小于中道提示; Sprite* _sprOtherCallBanker; Sprite* _sprOtherAddScore; Sprite* _sprSelfAddScore; Layout* _ResultPanel; Button* _btnReady; Button* _btnPrivateEnd; Armature* _pArmatureStart; // 开始动画; Armature* _pArmatureResult; // 胜负动画; Armature* _pArmaAllKillEffect; // 全垒打动画; TextAtlas* _pTxtResultScore[SSS_GAME_PLAYER]; //TextAtlas* _pTxtXinScore[SSS_GAME_PLAYER]; SSS_GamePlayer* m_aryPlayer[SSS_GAME_PLAYER]; //玩家; SSS_GamePlayer* m_pLocalPlayer; std::string m_strGameRuleInfo; std::string m_strGameTitle; Vec2 _ptSendCardPos; // 发牌位置; std::vector _aryResultItem; //std::vector _aryOpenScoreList; CGameOverAni* m_GameOverAni; tag13SAnalyseType m_AnalyseType; C13SGameLogic m_GameLogic; SSS_CMD_S_GameEnd m_GameEnd; // localZOrder 层级; enum ZOrder { ZO_DEFAULT = 0, // 默认; ZO_CARDMANAGER, // 麻将管理类; ZO_UPDOWN, // 上下翻; ZO_ANI, // 动画; ZO_TRUSTEE, // 托管; ZO_END, // 结算面板; ZO_PRIVATE, // 私人场面板; }; }; }