下载 App

不同玩家“发送”流言内容即时存入云端

05/041 浏览综合
我试着在分享链接测试留言板流言,重进分享链接测试发现流言没了,有没有办法保存其他玩家的流言,点击“发送”流言内容可以即时存入云端?核心规则:游戏体验不会改变 —— 不需要匹配、不需要房间
嗒:
当前问题:留言数据存在内存中,gameSaveMap_() 尝试写入 clientCloud,但 clientCloud 是按用户隔离的——每个玩家只能看到自己的数据,其他玩家的留言互不可见。要实现跨玩家共享留言,需要启用多人模式:现状需要改为multiplayer.enabled = falsemultiplayer.enabled = true + persistent_world无服务端脚本新增服务端脚本管理共享留言clientCloud(按用户隔离)serverCloud.list(所有玩家共享)游戏体验不会改变 —— 不需要匹配、不需要房间,只是在后台启动一个常驻服务器来存储共享数据(类似 Roblox 模式)。实现步骤:
  1. 开启 persistent_world 多人模式
  2. 新增服务端脚本,用 serverCloud.list 存储留言
  3. 客户端通过 RemoteEvent 发送/接收留言
  4. 修改现有的"壁上题辞"弹窗,接入云端数据
计划文件已写入。方案要点:
  1. 架构: background_match 静默连接,游戏立即加载,服务器后台就绪后同步留言
  2. 存储: serverCloud.list 用 uid=0 作公共数据池,按 key="brick_{id}" 分组,每条 list item 记录一次交互(题壁/评论/表情/回复)
  3. Server 聚合: 将原始 list items 折叠为完整的 brick 留言结构,发送给客户端
  4. Client 模块: 提供 PostInscription/PostComment/PostReaction 等 API,main.lua 的留言 UI 直接调用;离线时缓存到队列,ServerReady 后 flush
  5. 乐观更新: 操作时同步更新本地数据,UI 即时反馈,不等服务器响应
  6. 可靠性: 失败与空数据区分、加载失败锁写、离线队列去重
修改 1: 在文件头部添加 WallClient require,以及 Start() 中添加服务端分流。
修改 2: 修改 Start() 函数,添加服务端分流和客户端 WallClient 初始化。
修改 3: 修改 showBrickWriteModal 中的"落笔"逻辑,对接 WallClient.PostInscription。
修改 4: 修改 showBrickViewModal 中的 saveAndDirty 函数和各交互按钮,对接 WallClient API。先修改点赞按钮。
以下是本次实现的完整总结:
壁上题辞云端持久化 — 实现完成架构采用 background_match 模式 — 游戏立即加载,服务器在后台静默连接,体验与单机完全一致。新增文件文件职责scripts/network/Shared.lua7 个 RemoteEvent 事件名定义 + 注册函数scripts/network/Server.lua服务端:serverCloud.list CRUD、聚合、全量同步、增量广播scripts/network/Client.lua客户端:API 封装、离线队列、乐观更新、断线重连刷队列main.lua 修改点(8 处)
  1. Start() 分流 — IsServerMode() → Server.Start(),IsNetworkMode() → Client.Init()
  2. 题壁按钮 — PostInscription()
  3. 表情计数条 — PostReaction()
  4. 评论点赞 — PostCommentLike()
  5. 评论踩 — PostCommentDislike()
  6. 回复发送 — PostReply()
  7. 点赞按钮 — PostLike()
  8. 评论发送 — PostComment()
  9. setupGameUI — SetOnSync + SetOnBrickUpdate 回调,将云端数据合并到本地地图砖块
生成正面、背面、侧面,可以走动的角色形象截图
生成正面、背面、侧面,可以走动的角色形象
当前 NPC 角色编辑器的数据结构 编辑器使用 32×32 像素画布,数据结构大致是: 3 个朝向:正面、背面、侧面 2 个动画状态:静止(idle)、行走(walk) 每个状态可以有多帧,支持帧率控制 每帧本质上是一个 32×32 的颜色数组 要解决的 3 个问题 步骤 问题 方案 1. 图片→编辑器 128×128 PNG 导入为 32×32 像素数据 加载图片后逐像素采样(每4×4取1像素)
1 赞
9 回复
编辑器实体 zIndex 层级
问题 编辑器中墙段被房间面板覆盖不可见。原因:给房间设 zIndex=1 会创建 stacking context,其内部带背景色/TiledImage 的 floorLayer 作为 paint layer 在合成时盖过了同层级 zIndex=2 的墙段——差距太小不够可靠。 解决:底层不设 zIndex,上层用明显间距 错误做法(zIndex 间距太小 + 给底层也设 zIndex): --
官方
1 赞
穿透层修复
经验一:CSS transform 穿透层修复模式 问题本质 当容器使用 CSS transform: translateX/Y/scale 平移/缩放子树时,即使父容器有 overflow = "hidden",引擎的命中检测可能不裁剪越界区域。如果 transform 后的子树有更高的 zIndex,它会在视觉范围外拦截其他兄弟节点的指针事件。 受影响的场景 地图编辑器(右键平移/滚轮缩放后)
官方
4 赞
精灵平滑移动、墙碰撞体积
一、 渲染层用连续坐标(scripts/页面/校园地图.lua,三处统一): -- NPC 定位(第408-410行) local contLeft = (character.x or 0) * 5 - 18 - charLeft local contTop = (character.y or 0) * 5 - 36 - charTop -- 主角定位(第504-506行) local con
官方
1 赞
地图编辑器仿真 tick 重建抑制
UI 重建频率 = 事件分发的可靠性上限。 只要有一帧 SetRoot 销毁了正在处理 pointer 事件的控件,跨重建边界的 Down/Up 对就会被吞。高频仿真 tick 必须在 UI 边界按页面过滤。 关键代码(scripts/main.lua HandleUpdate) 四步走:先原地处理人员 → 聚合所有仿真 changed → 地图页强制压制 → 只放行显式/登录态变化。 -- ma
官方
4 赞
以鼠标为锚点缩放
核心数学原理 缩放前后,鼠标指向的那个世界坐标点必须保持在同一屏幕位置。 已知:旧缩放 oldZoom、新缩放 newZoom、鼠标锚点屏幕坐标 (ax, ay)、当前偏移 (panX, panY) 步骤1:算出旧缩放下鼠标指向的世界坐标 wx = (ax - panX) / oldZoom wy = (ay - panY) / oldZoom 步骤2:新缩放后反解新偏移,让 wx/wy
官方
1 赞
碰撞方案
核心教训 1. 格子像素必须匹配精灵尺寸 5px格子+36px精灵=7.2:1比例,任何碰撞方案(AABB/空气墙/单点/格中心)都无法同时满足"不穿墙+四面间距一致+不跳格"。对齐环世界32px后,36px精灵≈1.1格,问题根本解决。 2. 连续渲染 + 格级碰撞的分层设计 渲染用连续坐标 x*S-18(平滑不跳),碰撞用格级检测(不穿墙),二者解耦。 3. 精灵大于格子时,单点检测必然不对称
官方
1 赞
围墙空气墙
问题根源 原系统用单点碰撞(Round(nx), Round(ny) 只检测中心1个点),角色精灵 36px(7.2格) 宽,中心停在 x=0.5 时精灵左半完全覆盖 5px 围墙,视觉"穿墙"。 1. AABB 矩形碰撞检测 — scripts/小人/导航.lua -- 角色碰撞体尺寸(格):脚底占据的地面矩形 -- 半宽 0.5 格(2.5px),半高 0.3 格(1.5px) local A
官方
1 赞
自动寻路赠送
核心功能 携带模式(点击物品跟鼠标)下: ≤8格:点击小人直接赠送(金色边框) >8格:点击远距离小人 → 自动寻路走向目标 → 到达8格内自动赠送 取消:玩家按方向键/WASD/摇杆手动移动 → 立即取消,恢复物品 关键经验(3条踩坑教训) 经验1:类型标识不是中文,是英文枚举值 地图编辑器放置的角色 type/job 字段是英文标识(teacher_3、doctor、cleaner_2、tea
官方
1 赞
图片加载三层优化设计
目标场景:地图编辑器"物品/墙体/地面/房间/人员"调色板弹窗的图片首帧显示 文档目的:沉淀"图片为什么慢、怎么治、发布后玩家体验如何、未来加资源时 preload_groups 怎么取舍"的完整结论,避免重复踩坑。 一句话结论 WASM 下图片"慢"不是单一问题,而是下载 / 解码 / 上传 GPU 三件事全堆在"玩家点弹窗那一刻"做导致的。优化的本质是把这三件事提前到启动期做(让玩家点的时候图
官方
1 赞