
本文基于一个真实的商业游戏项目,详细分析了基于 Cocos2d-x 3.10 引擎的 Lua 游戏前端工程架构。涵盖项目结构、技术架构、网络通信、游戏模块、资源管理等多个维度,为游戏开发者提供完整的工程参考。
一、项目概览
| 项目信息 | 详情 |
|---------|------|
| **项目名称** | GloryProject |
| **引擎版本** | Cocos2d-x 3.10 |
| **项目类型** | Lua 游戏项目 |
| **开发语言** | Lua (脚本) + C++ (原生) |
| **设计分辨率** | 1334 x 750 (EXACT_FIT) |
| **支持平台** | Windows, Android, iOS/macOS |
这是一个**商业级棋牌游戏平台**,包含 18+ 款游戏,采用 Lua 脚本 + C++ 原生混合开发模式,支持多平台发布。
二、工程目录结构
2.1 整体结构
```
client/
├── frameworks/ # 框架层
│ ├── cocos2d-x/ # Cocos2d-x 引擎源码 (3.10)
│ └── runtime-src/ # 原生运行时源码
│ ├── Classes/ # C++ 核心类
│ ├── proj.android/ # Android 项目
│ ├── proj.ios_mac/ # iOS/Mac 项目
│ ├── proj.win32/ # Windows 项目
│ └── thirdlib/ # 第三方库 (友盟 SDK、PushSDK)
│
├── client/ # 游戏资源与脚本主目录
│ ├── base/ # 基础框架模块
│ │ ├── src/
│ │ │ ├── app/ # MVC 架构核心
│ │ │ │ ├── controllers/
│ │ │ │ ├── models/
│ │ │ │ ├── views/
│ │ │ │ ├── Toolkits/
│ │ │ │ └── MyApp.lua
│ │ │ ├── cocos/ # Cocos2d-x Lua 绑定
│ │ │ └── packages/ # MVC 包支持
│ │ └── res/ # 基础资源
│ │
│ ├── client/ # 大厅/广场模块
│ │ ├── src/
│ │ │ ├── external/ # 外部功能模块
│ │ │ ├── gamemodel/ # 游戏模型
│ │ │ ├── header/ # 协议头定义
│ │ │ └── plaza/ # 广场业务 (models/views)
│ │ └── res/ # 大厅资源
│ │
│ └── game/ # 游戏模块
│ ├── qipai/ # 棋牌类游戏
│ │ └── land/ # 斗地主
│ ├── yule/ # 娱乐类游戏 (16 款)
│ │ ├── blackjack/ # 黑杰克
│ │ ├── dragontigerbattle/ # 龙虎斗
│ │ ├── dzshowhand/ # 德州扑克
│ │ ├── oxeight/ # 牛牛
│ │ ├── paijiu/ # 牌九
│ │ └── ...
│ └── xiuxian/ # 休闲类游戏
│ └── forestdance/ # 森林舞会 (3D)
│
├── run/ # 运行目录
├── publish/ # 发布目录
└── info/, obj/ # 中间文件
```
2.2 目录说明
| 目录 | 作用 |
|-----|------|
| `frameworks/cocos2d-x/` | 引擎源码,包含完整的 Cocos2d-x 3.10 |
| `frameworks/runtime-src/` | 原生层代码,C++ 实现 |
| `client/base/` | 基础框架,MVC 核心实现 |
| `client/client/` | 游戏大厅/广场模块 |
| `client/game/` | 各游戏独立模块 |
三、技术架构
3.1 核心架构模式
项目采用**三层架构**设计:
```
┌─────────────────────────────────────┐
│ 游戏模块层 (game/) │ ← 18+ 款独立游戏
├─────────────────────────────────────┤
│ 大厅模块层 (client/) │ ← 用户中心、房间列表
├─────────────────────────────────────┤
│ 基础框架层 (base/) │ ← MVC 核心、工具类
└─────────────────────────────────────┘
```
-
**MVC 架构**: 基于 Cocos2d-x Lua 框架的 MVC 模式
-
**模块分离**: 基础框架、大厅、游戏模块三层分离
-
**组件化设计**: 各游戏独立模块,支持热更新
3.2 启动流程
```lua
-- main.lua (入口文件)
cc.FileUtils:getInstance():setPopupNotify(false)
cc.FileUtils:getInstance():addSearchPath("base/src/")
cc.FileUtils:getInstance():addSearchPath("base/res/")
require "config"
require "cocos.init"
local function main()
require("app.MyApp"):create():run()
end
local status, msg = xpcall(main, G__TRACKBACK)
if not status then
print(msg)
end
```
**启动链路**:
```
main.lua → config.lua → MyApp.lua → WelcomeScene → 大厅/登录
```
3.3 核心配置文件
**config.lua** - 全局配置:
```lua
-- 0 - disable debug info, 1 - less debug info, 2 - verbose debug info
DEBUG = 2
-- use framework, will disable all deprecated API
CC_USE_FRAMEWORK = true
-- show FPS on screen
CC_SHOW_FPS = false
-- for module display
CC_DESIGN_RESOLUTION = {
width = 1334,
height = 750,
autoscale = "EXACT_FIT",
}
```
**MyApp.lua** - 应用初始化:
```lua
local MyApp = class("MyApp", cc.load("mvc").AppBase)
function MyApp:onCreate()
math.randomseed(os.time())
-- 搜索路径添加
cc.FileUtils:getInstance():addSearchPath(device.writablePath.."client/res/")
-- 版本信息
self._version = Version:create()
-- 游戏信息
self._gameList = {}
-- 更新地址
self._updateUrl = ""
-- 初次启动获取的配置信息
self._serverConfig = {}
end
```
四、网络通信架构
4.1 协议结构
网络协议定义在 `CMD_GameServer.lua` 中,采用**结构化定义**:
```lua
-- 登录信息
game_cmd.MDM_GR_LOGON = 1 -- 登录信息
game_cmd.SUB_GR_LOGON_USERID = 1 -- ID 登录
game_cmd.SUB_GR_LOGON_MOBILE = 2 -- 手机登录
game_cmd.SUB_GR_LOGON_ACCOUNTS = 3 -- 帐户登录
-- 登录结果
game_cmd.SUB_GR_LOGON_SUCCESS = 100 -- 登录成功
game_cmd.SUB_GR_LOGON_FAILURE = 101 -- 登录失败
game_cmd.SUB_GR_LOGON_FINISH = 102 -- 登录完成
```
4.2 主消息类型
| 消息类型 | 值 | 说明 |
|---------|-----|------|
| `MDM_GR_LOGON` | 1 | 登录信息 |
| `MDM_GR_CONFIG` | 2 | 配置信息 |
| `MDM_GR_USER` | 3 | 用户信息 |
| `MDM_GR_STATUS` | 4 | 状态信息 |
| `MDM_GF_FRAME` | 5 | 游戏框架 |
| `MDM_GF_GAME` | 6 | 游戏消息 |
4.3 协议数据结构示例
```lua
-- 手机登录协议
game_cmd.CMD_GR_LogonMobile = {
-- 版本信息
{t = "word", k = "wGameID"}, -- 游戏标识
{t = "dword", k = "dwProcessVersion"}, -- 进程版本
{t = "byte", k = "cbDeviceType"}, -- 设备类型
{t = "word", k = "wBehaviorFlags"}, -- 行为标识
{t = "dword", k = "dwUserID"}, -- 用户 ID
{t = "tchar", k = "szDynamicPassword", s = yl.LEN_MD5}, -- 登录密码
{t = "tchar", k = "szServerPasswd", s = yl.LEN_PASSWORD}, -- 房间密码
{t = "tchar", k = "szMachineID", s = yl.LEN_MACHINE_ID}, -- 机器标识
{t = "dword", k = "dwGroupID"}, -- 俱乐部 ID
}
-- 登录失败协议
game_cmd.CMD_GR_LogonFailure = {
{k = "lErrorCode", t = "int"}, -- 错误代码
{t = "word", k = "wKindID"}, -- 房间 id
{t = "word", k = "wServerID"}, -- 房间 id
{k = "szDescribeString", t = "string"} -- 描述信息
}
```
4.4 网络引擎层
**GameFrameEngine.lua** - 网络事件处理核心:
```lua
function GameFrameEngine:onLogonRoom()
self._roomInfo = GlobalUserItem.GetRoomInfo()
local dataBuffer = ExternalFun.create_netdata(game_cmd.CMD_GR_LogonMobile)
dataBuffer:setcmdinfo(game_cmd.MDM_GR_LOGON, game_cmd.SUB_GR_LOGON_MOBILE)
-- 组装登录数据
dataBuffer:pushword(self._kindID)
dataBuffer:pushdword(self._kindVersion)
dataBuffer:pushbyte(1) -- lua 端标识
dataBuffer:pushdword(GlobalUserItem.tabAccountInfo.dwUserID)
dataBuffer:pushstring(GlobalUserItem.tabAccountInfo.szDynamicPass, yl.LEN_MD5)
-- ...
self:sendSocketData(dataBuffer)
end
-- 网络事件分发
function GameFrameEngine:onSocketEvent(main, sub, dataBuffer)
if main == game_cmd.MDM_GR_LOGON then
self:onSocketLogonEvent(sub, dataBuffer)
elseif main == game_cmd.MDM_GR_CONFIG then
self:onSocketConfigEvent(sub, dataBuffer)
elseif main == game_cmd.MDM_GR_USER then
self:onSocketUserEvent(sub, dataBuffer)
elseif main == game_cmd.MDM_GF_GAME then
-- 游戏消息分发到具体游戏
if self._viewFrame and self._viewFrame.onEventGameMessage then
self._viewFrame:onEventGameMessage(sub, dataBuffer)
end
end
end
```
五、原生层 (C++) 架构
5.1 核心 C++ 类
| 类名 | 文件 | 作用 |
|-----|------|------|
| `AppDelegate` | AppDelegate.cpp/h | 应用入口,初始化引擎 |
| `ClientKernel` | ClientKernel.cpp/h | 客户端内核,消息调度 |
| `EncryptManager` | EncryptManager.cpp/h | 加密管理 |
5.2 AppDelegate 核心代码
```cpp
#include "AppDelegate.h"
#include "CCLuaEngine.h"
#include "lua_module_register.h"
#include "ClientKernel.h"
AppDelegate::AppDelegate()
{
m_instance = this;
m_pClientKernel = new CClientKernel();
m_ImageToByte = new CImageToByte();
}
AppDelegate::~AppDelegate()
{
CC_SAFE_DELETE(m_pClientKernel);
CC_SAFE_DELETE(m_ImageToByte);
}
// 初始化 OpenGL 上下文
void AppDelegate::initGLContextAttrs()
{
GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8};
GLView::setGLContextAttrs(glContextAttrs);
}
```
5.3 Lua 模块注册
项目集成了多个原生 Lua 模块:
-
**AESEncrypt** - AES 加密
-
**Gif** - GIF 动画 (CacheGif/InstantGif)
-
**QrNode** - 二维码识别
-
**AudioRecorder** - 录音功能
-
**BuglyLuaAgent** - 崩溃收集
-
**SocketService** - Socket 服务
六、游戏模块详解
6.1 游戏分类
项目包含**18+ 款游戏**,分为三大类:
```
game/
├── qipai/ # 棋牌类
│ └── land/ # 斗地主
├── yule/ # 娱乐类 (16 款)
│ ├── blackjack/ # 黑杰克
│ ├── dragontigerbattle/ # 龙虎斗
│ ├── dzshowhand/ # 德州扑克
│ ├── oxeight/ # 牛牛
│ ├── paijiu/ # 牌九
│ ├── runfast/ # 跑得快
│ ├── sparrow*/ # 麻雀系列 (5 款)
│ ├── animalbattle/ # 动物大战
│ └── ...
└── xiuxian/ # 休闲类
└── forestdance/ # 森林舞会 3D
```
6.2 游戏模块结构
每款游戏遵循统一的**MVC 结构**:
```
land/ # 斗地主游戏
├── res/ # 游戏资源
│ ├── animate/ # 动画资源
│ ├── game/ # 游戏 UI
│ ├── sound_res/ # 音效
│ └── ...
└── src/ # 游戏脚本
├── models/ # 数据模型
│ └── GameLogic.lua # 游戏逻辑
├── views/ # 视图层
│ └── layer/ # 游戏层
├── privateroom/ # 私人房间
└── gamevideo/ # 游戏视频
```
6.3 游戏逻辑示例 (斗地主)
**GameLogic.lua** - 核心牌型算法:
```lua
local GameLogic = {}
-- 扑克数据定义
GameLogic._CardData = {
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, -- 方块
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, -- 梅花
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, -- 红桃
0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, -- 黑桃
0x4E, 0x4F -- 小王,大王
}
-- 牌型定义
GameLogic.CT_ERROR = 0 -- 错误类型
GameLogic.CT_SINGLE = 1 -- 单牌类型
GameLogic.CT_DOUBLE = 2 -- 对牌类型
GameLogic.CT_THREE = 3 -- 三条类型
GameLogic.CT_SINGLE_LINE = 4 -- 单连类型
GameLogic.CT_DOUBLE_LINE = 5 -- 对连类型
GameLogic.CT_THREE_TAKE_ONE = 7 -- 三带一单
GameLogic.CT_THREE_TAKE_TWO = 8 -- 三带一对
GameLogic.CT_BOMB_CARD = 11 -- 炸弹类型
GameLogic.CT_MISSILE_CARD = 12 -- 火箭类型
-- 获取牌值
function GameLogic:GetCardValue(nCardData)
return bit:_and(nCardData, 0X0F)
end
-- 获取花色
function GameLogic:GetCardColor(nCardData)
return bit:_and(nCardData, 0XF0)
end
-- 扑克排序
function GameLogic:SortCardList(cbCardData, cbCardCount, cbSortType)
-- 排序实现...
end
```
七、资源管理体系
7.1 资源分类
| 资源类型 | 路径 | 说明 |
|---------|------|------|
| 基础资源 | `base/res/` | 字体、通用控件、Toast 等 |
| 大厅资源 | `client/res/` | 登录、广场、俱乐部、商城 |
| 游戏资源 | `game/*/res/` | 各游戏独立资源 |
| 3D 模型 | `forestdance/res/3d_res/` | 18 个 3D 模型文件 |
| Spine 动画 | 各游戏目录 | 骨骼动画 |
7.2 资源版本控制
**version.plist** - 资源版本管理:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>res_game_614</key>
<real>0.0000000000000000</real>
<key>res_client</key>
<real>0.0000000000000000</real>
<key>res_game_145</key>
<real>0.0000000000000000</real>
<!-- 更多资源版本... -->
</dict>
</plist>
```
7.3 用户默认配置
**UserDefault.xml** - 本地持久化配置:
```xml
<userDefaultRoot>
<1lastClub>100007.000000</1lastClub>
<1lastGame>391.000000</1lastGame>
<musicvalue>0</musicvalue>
<soundvalue>0</soundvalue>
<soundable>false</soundable>
<land_baseScore>1</land_baseScore>
<!-- 各游戏配置... -->
</userDefaultRoot>
```
八、核心功能模块
8.1 用户系统
-
**多种登录方式**: ID 登录、手机登录、账户登录
-
**用户权限管理**: 普通用户、管理员权限
-
**俱乐部系统**: 俱乐部房间、俱乐部管理
-
**私人房间**: 好友约战、自定义规则
8.2 社交功能
```lua
-- 聊天协议定义
local chat_cmd = {}
chat_cmd.MDM_CS_CHAT = ...
chat_cmd.SUB_GR_USER_CHAT = ... -- 用户聊天
chat_cmd.SUB_GR_USER_EXPRESSION = ... -- 表情
```
-
文字聊天系统
-
表情系统 (emoj 目录)
-
语音消息
-
好友系统
8.3 商业功能
| 功能 | 目录 | 说明 |
|-----|------|------|
| 商城 | `client/res/shop/` | 道具购买 |
| 活动 | `client/res/activity/` | 运营活动 |
| 排行榜 | `client/res/rank/` | 用户排行 |
| 签到 | `client/res/DailyBouns/` | 每日奖励 |
8.4 平台 SDK 集成
| SDK | 路径 | 功能 |
|-----|------|------|
| 友盟统计 | `thirdlib/umeng_*` | 数据统计 |
| PushSDK | `thirdlib/PushSDK/` | 消息推送 |
| Bugly | `Classes/Bugly/` | 崩溃收集 |
九、多平台构建
9.1 Windows 平台
**proj.win32/GloryProject.vcxproj** - Visual Studio 项目
**run.bat** - 快速启动脚本:
```batch
@echo off
set WORKDIR=%CD%/client
set game=%CD%/run/debug/win32/GloryProject.exe
start %game% -workdir %WORKDIR% -FILE %WORKDIR%/base/src/main.lua
exit
```
9.2 Android 平台
**proj.android/** - Android Studio 项目
-
使用 Gradle 构建
-
集成友盟、推送 SDK
9.3 iOS/Mac 平台
**proj.ios_mac/** - Xcode 项目
-
支持 iOS 和 macOS
-
集成 Bugly、友盟 SDK
9.4 构建配置
**build-cfg.json** - 资源复制配置:
```json
{
"copy_resources": [
{
"from": "../../../src",
"to": "src"
},
{
"from": "../../../res",
"to": "res"
},
{
"from": "../../../config.json",
"to": ""
}
],
"must_copy_resources": []
}
```
十、代码统计与分析
10.1 代码规模
| 类型 | 数量 |
|-----|------|
| Lua 文件 | ~1,759 个 |
| C++ 文件 | ~1,024 个 (含引擎) |
| 游戏模块 | 18+ 款 |
| 协议定义 | 900+ 行 |
10.2 文件分布
```
Lua 文件分布:
├── base/src/ # 基础框架 (~50 个)
├── client/client/src/ # 大厅模块 (~200 个)
└── client/game/ # 游戏模块 (~1500 个)
```
十一、技术特点总结
优势 ✅
-
**成熟的引擎**: Cocos2d-x 3.10 稳定可靠
-
**模块化设计**: 各游戏独立,易于扩展
-
**完整的 MVC 架构**: 代码结构清晰
-
**多平台支持**: Windows/Android/iOS 全覆盖
-
**热更新能力**: 资源可动态更新
-
**丰富的游戏品类**: 18+ 款游戏
注意事项 ⚠️
-
**引擎版本较老**: Cocos2d-x 3.10 为 2016 年版本
-
**硬编码路径**: 存在 Windows 风格绝对路径
-
**跨平台兼容**: 需注意路径分隔符问题
-
**维护成本**: 多平台项目文件需同步更新
十二、开发建议
12.1 新项目参考
-
**架构设计**: 采用三层架构 (框架/大厅/游戏)
-
**协议定义**: 使用结构化协议描述
-
**资源管理**: 独立资源版本控制
-
**代码规范**: 遵循 MVC 模式
12.2 优化方向
-
升级 Cocos2d-x 到 3.x 最新版本
-
使用相对路径替代绝对路径
-
引入自动化构建流程
-
增加单元测试覆盖
结语
本文详细解析了一个商业级 Cocos2d-x Lua 游戏项目的完整架构。从目录结构到技术实现,从网络通信到游戏逻辑,为游戏开发者提供了宝贵的工程参考。
**项目亮点**:
-
🎮 18+ 款游戏模块化设计
-
🌐 完整的网络通信架构
-
📱 多平台构建支持
-
🔐 原生层安全加密
-
📊 第三方 SDK 集成
> **作者**:林宏权
> **发布时间**:2026 年 3 月
> **技术栈**:Cocos2d-x 3.10 + Lua + C++
>
> 欢迎技术交流与讨论!
*如果本文对你有帮助,欢迎点赞、收藏、转发!*