下载 App

地面样式配置归一化

07/27综合
horizontal linehorizontal line

1. 唯一真相源 scripts/数据/地图/地面样式配置.lua

lua
local FloorStyleConfig = {} -- ★ 所有地面样式集中定义在这里 FloorStyleConfig.STYLES = { ["木地板"] = { texture = "image/地面/木地板_无缝.png", tileSize = 40 }, ["草地"] = { texture = "image/地面/campus_background.png", tileSize = 64 }, ["水泥地"] = { texture = "image/地面/campus_canteen_floor.png", tileSize = 40 }, ["教室地砖"] = { texture = "image/地面/campus_classroom_floor.png",tileSize = 40 }, -- ... 其他地砖 } local DEFAULT_STYLE = "木地板" -- 旧存档兼容:旧名 → 标准 key(不再静默回退木地板) local LEGACY_ALIASES = { ["教室地面"] = "教室地砖", ["食堂"] = "食堂地砖", ["办公室"] = "水泥地", ["医务室"] = "医务室地砖", } function FloorStyleConfig.Normalize(styleName) if not styleName or styleName == "" then return DEFAULT_STYLE end return LEGACY_ALIASES[styleName] or styleName end -- 主查询接口(带别名归一化 + 默认兜底) function FloorStyleConfig.Get(styleName) local key = FloorStyleConfig.Normalize(styleName) return FloorStyleConfig.STYLES[key] or FloorStyleConfig.STYLES[DEFAULT_STYLE] end -- 房间类型 → 默认地面样式 FloorStyleConfig.ROOM_DEFAULTS = { ["教室"] = "教室地砖", ["厕所"] = "卫生间瓷砖", ["办公室"] = "水泥地", ["食堂"] = "食堂地砖", ["医务室"] = "医务室地砖", ["操场"] = "草地", } function FloorStyleConfig.GetForRoom(roomType) local styleName = FloorStyleConfig.ROOM_DEFAULTS[roomType] or DEFAULT_STYLE return styleName, FloorStyleConfig.Get(styleName) end return FloorStyleConfig
horizontal linehorizontal line

2. 调用方统一委托模式(删除本地副本)

校园地图.lua(运行时地图):
lua
-- 删除了 ROOM_TEXTURES / FLOOR_STYLE_TEXTURES 本地表,改为: local FloorStyleConfig = require("数据.地图.地面样式配置") local function GetFloorStyleTexture(styleName) return FloorStyleConfig.Get(styleName) -- 自动走别名归一化 end -- 房间卡片取纹理: local _, roomDefaultFloor = FloorStyleConfig.GetForRoom(room.type) local texture = room.floorTexture or roomDefaultFloor.texture
地图编辑模式.lua(编辑器主页面):
lua
-- 关键修复:不再直接索引 FLOOR_STYLE_CONFIGS[styleName](绕过别名) -- 改为委托到 Catalog → FloorStyleConfig.Get(走 Normalize → LEGACY_ALIASES) GetFloorStyleConfig = function(styleName) return MapEditorCatalog.GetFloorStyleConfig(styleName) end -- CreateCanvasRoom 不再依赖注册表冗余 floorTexture/floorTileSize: local _, roomDefaultFloor = FloorStyleConfig.GetForRoom(room.type) local floorTexture = room.floorTexture or roomDefaultFloor.texture
编辑器目录.lua(编辑器面板数据源):
lua
local FloorStyleConfig = require("数据.地图.地面样式配置") MapEditorCatalog.FLOOR_STYLE_CONFIGS = FloorStyleConfig.STYLES MapEditorCatalog.PALETTE_ITEMS.floor = FloorStyleConfig.GetPaletteItems() function MapEditorCatalog.GetFloorStyleConfig(styleName) return FloorStyleConfig.Get(styleName) end
功能空间类型注册表.lua(房间类型注册):
lua
-- 删除了每个房间类型的 floorTexture / floorTileSize 冗余字段, -- 只保留 floorStyle = "config key",旧名通过 LEGACY_ALIASES 自动归一化: ["教室"] = { floorStyle = "教室地面", -- 旧名,归一化 → "教室地砖" wallStyle = "教室墙", -- floorTexture/floorTileSize 已删除 },
地面区域编辑.lua(子模块):
lua
-- 零改动:通过注入的 self.getFloorStyleConfig 回调自动走新链路 -- options.getFloorStyleConfig → GetFloorStyleConfig → Catalog → FloorStyleConfig.Get
horizontal linehorizontal line

3. 委托链(一次查询的完整路径)

业务代码调用 GetFloorStyleConfig("教室地面")
  → MapEditorCatalog.GetFloorStyleConfig("教室地面")
    → FloorStyleConfig.Get("教室地面")
      → Normalize("教室地面") → LEGACY_ALIASES["教室地面"] → "教室地砖"
      → STYLES["教室地砖"] → { texture, tileSize=40, hint }
horizontal linehorizontal line

4. 新增地面/房间类型的操作对比

操作重构前重构后
新增地面样式改 3–4 个文件(注册表、编辑器目录、运行时地图、面板常量)改 1 个文件:地面样式配置.lua STYLES 表 + PALETTE_ORDER
新增房间类型默认地面重复写 texture/tileSize 到注册表只在 ROOM_DEFAULTS 加一行映射
旧存档名字不匹配静默回退到木地板(视觉 bug)LEGACY_ALIASES 显式归一化
拾取 / 丢弃物品
拾取的坑是「点击被遮挡」,丢弃的坑是「坐标反解会偏」。两者解法都是绕开复杂机制、用最直接的方式。 问题 根因 解法 走到物品旁点不动、捡不起来 物品命中层和主角标记同层、都无 zIndex,数组顺序靠后的主角标记盖在上面,点击命中的是主角而非物品 给可交互物品显式 zIndex = 20 拖拽丢东西飞到远处 用 ScreenToWorld 把鼠标像素反解成世界坐标当落点,依赖 zoom/offse
官方
4 赞
地图编辑器仿真 tick 重建抑制
UI 重建频率 = 事件分发的可靠性上限。 只要有一帧 SetRoot 销毁了正在处理 pointer 事件的控件,跨重建边界的 Down/Up 对就会被吞。高频仿真 tick 必须在 UI 边界按页面过滤。 关键代码(scripts/main.lua HandleUpdate) 四步走:先原地处理人员 → 聚合所有仿真 changed → 地图页强制压制 → 只放行显式/登录态变化。 -- ma
官方
4 赞
右键拖拽平移
一、问题本质 不是平移公式写错,而是 UrhoX UI 库指针事件派发的两个不对称陷阱叠加: 陷阱 现象 根因文件 OnPointerMove 不向父冒泡 右键按下 isPanning_=true,但 move 事件永远到不了 mapView urhox-libs/UI/Core/Widget.lua(OnPointerDown/Up 有 parent 冒泡,OnPointerMove 没有) H
官方
4 赞
槽位变更只走原子方法
经验 下标 = 视觉格子,空槽是合法状态。定长 9 槽,inventory[i]=nil 即第 i 格空着,中间允许空。任何"把物品往前挪/压缩/重排"的操作都会让"你看到的格子"和"数组真实下标"脱节 → 物品消失。渲染直映 inventory[i],数据层绝不重排。 稀疏表禁用 #。带 nil 洞的表 #inv 是未定义的(可能=0 直接读成空包,或=洞前边界)。所有遍历上界一律 Player
官方
4 赞
地图编辑器地面交互与视觉优化
一、问题链 用户截图反馈了三个递进的问题: 问题 1:点击地面类型(如食堂地砖),弹窗不关闭,挡住画布无法操作 ↓ 修复 v0.10.94 问题 2:地面贴图太大,一块地砖比小人还宽,比例失调 ↓ 修复 v0.10.96(改配置值) 问题 3:改了配置值后刷新仍然太大——旧存档的 tileSize=256 优先级高于新 config ↓ 修复 v0.10.97(反转渲染优先级) 二、关键代码
官方
4 赞
以鼠标为锚点缩放
核心数学原理 缩放前后,鼠标指向的那个世界坐标点必须保持在同一屏幕位置。 已知:旧缩放 oldZoom、新缩放 newZoom、鼠标锚点屏幕坐标 (ax, ay)、当前偏移 (panX, panY) 步骤1:算出旧缩放下鼠标指向的世界坐标 wx = (ax - panX) / oldZoom wy = (ay - panY) / oldZoom 步骤2:新缩放后反解新偏移,让 wx/wy
官方
1 赞
修复"地图编辑器刷新数据丢失"
问题诊断过程 用户报告:编辑器建好房间 → 保存 → 刷新页面 → 进编辑器 → 数据全没了。 关键线索:用户发现"校园日"模式刷新后能看到房间,但一进编辑器就没了。 这直接指向了编辑器页面自身的初始化逻辑,而非持久化链路。 根因 地图编辑模式.lua 的 EnsureBlankEditorLayout() 设计意图是"首次打开编辑器提供空白画布",用模块级布尔 editorLayoutClear
官方
4 赞
图片加载三层优化设计
目标场景:地图编辑器"物品/墙体/地面/房间/人员"调色板弹窗的图片首帧显示 文档目的:沉淀"图片为什么慢、怎么治、发布后玩家体验如何、未来加资源时 preload_groups 怎么取舍"的完整结论,避免重复踩坑。 一句话结论 WASM 下图片"慢"不是单一问题,而是下载 / 解码 / 上传 GPU 三件事全堆在"玩家点弹窗那一刻"做导致的。优化的本质是把这三件事提前到启动期做(让玩家点的时候图
官方
1 赞
自动寻路赠送
核心功能 携带模式(点击物品跟鼠标)下: ≤8格:点击小人直接赠送(金色边框) >8格:点击远距离小人 → 自动寻路走向目标 → 到达8格内自动赠送 取消:玩家按方向键/WASD/摇杆手动移动 → 立即取消,恢复物品 关键经验(3条踩坑教训) 经验1:类型标识不是中文,是英文枚举值 地图编辑器放置的角色 type/job 字段是英文标识(teacher_3、doctor、cleaner_2、tea
官方
1 赞
四个原则(数据驱动、组件化、组合优于继承、对象池)
四个原则(数据驱动、组件化、组合优于继承、对象池)确实是系统从"能跑"到"能维护"的分水岭。 先看看你的游戏现状,再说怎么落地。 你的游戏现状分析 你的《自由的校园》不是传统战斗游戏,但已经有大量"对抗性交互": 已有机制 对应战斗系统概念 主角投掷物品(粉笔、扫把) 投射物 / 技能 行为违规 → 目击 → 怀疑累积 Debuff 叠加 冲突事件 → 保安响应 Boss 技能 / AI 响应链
官方
4 赞