一原理:
基本原理同其他游戏的看牌实现原理。但由于没有控制端与控制类的支持,结构略有不同。
通过客户端实现“看牌请求”消息触发,将“看牌请求”消息发送给服务端。
服务端响应后,判断权限,如果权限为超级玩家,则将“底牌与3家手牌”,发送回请求的客户端端。
客户端 --------- (发送与接收看牌数据) ------------ 服务端
二实现:
1.利用预编译指令区别超级玩家与普通玩家。
在分项目的头文件stdafx.h 中增加
#define ADMIN //超级玩家标志
在具体实现文件中通过判断是否有该标志,在编译时过滤代码,
时超级玩家客户端编译时其特定代码编译进文件;普通玩家不带该标志,从而在编译时仍然是原理的代码。从而达到使一套生产两套客户端的目的。便于管理与维护,也便于增加页面等通用功能时该两套代码。
2.客户端发送看牌请求:
客户端按具体使用分两种情况,
1)超级玩家参加游戏方式看本卓其他玩家牌。
2)超级玩家旁观游戏方式看本桌所有玩家牌。
两种情况都在
CGameClientEngine.h 文件中声明了如下变量与函数,并在CGameClientEngine.cpp具体声明与具体实现。功能请看项目代码吧。
#ifdef ADMIN
//扑克变量
BYTE m_cbAdminHandCardData[GAME_PLAYER][MAX_COUNT]; //手上扑克
bool OnAdminSendLookon();//看牌请求函数
bool OnSubLookon(const void * pBuffer, WORD wDataSize);//游戏显牌
#endif
第一种情况,超级玩家参加游戏方式。
在发牌完成消息函数中,(牌发完了,就该看牌啦,要不游戏开始你还不知道牌呢)
OnMessageDispatchFinish(WPARAM wParam, LPARAM lParam)//发牌完成
增加了“看牌请求”函数
OnAdminSendLookon(); //发送看牌请求
该函数,将看牌消息传给服务端。
SendSocketData(SUB_C_LOOKON_RQ); //发送看牌请求
第二种情况,超级玩家旁观游戏方式。
主要功能与超级玩家参加游戏方式一致,但多一种如何看正在游戏中的玩家牌的状况。就是点击正在游戏中的桌子,进入的一刹那就看到他们的牌,得到他们的牌值数据。
这个功能是通过定时器事件触发完成。
在函数
bool CGameClientEngine::OnInitGameEngine() //创建引擎
中设置一个定时器,时间100毫秒,
SetTimer(IDI_CHECK_GAME_START,TIME_CHECK,NULL); //加载定时器
该函数作用是初始游戏,游戏初始后设置定时触发。
函数
CGameClientEngine::OnTimer(UINT nIDEvent)//时间消息处理函数
处理IDI_CHECK_GAME_START定时器,调用函数
OnAdminSendLookon(); //发送看牌请求
该函数,将看牌消息传给服务端。
SendSocketData(SUB_C_LOOKON_RQ); //发送看牌请求
3.服务端:
函数
CTableFrameSink::OnGameMessage() //游戏消息处理函数
接收到SUB_C_LOOKON_RQ看牌请求消息,调用函数
OnSendLookOnData(pIServerUserItem); //发送看牌数据函数
将数据封装为
CMD_S_SendCardAdmin格式(内部含玩家底牌与3个玩家的手牌),以SUB_S_LOOKON看牌数据消息,发送给客户端。
4.客户端接收看牌数据:
函数
CGameClientEngine::OnEventGameMessage() //游戏消息处理函数
接收到SUB_S_LOOKON看牌数据消息,调用函数
OnSubLookon(pData,wDataSize); //游戏显牌
进行处理。