《棋牌游戏开发技术文档.pdf》由会员分享,可在线阅读,更多相关《棋牌游戏开发技术文档.pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、棋牌游戏牌类开发技术文档 游戏以静态链接的形式由平台调用,游戏内部实现由开发人员自己编写。游戏工程编辑生成的文件分为服务端和客户端,服务端生成文件是如下格式:游戏 ID+.DLL。客户端的生成文件:游戏 ID+.ICO.此处需要特殊说明,客户端生成的文件就是一个 dll 文件,只是命名不一样而已。一、工程目录 这里就涉及统一性,因为程序员的习惯都不一样,如果游戏很多那么管理就很成问题,此标准只针对面对面棋牌而言。文件目录标准:文件目录一般分为三层,最外一层以 游戏 ID+_游戏名称的第一个母命名,例如斗地主:_DDZ。第二层里有三个文件夹,所有游戏中三个文件夹名字都想同:Documents(游
2、戏说明文档、策划案等)、GameCode(代码)、run(游戏资源)。第三层主要是对GameCode 来讲的。GameCode 里面也有三个文件夹分别为:Client(客户端工程相关文件)、GameMessage(客户端和服务端共工文件)、Server(服务端工程文件)。除了三个文件还包括两个工程生成的解决方案文件和一个记录文件,解决方案文件由 游戏 ID+_游戏名称的第一个母+.sln 构成。例如斗地主:。代码规范标准:代码规范标准为准。二、开发环境:开发的准备工作就是搭建开发环境,游戏开发要由包含很多平台的头文件,这些头文件都放在 sdk 文件夹下面,还有包含的一些库,这些都要在工程属性中
3、设置好。服务端需要的头文件:././././SDK/include/common;././././SDK/include/ServerCommon;服务端需要的库和相关库的路径:././././SDK/lib/common ././././SDK/lib/Server 客户端需要的头文件:././././sdk/include/NewGameFrame/Client ././././SDK/include/GameLaunchSdk 客户端需要的库和相关库的路径:././././SDK/lib/common ././././SDK/lib/Server 客户端除了这两个库可能还有其它库,例如音
4、效支撑库:irrKlang/,可能还有其它库根据游戏自己调用为准,但前面的两个库必须包含。开发环境搭建好后就要有游戏运行环境用来调试程序,只能编译 release 版本运行调试。游戏运行环境相信大家都很娴熟所以在此就不在迂腐了,不过还是提醒一下:注意编译生成文件的路径。以上两步完成以后就可以开始写代码了,不过在写代码之前一定要对游戏框架熟悉,这样写出来的代码才可能健壮。那么我们就来熟悉一下游戏的框架。三、游戏框架:游戏解决方案一般包括两个工程,相信大家都应该知道了,就是 服务端工程 和 客户端工程。1、服务端工程框架:服务端命名为 Server。包含两个类,一个与客户端公共的头文件,其它头文件
5、、源文件和资源文件。两个类为:CServerGameDesk,CUpGradeGameLogic。CServerGameDesk 的作用是控制游戏的流程,以及处理客户端的请求。CUpGradeGameLogic 是逻辑类,处理牌的数据和游戏的规则,是与客户端公用的一个类所以 CUpGradeGameLogic 是放在文件目录中的 GameMessage文件夹中。先介绍 CServerGameDesk,CUpGradeGameLogic 类就等介绍客户端后一起介绍。class CServerGameDesk:public CGameDesk public:/构造函数 CServerGameDes
6、k();/析构函数 virtual CServerGameDesk();public:/游戏开始 virtual bool GameBegin(BYTE bBeginFlag);/游戏结束 virtual bool GameFinish(BYTE bDeskStation,BYTE bCloseFlag);/判断是否正在游戏 virtual bool IsPlayGame(BYTE bDeskStation);/游戏数据包处理函数 virtual bool HandleNotifyMessage(BYTE bDeskStation,NetMessageHead*pNetHead,void*pD
7、ata,UINT uSize,UINT uSocketID,bool bWatchUser);bool HandleFrameMessage(BYTE bDeskStation,NetMessageHead*pNetHead,void*pData,UINT uSize,UINT uSocketID,bool bWatchUser);/用户离开游戏桌 virtual BYTE UserLeftDesk(BYTE bDeskStation,CGameUserInfo*pUserInfo)/获取游戏状态信息 virtual bool OnGetGameStation(BYTE bDeskStatio
8、n,UINT uSocketID,bool bWatchUser);/重置游戏状态 virtual bool ReSetGameState(BYTE bLastStation);/定时器消息 virtual bool OnTimer(UINT uTimerID);/玩家重连处理 virtual bool UserReCome(BYTE bDeskStation,CGameUserInfo*pNewUserInfo);/初始化游戏逻辑 virtual bool InitDeskGameStation();/玩家断线处理 virtual bool UserNetCut(BYTE bDeskStat
9、ion,CGameUserInfo*pLostUserInfo);CServerGameDesk 继承平台的一个类 CGameDesk。上面的函数都是重写 CGameDesk 里面的函数,除了 OnGetGameStation,ReSetGameState。OnGetGameStation,ReSetGameState是抽象函数,所以必须在 CServerGameDesk 里实现。在面对面平台上写游戏掌握以后几个函数就差不多了,但游戏的好坏和难易都要在游戏里面实现了,平台只是一个环境,游戏的本身还要自己去塑造。2、客户端工程框架:客户端命名为 Client,同样包含两个类、一个与服务端公共的头
10、文件一般命名为,其它头文件、源文件和资源文件。两个类为:CNewGameClient、CUpGradeGameLogic。CNewGameClient 也是由平台继承,用来在游戏不同的状态显示不同的界面元素,同时响应玩家请求并将请求发送至服务端处理。CUpGradeGameLogic 是与服务端公用的类。class CNewGameClient:public IGameImpl private:IGameFrame *m_pGameFrame;/游戏框架 IUserInterface *m_pUI;/游戏UI public:CNewGameClient(IGameFrame*pGameFram
11、e,IUserInterface*pUI);virtual CNewGameClient();private:CNewGameClient(const CNewGameClient&other);CNewGameClient&operator=(const CNewGameClient&other);/初始化 public:virtual int Initial();/初始化UI virtual int InitUI();/游戏消息 virtual int HandleGameMessage(WORD nMainID,WORD nSubId,BYTE*buffer,int nLen)=0;/界
12、面消息 virtual int OnUIMessage(TUIMessage*pMessage);/virtual int ResetGameFrame(void);/玩家进入 virtual int GameUserCome(void);/玩家离开 virtual int GameUserLeft(int nIndex);/玩家断线 virtual int GameUserOffLine(void);/是否正在游戏,由游戏实现 /旁观玩家返回false,游戏玩家正在游戏中返回true,其它状态返回false virtual bool IsPlayingGame();/定时器消息 virtua
13、l void OnTimer(int nTimerID);/置状态 virtual void SetStationParameter(BYTE bGameStation);/退出游戏 virtual bool OnGameQuiting();CNewGameClient 也是继承 GameLauncher 的一个类 IGameImpl,这个类是一个抽象类,基类中除了构造函数,所有的函数都是抽象函数。所以必须在 CNewGameClient 实现全部的抽象函数。同时还有两个对象成员,这两个成员的数据类型的定义也是在 GameLauncher 中,m_pGameFrame 是游戏框架的数据,通过这
14、个指针能获取自己和其它玩家的信息,还能控制游戏的走向,m_pUI 是游戏 UI 数据,通过这个指针能够调整和控制界面元素,这两个指针具体的用法类游戏。除此之外还有两个全局函数:IGameImpl*CreateNewGameImpl(IGameFrame*pIBase,IUserInterface*pIUI)return dynamic_cast(new CNewGameClient(pIBase,pIUI);void DestroyNewGameImpl(IGameImpl*ppImp)if(*ppImp!=NULL)delete*ppImp;*ppImp=NULL;看函数名字就应该能理解函数
15、的功能,分别是由 GameLauncher 调用创建和销毁游戏。3、服务端和客户端的公共类:CUpGradeGameLogic CUpGradeGameLogic 这个类是由游戏开发人员自己定义的、实现的。它的功能由游戏的规则而定,所以类名和实现都没有统一要求,但为了达到统一性,还是建议按统一的名字来命名。对于牌类而言,里面的数据和大部分操作都一样,只是少数操作不相同。按钮正易棋牌游戏的习介绍几个常用的函数:BYTE GetCardShape();/获取牌型 BOOL AutoOutCard();/自动出牌函数 BOOL CanOutCard();/是否可以出牌 BOOL TackOutCar
16、dMoreThanLast();/查找比当前出牌大的 这四个函数的形参没有写出来,具体形参可以参考游戏的代码。GetCardShape 是用来获取游戏中的牌型,游戏中有多少牌型都可以通过来个函数来获取,前提是要有每个牌型的定义和判断,并在此函数中调用。AutoOutCard 和 TackOutCardMoreThanLast 一般是用作托管,CanOutCard 控制牌型之间的大小。4、服务端和客户端的公共类头文件:包函数了一些基本信息,游戏 ID(NAME_ID)、游戏名称(GAMENAME)、游戏人数(PLAY_COUNT)、玩家手牌数、使用总牌数、扑克副数等。还有一些消息数据包、消息协议
17、。四、游戏流程:服务端和客户端的框架就是如此,关于游戏的基本流程、服务端和客户端的通信都是由平台控制,但一些比较特殊的游戏也可以由游戏自身来控制。游戏规则这一块主要体现在逻辑类中。了解服务端和客户端的框架后就可以了解游戏的基本流程,并通过流程来介绍相关函数的实现。启动 W 平台加载游戏 Dll 后创建游戏对象,这时就调用 CServerGameDesk 的构造函数,构造函数中初始化数据成员然后进入 InitDeskGameStation 针对桌子初始化。开启大厅进放游戏,客户端调用构造函数、Initial 加载编辑器生成的 dat 文件、InitUI 初始化游戏界面,客户端发送消息玩家进入游戏
18、,服务端收到消息后进入 OnGetGameStation 初始化游戏状态,将游戏状态相关数据发送给客户端、客户端通过 HandleGameMessage 接受消息,通过ASS_GM_GAME_STATION 消息协议来确定是状态消息然后调用客户端的 SetGameStation 设置客户端的状态,状态设置好后用户点击开始按钮关发送消息至服务端,服务端收到消息后(HandleNotifyMessage)设置玩家的状态为同意游戏,然后每一个玩家点击开始游戏服务端就会统计开始游戏人数,当人数达到游戏基本人数后,服务端会调用 IsPlayGame 只有当IsPlayGame 返回 FALSE 才会开始
19、游戏,所有当 IsPlayGame 返回 FALSE 时服务端调用GameBegin,这时游戏已经开始 IsPlayGame 返回为 TRUE,然后就进入游戏自己的流程,当游戏结束后服务端会调用 GameFinish 结束游戏,游戏开发人员可以在此时计算游戏分数并发送数据至客户端,通知客户端显示数据和结束游戏。五、重要函数:服务端 OnGetGameStation 和 客户端 SetGameStation 用来获取游戏状态和设置游戏状态,所以又用作断线重联。服务端SendGameData和 客户端HandleGameMessage 实现服务端和客户端之间的通信。客户端 m_pGameFrame
20、-SendGameData 和服务端 HandleNotifyMessage 实现客户端和服务端之间的通信。客户端 OnUIMessage,这个函数是 界面消息 也就是相当于封装 MFC 消息机制。各个控制的单击、双击、鼠标移动等事件都可以在这个函数中捕获。一个普通的游戏流程就是如此,具体游戏当然要具体分析。如果明白了这些,那么其它流程也一定很容易了解。YES FALSE 服务端 客户端 构造函数 构造函数 InitDeskGameStatioInitial OnGetGameStatioSetGameStation GameBegin 点击开始 HandleGameMessage SendGameData InitUI HandleNotifyMessage SendGameData IsPlayGame 同意人数满足