Cocos2d-x Lua 游戏前端工程架构深度解析

本文基于一个真实的商业游戏项目,详细分析了基于 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 个)

```


十一、技术特点总结

优势 ✅

  1. **成熟的引擎**: Cocos2d-x 3.10 稳定可靠

  2. **模块化设计**: 各游戏独立,易于扩展

  3. **完整的 MVC 架构**: 代码结构清晰

  4. **多平台支持**: Windows/Android/iOS 全覆盖

  5. **热更新能力**: 资源可动态更新

  6. **丰富的游戏品类**: 18+ 款游戏

注意事项 ⚠️

  1. **引擎版本较老**: Cocos2d-x 3.10 为 2016 年版本

  2. **硬编码路径**: 存在 Windows 风格绝对路径

  3. **跨平台兼容**: 需注意路径分隔符问题

  4. **维护成本**: 多平台项目文件需同步更新


十二、开发建议

12.1 新项目参考

  1. **架构设计**: 采用三层架构 (框架/大厅/游戏)

  2. **协议定义**: 使用结构化协议描述

  3. **资源管理**: 独立资源版本控制

  4. **代码规范**: 遵循 MVC 模式

12.2 优化方向

  1. 升级 Cocos2d-x 到 3.x 最新版本

  2. 使用相对路径替代绝对路径

  3. 引入自动化构建流程

  4. 增加单元测试覆盖


结语

本文详细解析了一个商业级 Cocos2d-x Lua 游戏项目的完整架构。从目录结构到技术实现,从网络通信到游戏逻辑,为游戏开发者提供了宝贵的工程参考。

**项目亮点**:

  • 🎮 18+ 款游戏模块化设计

  • 🌐 完整的网络通信架构

  • 📱 多平台构建支持

  • 🔐 原生层安全加密

  • 📊 第三方 SDK 集成


> **作者**:林宏权

> **发布时间**:2026 年 3 月

> **技术栈**:Cocos2d-x 3.10 + Lua + C++

>

> 欢迎技术交流与讨论!


*如果本文对你有帮助,欢迎点赞、收藏、转发!*

相关推荐
云边散步3 小时前
godot2D游戏教程系列二(15)
笔记·学习·游戏·游戏开发
林鸿群3 小时前
Lua 5.4 语法与核心知识学习总结
lua
yuweiade15 小时前
【Spring】Spring MVC案例
java·spring·mvc
条tiao条19 小时前
从 “猜数字游戏” 入门 BST:C 语言从零实现与核心操作
c语言·网络·游戏
SmalBox21 小时前
【节点】[GatherTexture2DNode节点]原理解析与实际应用
unity3d·游戏开发·图形学
007张三丰21 小时前
软件测试专栏(7/20):接口测试全攻略:Postman+Newman实现API自动化
自动化·lua·接口测试·postman·api测试·newman
yingxiao8881 天前
土耳其拟加强数字平台监管;腾讯或参投派拉蒙收购华纳兄弟交易
游戏·ai·腾讯·手游出海·任天堂·clash royale
云边散步1 天前
godot2D游戏教程系列二(14)
笔记·学习·游戏·游戏开发
于眠牧北1 天前
重写RedisTemplate后在lua脚本中传递参数不需要二次转换
java·junit·lua