Files
wnmj/Classes/Games/WNMJ/WN_GameScene.h
2026-03-01 13:48:24 +08:00

249 lines
9.0 KiB
C++

#ifndef _NCMJ_CGameScene_h_
#define _NCMJ_CGameScene_h_
#include <vector>
#include <string>
#include "cocos2d.h"
#include "ui/CocosGUI.h"
#include "GameFrameBase.h"
#include "Singleton.h"
#include "TimeNode.h"
#include "GameDefine.h"
#include "WN_CMD_Sparrow.h"
#include "WN_GamePlayer.h"
#include "WN_GameLogic.h"
#include "WN_GameOver.h"
#include "WN_CardManager.h"
#include "WN_PrivateScene.h"
//#include "WN_CreateScene.h"
#include "WN_GetCardCtrl.h"
USING_NS_CC;
using namespace cocos2d::ui;
namespace WNMJ_SPACE{
class WN_GameScene : public GameFrameBase
{
public:
WN_GameScene();
virtual ~WN_GameScene();
static std::string getGameRule(uint32 dwGameRule);
static int GetRealChairCount(uint32 dwGameRule);
//
public:
CREATE_FUNC(WN_GameScene);
virtual bool init(); // 场景初始化
virtual bool InitGameEvent(); // 事件注册
virtual void onEnterTransitionDidFinish(); // 进场动画完成回调
virtual void onExit(); // 场景退出回调
virtual void ResetTable(); // 重置桌子
virtual void ResetScene(); // 重置场景
virtual void upSelfPlayerInfo(); // 更新信息
virtual WORD SwitchViewChairID(WORD wChairID); // 椅子号视图转换
virtual uint16 GetRealChairCount();
// 初始化
private:
void uiLayerinit(); // UI初始化
void loadingRes(); // 加载麻将资源
void SetCurrentUser(WORD wCurrentUser); // 设置当前玩家
void ResetAllData(); // 重置所有数据
// 定时器
private:
void OnEventGameClock(float dt); // 游戏定时器
void SetGameClock(WORD wChairID, DWORD dwTimerID, DWORD dwElapse); // 设置时间(秒)
void KillGameClock(); // 删除时间
void UpdateSystmeTime(float dt); // 更新系统时间;
//场景消息
private:
virtual bool OnEventSceneMessage(uint8 cbGameStatus, bool bLookonUser, void* data, int dataSize);
void onGameScenePlay(CMD_S_StatusPlay* pStatusPlay); // 正在游戏
void onGameSceneFree(CMD_S_StatusFree* pStatusFree); // 空闲场景
// 游戏消息
private:
void OnSubGameStart(const void *pBuffer, WORD wDataSize); // 游戏开始
void OnSubRecordGameStart(const void *pBuffer, WORD wDataSize);
void OnSubSendCard(const void *pBuffer, WORD wDataSize); // 发第十四张牌
void OnSubOperateNotify(const void *pBuffer, WORD wDataSize); // 提示消息
void OnSubOutCard(const void *pBuffer, WORD wDataSize); // 用户出牌
void OnSubOperateResult(const void *pBuffer, WORD wDataSize); // 操作结果
void OnSubUserTrust(const void *pBuffer, WORD wDataSize); // 用户托管
void OnSubGameEnd(const void *pBuffer, WORD wDataSize); // 游戏结束
void OnSubKickOut(const void *pBuffer, WORD wDataSize); // 踢出消息处理
void OnSubGetLeftCard(const void *pBuffer, WORD wDataSize); // 获取排堆;
// 消息发送函数
public:
void SendFrameData(WORD wSubCmdID, void* buffer, WORD wSize); // 发送框架消息
void SendGameData(WORD wSubCmdID, void* buffer, WORD wSize); // 发送游戏消息
void SendUserData(WORD wSubCmdID, void* buffer, WORD wSize); // 发送用户消息
// 按钮回调事件
private:
void onLeaveClickEvent(cocos2d::Ref *pSender); // 离开按钮点击事件
void onStartClickEvent(cocos2d::Ref *pSender); // 开始按钮点击事件
void onKeyReleased(EventKeyboard::KeyCode keyCode, Event * pEvent); //按键处理
// 游戏内事件处理
public:
void onGameStartInitUI(bool IsMove = true); // 游戏开始移动玩家;
void onShowDice(); // 显示骰子
bool IsHaveOperateCard(WORD dwUserAction); // 是否有高级操作
void SetTimerByEast(WORD wEastUser); // 根据东方位玩家设置时钟TAG
void SetSurplusCardCount(BYTE cbUseingCount); // 设置剩余排数
void onEventShowPrivate(cocos2d::EventCustom *event); // 显示结算信息
// 游戏动画
private:
// 补花 游戏中结算动画
void SetPayAniShowMode(ANI_TYPE aType, Point pos, const std::function<void()>& callback);
void doHuAnimation(float fEndX, float fEndY, const std::function<void()>& fnCallback);
void doHuangAnimation(float fEndX, float fEndY, const std::function<void()>& fnCallback);
// 玩家信息处理
public:
virtual void OnEventUserEnter(GamePlayer * pPlayer); //用户进入
virtual void OnEventUserStatus(GamePlayer * pPlayer); //用户状态
virtual void OnEventUserLeave(GamePlayer * pPlayer); //用户离开;
virtual void OnUserScore(GamePlayer* pPlayer); // 玩家积分
virtual Vec2 GetPlayerPosByUserID(uint32 dwUserID); // 聊天消息
GamePlayer* CreatePlayer(IClientUserItem * pIClientUserItem);
string getGoldStr(string _str, char insertChar); // 字符串格式化
//void ShowPlayer(WORD wChairID, GamePlayer* pPlayer); // 显示玩家
//void ShowKingAndUpDownCard(BYTE cbKingCard[2]); // 显示精牌
// 声音控制
public:
void PlayBackMusic(BYTE cbType, bool ispool); // 播放背景音乐
void playGameEffect(BYTE cbType); // 播放游戏音效
void playGameEffect(BYTE cbSoundType, WORD wChairID, BYTE cbOutCard = 0);// 播放游戏音效
// 按钮事件
public:
// 按住语音按钮
void OnButtonVoiceTouched(Ref*, Widget::TouchEventType);
//私人场
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 ShowGameRule(CMD_GF_Private_Room_Info* pNetInfo); // 游戏规则
void ShowRoomID(Ref *pSender); // 分享房间号;
void SetChairs();
// 玩家要牌
public:
void onPlayerGetCard();
//自定义事件回调
public:
void onEventOutCard(EventCustom* event); //出牌
void onEventOperCard(EventCustom* event); //操作牌
void onEventGetCard(EventCustom* event); //要牌事件;
//录像处理
public:
virtual void StartGameRecord();
virtual void NextRecordAction(float dt);
// 控件信息
public:
WN_CardManager* m_pCardManager; // 麻将管理类
Layout* m_pRootLayout; // 根场景
Layout* m_PanelCard; // 麻将节点;
WN_GameOver* m_pResultLayer; // 结算面板
WN_PrivateScene* m_pPrivateScene; // 私人场面板
GetCardCtrl* m_pGetCardLayer; // 要牌面板;
//Sprite* m_SpritePlayers[GAME_PLAYER]; // 玩家控件
//Button* m_btnPlayer[GAME_PLAYER]; // 添加點擊事件
//Sprite* m_SpriteReadys[GAME_PLAYER]; // 准备控件
//Sprite* m_SpriteOffLine[GAME_PLAYER]; // 离线控件
Sprite* m_SpriteTimeBg; // 时间界面
Sprite* m_SpriteTimer; // 时间界面
LabelAtlas* m_LableTime; // 时间数字
Text* m_ptxtCardNum; // 剩余牌数量
Text* m_txtGameRule; // 游戏规则;
Text* m_txtGameRuleScore; // 游戏规则;
Text* m_txtGangRule; // 杠规则;
Text* m_txtCurrentTime; // 当前时间;
ImageView* m_ImageMenu; // 菜单;
Button* m_BtnMenu; // 菜单按钮;
Button* m_pBtnLeave; // 离开按钮
Button* m_pBtnReady; // 准备按钮;
Button* m_btnDismiss; // 解散房间
Button* m_btnWeiXin; // 微信分享按钮
Button* m_pBtnStartGame; // 可以开始游戏按钮;
Node* m_pVoiceNode; // 语音标志
Text* m_txtRoomID; // 房间号
Text* m_txtGameTimes; // 游戏局数
WNGamePlayer* m_aryPlayer[GAME_PLAYER]; // 玩家数组;
bool m_bActiveStatus[GAME_PLAYER]; //玩家状态;
// 玩家信息
private:
int m_lBaseScore; // 基础积分
BYTE m_cbGameStatus; // 游戏状态
BYTE m_cbSurplusCard; // 剩余牌数量
BYTE m_cbHuaAniCout; // 胡牌动画播放完成玩家
///<坐标变量
public:
Point m_ptStartCard[GAME_PLAYER]; // 每个玩家第一张手牌
Point m_ptOutCard[GAME_PLAYER]; // 每个玩家第一张出牌
Point m_ptCurrentCard[GAME_PLAYER]; // 每个玩家当前出牌
Point m_ptWeaveCard[GAME_PLAYER]; // 每个玩家组合牌坐标
Point m_ptPlayerEnd[GAME_PLAYER]; // 每个玩家最终坐标
//用户变量(记录的用户全是服务端椅子号)
protected:
WORD m_wBankerUser; // 庄家用户
WORD m_wCurrentUser; // 当前用户
WORD m_wEastUser; // 东方位玩家
WORD m_wUserPosition[GAME_PLAYER]; // 方位旋转角度
//发牌数据
public:
BYTE m_cbSelfHandCardData[MAX_COUNT]; // 自己发牌时候手牌
//定时器
public:
DWORD m_dwTimerID; // 定时器ID
int m_nSecondCount; // 当前计数
WORD m_wTimeChairID; // 正在计数玩家
int m_nVoiceTimeID; // 语音定时器ID
// //声音
//public:
// BYTE m_cbSoundType; // 语音类型
// //BYTE m_cbBackMusicType; // 背景音效类型
//私人场信息
public:
CMD_GF_Private_Room_Info m_PrivateRoomInfo;
bool m_IsRunEndAction;
std::string m_strGameRuleInfo;
std::string m_strGameTitle;
};
}
#endif