Skip to content

freewayso/r111

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Sol2 Demo - 完整的游戏服务器架构

基于 sol2 的完整游戏开发框架,展示了 C++ 和 Lua 的最佳集成实践。

✨ 主要特性

  • 热更新 - 无需重启即可修改游戏逻辑
  • Manager 架构 - 标准游戏服务器设计模式
  • Lua OOP - 完整的类系统实现
  • Protobuf 支持 - 高效的序列化方案
  • C++ 系统服务 - 文件IO、网络等系统层功能
  • 数据驱动 - 游戏逻辑完全在 Lua 中

🚀 快速开始

1. 运行程序(最简单)

# 使用启动脚本(推荐)
.\run.ps1

# 或者手动运行
cd build_vs2022\Debug
.\sol2_demo.exe

2. 如果遇到问题

# 一键修复所有问题
.\fix_all.ps1

# 然后运行
.\run.ps1

3. 选择演示

程序会显示菜单:

1. Basic demo (simple functions)
2. OOP demo (class-based game)
3. Manager Architecture (recommended)  ← 推荐
4. C++ System Services (save/load/network)
5. Protobuf Integration (需要先安装 Protobuf)

📋 交互控制

程序运行后:

  • 按 'R' - 手动重载 Lua 脚本
  • 按 'A' - 切换自动热更新模式
  • 按 'Q' - 退出程序

🎯 尝试热更新

  1. 运行程序(选择选项 3)
  2. 打开 scripts/game_with_managers.lua
  3. 修改任何游戏逻辑
  4. 保存文件
  5. 在程序窗口按 'R'
  6. 立即看到修改效果!

📁 项目结构

sol2_demo/
├── src/                        # C++ 源代码
│   ├── main.cpp               # 主程序
│   ├── game_engine.hpp        # 游戏引擎接口
│   └── game_engine.cpp        # 系统服务实现
├── scripts/                    # Lua 脚本
│   ├── game_with_managers.lua # Manager 架构演示
│   ├── class_system.lua       # Lua 类系统
│   └── managers/              # 各种 Manager
│       ├── game_mgr.lua       # 全局游戏管理器
│       ├── player_mgr.lua     # 玩家管理器
│       ├── enemy_mgr.lua      # 敌人管理器
│       ├── item_mgr.lua       # 物品管理器
│       └── mail_mgr.lua       # 邮件管理器
├── proto/                      # Protobuf 定义
│   └── game_data.proto
├── sol/                        # sol2 库
├── lua/                        # Lua 库文件
│   ├── include/               # Lua 头文件
│   └── lib/                   # Lua 库和 DLL
├── run.ps1                     # 启动脚本 ⭐
├── fix_all.ps1                # 修复脚本
└── CMakeLists.txt             # 构建配置

🏗️ 架构说明

C++ 层 (系统服务)

// 文件 IO
engine:save_player(id, data)
engine:load_player(id)
engine:save_mail(id, data)

// Protobuf 序列化
engine:serialize_player_pb(table)
engine:save_player_pb(id, table)

// 网络模拟
engine:send_player(id, type, content)
engine:broadcast_to_all(type, content)

// 日志
engine:log(message)
engine:log_warning(message)
engine:log_error(message)

Lua 层 (游戏逻辑)

-- Manager 架构
GameMgr
  ├── PlayerMgr  -- 管理所有玩家
  ├── ItemMgr    -- 管理所有物品
  ├── EnemyMgr   -- 管理所有敌人
  └── MailMgr    -- 管理所有邮件

-- 调用 C++ 服务
local success = engine:save_player_pb(player_id, player_data)
local player = engine:load_player_pb(player_id)

🔧 编译项目

Windows (Visual Studio 2022)

# 1. 生成项目
cmake -S . -B build_vs2022 -G "Visual Studio 17 2022" -A x64

# 2. 编译
cmake --build build_vs2022 --config Debug

# 3. 修复依赖
.\fix_all.ps1

# 4. 运行
.\run.ps1

添加 Protobuf 支持

# 1. 安装 Protobuf
vcpkg install protobuf:x64-windows

# 2. 重新生成项目
cmake -S . -B build_vs2022 -G "Visual Studio 17 2022" -A x64 `
  -DCMAKE_TOOLCHAIN_FILE=[vcpkg路径]/scripts/buildsystems/vcpkg.cmake

# 3. 编译
cmake --build build_vs2022 --config Debug

📚 文档

  • README_VS2022.md - Visual Studio 2022 配置指南
  • Manager架构设计文档.md - Manager 模式详解
  • Lua类系统说明.md - Lua OOP 完整教程
  • Protobuf集成指南.md - Protobuf 使用说明
  • PROTOBUF_QUICKSTART.md - Protobuf 快速开始
  • 常见问题解决.md - 问题排查手册

⚡ 常见问题

找不到脚本文件

解决:

.\fix_all.ps1

找不到 lua54.dll

解决:

.\fix_all.ps1

无法打开 .exe 进行写入

原因: 程序正在运行

解决:

# 关闭程序后重新编译
taskkill /F /IM sol2_demo.exe
cmake --build build_vs2022 --config Debug

🎮 示例:Manager 架构

-- 全局游戏管理器
g_GameMgr = GameMgr:new()

-- 创建玩家
local player_id = g_GameMgr.player_mgr:createPlayer("Hero", 100, 50)

-- 给玩家物品
g_GameMgr.item_mgr:giveItemToPlayer(player, "health_potion", 3)

-- 发送邮件
g_GameMgr.mail_mgr:sendMail(
    player_id,
    "System",
    "Welcome!",
    "Thank you for playing!",
    { gold = 100 }
)

-- 保存数据(调用 C++ Protobuf)
g_GameMgr.player_mgr:savePlayer(player_id)

🌟 特色功能

热更新演示

-- 修改配置(无需重启)
g_GameMgr.config.damage_multiplier = 2.0  -- 伤害翻倍
g_GameMgr.enemy_mgr.spawn_config.interval = 5  -- 5秒生成一次敌人

-- 保存后按 'R' 立即生效!

数据持久化

-- Lua 准备数据
local player_data = {
    id = 1001,
    name = "Hero",
    level = 10,
    gold = 500
}

-- C++ 使用 Protobuf 序列化并保存
engine:save_player_pb(1001, player_data)

-- C++ 加载并反序列化
local loaded = engine:load_player_pb(1001)
print(loaded.name)  -- "Hero"

📈 性能对比

特性 Protobuf JSON
序列化速度 0.5μs 2.0μs
数据大小 60 bytes 180 bytes
类型安全
提升 4x 更快 67% 更小

🤝 贡献

这是一个完整的学习示例,展示了:

  • sol2 的正确使用方式
  • C++ 和 Lua 的最佳集成实践
  • 游戏服务器的标准架构模式
  • Protobuf 在游戏中的应用

📝 许可

本项目仅供学习参考。

🎓 学习路径

  1. 入门 - 运行选项 1 (Basic demo)
  2. OOP - 运行选项 2,学习 Lua 类系统
  3. 架构 - 运行选项 3,理解 Manager 模式
  4. 系统服务 - 运行选项 4,了解 C++ 层职责
  5. 进阶 - 安装 Protobuf,运行选项 5

开始你的游戏开发之旅! 🚀

有问题查看 常见问题解决.md 或各个详细文档。

r111

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published