肥羊小站 - 魔兽lua作图
type: channel
link: https://darksheep.vip/tag/%E9%AD%94%E5%85%BDlua%E4%BD%9C%E5%9B%BE/
items: 魔兽地图编辑器Lua作图教程5：X-LIK框架④物体编辑：技能
items: 魔兽地图编辑器Lua作图教程5：X-LIK框架③物体编辑：物品
items: 魔兽地图编辑器Lua作图教程5：X-LIK框架②物体编辑：单位
items: 魔兽地图编辑器Lua作图教程5：X-LIK框架①概述
items: 魔兽地图编辑器Lua作图教程4：雪月Lua框架⑪热更新
items: 魔兽地图编辑器Lua作图教程4：雪月Lua框架⑩事件、事件池模块
items: 魔兽地图编辑器Lua作图教程4：雪月Lua框架⑨窗口、键盘、鼠标、UI模块
items: 魔兽地图编辑器Lua作图教程4：雪月Lua框架⑧区域、可见度修正器、镜头模块
items: 魔兽地图编辑器Lua作图教程4：雪月Lua框架⑦中心计时器（Timer）模块
items: 魔兽地图编辑器Lua作图教程4：雪月Lua框架⑥触发器（Trigger）模块

魔兽地图编辑器Lua作图教程5：X-LIK框架④物体编辑：技能
type: item
date: 2025-04-30T23:27:00+08:00
description: 一、学习案例（一）TPL模版.md中的案例这是一个技能模板的链式调用定义，创建了一个名为"技能例子"的无目标技能，并设置了冷却时间、魔法消耗等属性，还定义了技能生效时触发的回调函数。技能模板定义部分TPL_ABILITY.DEMO = AbilityTpl() :name("技能例子") // 设置技能名称 :targetType(ability.targetType.none) // 设置目标类型为无目标 :icon("black") // 设置技能图标 :coolDownAdv(10, 0) // 设置基础冷却时间10秒，成长值0 :mpCostAdv(100, 0) // 设置基础魔法消耗100，成长值0 :onEvent(EVENT.Ability.Effective, // 绑定技能生效事件 function(effectiveData) echo("技能释放", effectiveData.triggerUnit:owner()) // 事件触发时打印信息 end)技能添加到单位部分local slot = (whichUnit):abilitySlot() // 获取单位的技能栏 // 三种添加技能的方式: slot:push(Ability(TPL_ABILITY.DEMO)) // 方式1: 通过Ability对象添加到最后可用格子 slot:push(TPL_ABILITY.DEMO) // 方式2: 直接通过模板添加到最后一个可用格子 slot:push(TPL_ABILITY.DEMO, 3) // 方式3: 添加到指定序号(3)的格子这部分展示了三种将技能添加到单位技能栏的方法，可以灵活地通过技能对象或直接通过模板添加，还能指定添加到特定格子位置。整个代码段展示了TPL系统的两个核心功能：通过模板定义可复用的技能配置灵活地将技能应用到单位上（二）demo.lua中的案例这个例子位于projects\mylua\scripts\globals\tpl\ability\demo.lua-- 技能模板定义 - Ability Template Definition ---@param abData eventOnAbilityGet 技能获取事件数据 TPL_ABILITY.DEMO = AbilityTpl() -- 创建新的技能模板 :name("剑之勇气") -- 技能名称 :description( -- 技能描述 { "越战越勇，每减少10%的HP则会增加10点攻击力", -- 基础效果说明 "效果最多叠加9层，最大90点攻击力", -- 效果上限说明 }) :targetType(ability.targetType.pas) -- 目标类型：被动技能 :icon("ReplaceableTextures\\CommandButtons\\BTNArcaniteMelee.blp") -- 技能图标路径 :onEvent(eventKind.abilityGet, -- 技能获取事件 function(abData) local ak = abData.triggerAbility:id() -- 获取技能唯一ID ---@param evtData eventOnClassAfterChange HP变化事件数据 event.syncRegister(abData.triggerUnit, eventKind.classAfterChange .. "hpCur", ak, function(evtData) local u = evtData.triggerUnit -- 获取触发单位 BuffClear(u, { key = "剑之勇气" .. ak }) -- 清除旧buff local cur = evtData.new -- 当前HP值 if (cur > 0) then -- 检查单位是否存活 local hp = u:hp() -- 最大HP值 local n = math.floor((hp - cur) / hp * 10) -- 计算buff层数(每损失10%HP为1层) if (n > 0) then -- 检查是否需要应用buff local atk = 10 * n -- 计算攻击力加成(每层+10) Buff({ -- 创建buff效果 object = u, -- 作用目标 key = "剑之勇气" .. ak, -- buff唯一标识 name = "剑之勇气" .. n .. "层", -- buff显示名称 signal = buffSignal.up, -- 增益型buff icon = "ReplaceableTextures\\CommandButto…

魔兽地图编辑器Lua作图教程5：X-LIK框架③物体编辑：物品
type: item
date: 2025-04-22T23:04:00+08:00
description: 一、学习案例（一）TPL模版.md中的案例TPL_ITEM.DEMO = ItemTpl() :modelAlias("TreasureChest") -- 宝箱模型 :name("物品例子") :bindAbility(TPL_ABILITY.DEMO) :icon("black") :worth({ gold = 10 }) :onEvent(EVENT.Item.Get, function(getData) echo("获得物品", getData.triggerUnit:owner()) end)ItemTpl() 调用：调用library/class/vast/itemTpl.lua中的构造函数。创建一个新的物品模板实例。返回的对象支持链式调用:modelAlias("TreasureChest")设置模型别名，内部会转换为实际模型路径。对应itemTpl.lua中的model()方法。:name("物品例子")设置物品名称，继承自Tpl基类的方法。:bindAbility(TPL_ABILITY.DEMO)绑定技能模板。对应itemTpl.lua中的bindAbilityTpl()方法。TPL_ABILITY.DEMO是另一个技能模板。:icon("black")设置物品图标。继承自Tpl基类的方法。:worth({ gold = 10 })设置物品价值，继承自Tpl基类的方法。这里设置金币价值为10:onEvent(EVENT.Item.Get, function(getData) echo("获得物品", getData.triggerUnit:owner()) end)注册物品获取事件处理器。-- 对应itemTpl.lua中的onEvent()方法。当单位获得该物品时触发回调。getData包含事件相关信息：triggerUnit: 触发事件的单位，owner(): 获取单位所属玩家。（二）demo.lua中的案例这个案例位于：projects\mylua\scripts\globals\tpl\item\demo.luaTPL_ITEM.DEMO = ItemTpl() --:model("???") -- 默认就是物品宝箱 :name("勇气之剑") :description("就是一把剑") :bindAbilityTpl(TPL_ABILITY.DEMO) :icon("ReplaceableTextures\\CommandButtons\\BTNArcaniteMelee.blp") :worth({ gold = 10 }) :onEvent(eventKind.itemGet, function(getData) echo(getData.triggerUnit:name() .. " 获得物品 " .. getData.triggerItem:name()) end)这个例子和TPL模版.md中的案例几乎一样，只是多了：:description("就是一把剑") --物品描述:icon("ReplaceableTextures\CommandButtons\BTNArcaniteMelee.blp") --使用了具体的图标路径，即War3内置的图标资源。:bindAbilityTpl(TPL_ABILITY.DEMO) --对应itemTpl.lua中的方法名变更。功能相同，都是绑定技能模板。二、学习输出（一）War3原生物品图标数据表物品ID物品名字物品图标afac阿利亚之笛ReplaceableTextures\CommandButtons\BTNAlleriaFlute.blpajen古之忍耐姜歌ReplaceableTextures\CommandButtons\BTNJanggo.blpamrc召唤护身符ReplaceableTextures\CommandButtons\BTNAmulet.blpanfg远古雕像ReplaceableTextures\CommandButtons\BTNClayFigurine.blpankh重生十字章ReplaceableTextures\CommandButtons\BTNAnkh.blparsc神秘卷轴ReplaceableTextures\CommandButtons\BTNBansheeAdept.blp（二）ItemTpl物品模板属性表分类方法参数类型可选值/范围示例说明等级经验expnumbernil≥0，不超过最大经验值exp(100)设置/获取物品当前经验值，自动限制范围 levelMaxnumbernil1 ≤ value ≤ game.expParams.item.maxLvlevelMax(5)设置/获取物品最大等级，不…

魔兽地图编辑器Lua作图教程5：X-LIK框架②物体编辑：单位
type: item
date: 2025-04-17T19:12:00+08:00
description: 在《魔兽地图编辑器Lua作图教程5：X-LIK框架①概述》我们已经通过输入.\xlik.exe new mylua新建了一个lua项目。它位于：projects\mylua文件夹下。B站火魂侠大佬是从防守演示图开始学习之旅。那么我作为一个萌新，之前最熟悉的还是WE地图编辑器了，所以另辟蹊径，从物体编辑开始记录我的学习情况。一、前言通过看火魂侠大佬的视频，以及阅读框架自带的TPL模版.md文档，我们很容易发现X-LIK框架物编使用的TPL，即template，意为模板、标准。技能、物品、单位都可以基于Tpl来构建。与传统物编对比特性传统物编TPL系统修改方式需要导出导入代码实时修改数据绑定松散关联强类型关联事件系统有限触发条件完整生命周期事件动态调整需要重启地图运行时立即生效二、学习案例（一）TPL模版.md中的案例TPL_UNIT.Demo = UnitTpl("Footman") -- 此处的Footman指引用语音，默认为nil/空字符串 -- 基础属性 :name("步兵") -- string 单位名称 :model("TheCaptain") -- string 单位模型路径 :icon("unit/TheCaptain") -- string 单位图标路径 :scale(1.2) -- number 模型缩放比例(1.0为原始大小) :preAbility() -- 预置技能 -- 等级系统 :level(1) -- number 初始等级(1-100) -- 战斗系统 :hp(100) -- number 最大生命值 :hpRegen(0) -- number 生命恢复/秒 :mp(100) -- number 最大魔法值 :mpRegen(5) -- number 魔法恢复/秒 :move(300) -- number 移动速度(游戏标准单位) :material(UNIT_MATERIAL.metal) -- enum 材质类型：flesh(血肉), rock(石材), metal(金属), wood(木质) :weaponSound("metal_slice_medium") -- string 武器音效路径 -- 攻击系统 :attack(10) -- number 基础攻击力 :attackSpaceBase(1.0) -- number 攻击间隔(秒) :attackRange(100) -- number 攻击范围(像素) :assault(Assault({ -- table 高级攻击配置 mode = "missile", -- 攻击类型： -- "melee": 近战 -- "missile": 投射物 -- "artillery": 抛物线投射物 model = "FaerieDragonMissile", -- string 投射物模型 homing = true, -- boolean 是否追踪目标 height = 200, -- number 投射物飞行高度 speed = 1200 -- number 投射物速度(像素/秒) }))（二）demo.lua中的案例这个案例位于：projects\mylua\scripts\globals\tpl\unit\demo.luaTPL_UNIT.DEMO = UnitTpl("Footman", "avatar") :preAbility({ TPL_ABILITY.DEMO2 }) :preItem({ TPL_ITEM.DEMO }) :name("步兵") :model("Footman") :weaponSound("metal_slice_medium") :move(200) :attack(10) :hp(150) :hpRegen(3) :reborn(3)UnitTpl("Footman", "avatar"): 创建一个新的单位模板，语音类型为"Footman"，图标为"avatar"。:preAbility({ TPL_ABILITY.DEMO2 }): 为该单位预设技能，这里是TPL_ABILITY.DEMO2。:preItem({ TPL_ITEM.DEMO }): 为该单位预设物品，这里是TPL_ITEM.DEMO。:name("步兵"): 设置单位的名称为"步兵"。:model("Footman"): 设置单位的模型为"Footman"。:weaponSound("metal_slice_medium"): 设置单位武器的声音为"metal_slice_medium"。:move(200): 设置单位的移动速度为200。:attack(10): 设置单位的攻击力为10。:hp(150): 设置单位的生命值为15…

魔兽地图编辑器Lua作图教程5：X-LIK框架①概述
type: item
date: 2025-04-15T23:51:00+08:00
description: 一、什么是X-LIK框架X-LIK 是来自阿魂小站的一个魔兽争霸3地图开发框架，可在 windows 平台上运行。它提供一套完整的War3地图开发框架(xlik-sdk)，通过声明式配置简化地图开发流程，支持资源管理和自动化构建，实现核心功能与项目特定功能的解耦。{span class="text-red-600"}最宝贵的是这个框架项目里提供了很多markdown文档和演示地图，无疑是黑夜里的一盏明灯。{/span}当然也有视频资源：bilibili火魂侠的X-LIK系列教程二、核心功能资源管理：支持多种游戏资源(音乐、字体、图片、模型等)提供资源测试和验证机制自动资源加载和路径管理脚本系统：无require的自动加载机制全局定义和流程代码分离支持脚本执行顺序控制扩展架构：主核心库(library)提供基础功能项目子库(project/library)支持定制扩展模块化设计(UI、技能、类系统等)三、框架获取点击跳转以下地址，可以通过Git clone获取，也可以直接下载zip文件解压后使用https://gitee.com/xlik-tutorial/xlik-sdk四、使用前的准备工作1、安装Visual Studio Code，并安装官网推荐插件，如Emmylua、Color Highlight等小知识：Emmylua插件装完以后，代码文件上会有很多红色波浪线。看着很不舒服。这是因为Emmylua更新后增加了很多代码诊断的功能。所以，可以在项目根目录创建一个名字为.emmyrc.json的文件来屏蔽，文件内容如下：{ "diagnostics": { "disable": [ "undefined-global" ] ｝ }2、双击xlik.exe会生成env.yaml文件3、配置env.yaml文件中的魔兽争霸3客户端文件路径。这里要注意路径里不使用\，而是使用/。如：# 魔兽争霸3客户端文件路径 # Warcraft 3 client file path war3: "F:/Warcraft III Frozen Throne"4、修改env.yaml文件中assets资源目录路径。这个文件夹目前位于vendor文件夹下。所以路径要改成：# assets资源目录 # assets resource directory assets: "vendor/assets"5、使用VS code打开xlik-sdk的项目文件夹五、X-LIK框架的学习之旅（一）熟悉终端命令1、新建lua项目点击VS code菜单终端——新建终端——输入：.\xlik.exe new mylua。注意这里mylua可以自定义名称。恭喜你！你已经新建了一张空白地图，你可以做左侧资源管理器里的project目录下看到mylua的文件夹。2、使用we编辑地图信息继续在终端里输入.\xlik.exe we mylua，可以打开we编辑器对地图进行编辑。这里的we编辑器使用的是vendor目录的WE编辑器。建议不要折腾怎么换编辑器，直接用完事。3、使用run运行地图继续在终端里输入.\xlik.exe run mylua，可以打开魔兽测试地图。注意，如果输入命令后，魔兽窗口一闪而过，多半是魔兽客户端有问题，推荐重下载阿魂小站推荐的纯净版。（二）下载演示项目一共有四个演示项目，其中Gitee有3个，分别是xlik-defence（防守）、xlik-tower（塔防）、xlik-demo（tpl和process演示），Github有1个，demo-retro（SLK演示）。火魂侠目前在B站有详细视频教程，这里就不赘述了。（三）熟悉框架结构框架里已经有了详细md介绍。这里主要想说的是，一般不改动library核心文件夹里的代码。主要的增删改在projects项目文件夹。└── project_demo - 项目目录 ├── assets - 项目资源引入, 必须写在此名字目录下，不要把流程代码写里面 ├── slk - slk物编配置引入, 必须写在此名字目录下，不要把流程代码写里面 ├── scripts - 项目脚本代码，必须写在此名字目录下 │ ├── globals - 全局定义（仅供参考） │ │ ├── setup - 用于定义游戏设定（仅供参考） │ │ ├── tpl - 用于建立对象模版（仅供参考） │ └── process - 项目流程代码，流程以 start 开始 ├── library -（·）局部子核心库（只编写对核心库的自定义拓展，文件对应结构须与全局library一致） │ └── encrypt.yaml -（·）混淆规则 └── w3x - 地图文件（没事别乱改，使用we命令修改参数，保存后自动生成备份） ├── resou…

魔兽地图编辑器Lua作图教程4：雪月Lua框架⑪热更新
type: item
date: 2025-01-05T20:19:22+08:00
description: 雪月Lua框架的热更新非常简单，只需要调用就行了。代码解释local storm = require 'jass.storm' --- 热更新.注意别死循环。 ---@param Entry string 入口文件(require用的路径) 一般是 Main function hotFix( Entry ) package.loaded[ Entry ] = nil xpcall(require, function (msg) print(msg, debug.traceback()) end, Entry) end引入 jass.storm 模块：local storm = require 'jass.storm'这行代码引入了 jass.storm 模块。jass.storm 是魔兽争霸III（Warcraft III）中用于JASS（Jass Ascension Scripting System）的Lua绑定库。它提供了与JASS交互的功能。定义 hotFix 函数：--- 热更新.注意别死循环。 ---@param Entry string 入口文件(require用的路径) 一般是 Main function hotFix( Entry )hotFix 是一个函数，用于执行热更新操作。Entry 是一个字符串参数，表示要加载的入口文件的路径（通常是 Main 或其他模块的路径）。清除已加载的模块：package.loaded[ Entry ] = nilpackage.loaded 是一个表，存储了所有已加载的模块。通过将 package.loaded[ Entry ] 设置为 nil，可以清除之前加载的模块，以便重新加载最新的版本。使用 xpcall 加载模块：xpcall(require, function (msg) print(msg, debug.traceback()) end, Entry)xpcall 是一个保护调用函数，用于捕获和处理可能发生的错误。require 是Lua的标准函数，用于加载和返回模块。function (msg) 是一个错误处理函数，当 require 执行过程中发生错误时会被调用。msg 是错误信息。debug.traceback() 返回调用堆栈信息，有助于调试。如何使用假设你有一个脚本 热更新.lua，并且你希望在游戏运行时动态更新这个脚本。以下是使用 hotFix 函数的步骤：创建脚本： 在 scripts 文件夹中创建一个 热更新.lua 文件，内容如下：-- 热更新.lua print("热更新.lua 加载成功！") -- 其他逻辑代码调用 hotFix 函数： 在你的入口脚本main.lua中调用 hotFix 函数，以加载和更新 热更新.lua。-- main.lua -- 引入热更新脚本 require 'xLua.Main' --载入框架 -- 可以用一个玩家输入事件来执行热更新 local trg1 = cj.CreateTrigger() cj.TriggerRegisterPlayerChatEvent(trg1, cj.Player(0), "100", true) cj.TriggerAddAction(trg1, function () hotFix('热更新') cj.DisplayTimedTextToPlayer(cj.Player(0),0,0,30,"热更新成功") end) -- 其他触发器逻辑 -- ...修改并测试：启动魔兽争霸III并加载你的地图。修改 热更新.lua 文件，例如添加新的打印语句：-- 热更新.lua print("热更新.lua 加载成功！") print("这是新的打印语句！") -- 其他逻辑代码保存 热更新.lua 文件。观察游戏中的输出，确保新的打印语句被正确加载。注意事项路径问题：确保 Entry 参数的路径正确，并且脚本文件在游戏运行时可访问。路径通常是相对于 scripts 文件夹的相对路径。避免死循环：确保 hotFix 函数不会被无限递归调用，否则会导致死循环。错误处理：在实际应用中，添加更多的错误处理逻辑，以确保热更新过程中的稳定性。

魔兽地图编辑器Lua作图教程4：雪月Lua框架⑩事件、事件池模块
type: item
date: 2025-01-03T19:17:00+08:00
description: 分析 xLua.module.Event 文件夹内的方法xLua.module.Event 模块主要用于处理事件（Event）系统。事件系统在游戏开发中非常常见，用于处理各种游戏事件，如玩家输入、单位事件、触发器事件等。以下是 xLua.module.Event 模块的主要方法及其使用说明：主要方法reg(event_name, params)功能: 注册一个事件。参数:event_name (string): 事件名称。params (table): 包含以下字段的表：type (string): 事件类型，例如 'unit'、'player' 等。unit (unit, 可选): 单位对象（如果事件类型是单位事件）。player (player, 可选): 玩家对象（如果事件类型是玩家事件）。返回值: 无。reReg(event_name, params)功能: 重新注册一个事件。参数:event_name (string): 事件名称。params (table, 可选): 重新注册事件时的参数。返回值: 无。notify(event_name, action, params)功能: 通知事件池中的事件。参数:event_name (string): 事件名称。action (string): 操作类型，例如 '注册事件'、'重新注册事件' 等。params (table): 包含事件参数的表。返回值: 无。update(event_name, params)功能: 更新事件池中的事件。参数:event_name (string): 事件名称。params (table): 包含事件参数的表。返回值: 无。使用案例下面是一个具体的案例，展示了如何使用 xLua.module.Event 模块注册、更新和处理事件。案例：注册和处理玩家事件-- 引入必要的模块 local eventpool = require "xLua.module.EventPool" local playerModule = require "xLua.module.Player" local eventModule = require "xLua.module.Event" -- 获取玩家对象（假设玩家1） local player1 = playerModule[1] -- 定义一个事件处理函数 local function onPlayerChat(event, params) print("玩家 " .. params.player.id .. " 发送了消息: " .. params.message) end -- 注册玩家聊天事件 eventModule.reg('玩家-聊天消息', { type = 'player', player = player1, on_update = onPlayerChat }) -- 模拟玩家发送聊天消息 local function simulatePlayerChat(player, message) eventpool:update('玩家-聊天消息', { player = player, message = message }) end -- 模拟玩家1发送聊天消息 simulatePlayerChat(player1, "Hello, World!")扩展案例：注册和处理单位事件下面是一个更复杂的案例，展示了如何使用 xLua.module.Event 模块注册、更新和处理单位事件。扩展案例：注册和处理单位事件-- 引入必要的模块 local eventpool = require "xLua.module.EventPool" local playerModule = require "xLua.module.Player" local unitModule = require "xLua.module.Unit" local eventModule = require "xLua.module.Event" -- 获取玩家对象（假设玩家1） local player1 = playerModule[1] -- 创建一个新的单位（假设单位类型为 'hpea'） local unit = unitModule:new({ player = player1, id = 'hpea', x = 500, y = 500 }) print("单位创建成功，位置: x=" .. unit.x .. ", y=" .. unit.y) -- 定义一个事件处理函数 local function onUnitDeath(event, params) print("单位 " .. params.unit.id…

魔兽地图编辑器Lua作图教程4：雪月Lua框架⑨窗口、键盘、鼠标、UI模块
type: item
date: 2025-01-03T19:11:00+08:00
description: 这个小节主要介绍下雪月Lua框架xLua\module\Window、xLua\module\Keyboard 和 xLua\module\Mouse 这三个文件夹内与窗口、键盘和鼠标相关的方法。1. 窗口模块文件路径: xLua\module\Window\init.lua描述:xLua\module\Window 模块提供了创建和管理窗口的功能。主要方法:window:new(params):描述: 创建一个新的窗口对象。参数:params (table): 包含创建窗口所需参数的表，如 x, y, w, h, title 等。x (number): 窗口左上角的X坐标。y (number): 窗口左上角的Y坐标。w (number): 窗口的宽度。h (number): 窗口的高度。title (string, 可选): 窗口的标题。返回值: 返回一个窗口对象。示例:local myWindow = window:new({ x = 0.1, y = 0.1, w = 0.3, h = 0.3, title = "My Window" })2. 键盘模块文件路径: xLua\module\Keyboard\default.lua描述:xLua\module\Keyboard 模块提供了注册和处理键盘事件的功能。主要方法:keyboard:hotkey(eventNmae, combKey, key, callback):描述: 注册一个热键事件。参数:eventNmae (string): 事件名称，如 "键盘-按下" 或 "键盘-松开"。combKey (int): 组合键，可以多个组合键相加，如 xconst.keyboard.COMB_CTRL。key (int): 主要按键，如 xconst.keyboard.KEY_F5。callback (function): 回调函数，接收两个参数：event 和 params。返回值: 返回事件对象。示例:local event_f5 = keyboard:hotkey('键盘-按下', 0, xconst.keyboard.KEY_F5, function(event, params) print("F5 键被按下") end)3. 鼠标模块文件路径: xLua\module\Mouse\init.lua描述:xLua\module\Mouse 模块提供了注册和处理鼠标事件的功能。主要方法:mouse:event(eventName, callback):描述: 注册一个鼠标事件。参数:eventName (string): 事件名称，如 "鼠标-按下"、"鼠标-松开"、"鼠标-点击"、"鼠标-双击"、"鼠标-移动"、"鼠标-滚轮"。callback (function): 回调函数，接收两个参数：event 和 params。返回值: 返回事件对象。示例:local event_mouse_click = mouse:event('鼠标-点击', function(event, params) print("鼠标点击位置:", params.x, params.y) end)综合示例下面是一个综合示例，展示了如何使用 window、keyboard 和 mouse 模块来创建窗口、注册键盘热键和鼠标事件。-- 引入必要的模块 require 'xLua.module.Window' require 'xLua.module.Keyboard' require 'xLua.module.Mouse' -- 创建一个窗口 local myWindow = window:new({ x = 0.1, y = 0.1, w = 0.3, h = 0.3, title = "My Window" }) -- 注册一个键盘热键 (F5) local event_f5 = keyboard:hotkey('键盘-按下', 0, xconst.keyboard.KEY_F5, function(event, params) print("F5 键被按下") -- 在窗口中显示消息 myWindow:msg("F5 键被按下") end) -- 注册一个鼠标点击事件 local event_mouse_click = mouse:event('鼠标-点击', function(event, params) print("鼠标点击位置:", params.x, params.y) -- 在窗口中显示消息 myWindow:msg("鼠标点击位置: " .. params.x .. ", " .. params.y) end) -- 注册一个鼠标移动事件 local event_mouse…

魔兽地图编辑器Lua作图教程4：雪月Lua框架⑧区域、可见度修正器、镜头模块
type: item
date: 2025-01-03T19:10:00+08:00
description: 从这节开始，我把一些小模块集中介绍。矩形（Rect）xLua.module.Rect 模块主要用于处理矩形（Rect）对象。矩形对象在游戏开发中非常常见，用于表示区域、碰撞检测、UI布局等。主要方法new(x, y, width, height)功能: 创建一个新的矩形对象。参数:x (number): 矩形左下角的 x 坐标。y (number): 矩形左下角的 y 坐标。width (number): 矩形的宽度。height (number): 矩形的高度。返回值: 矩形对象 (rect 类型)。contains(x, y)功能: 检查给定的点是否在矩形内。参数:x (number): 点的 x 坐标。y (number): 点的 y 坐标。返回值: 布尔值，如果点在矩形内则返回 true，否则返回 false。intersects(otherRect)功能: 检查当前矩形是否与另一个矩形相交。参数:otherRect (rect): 另一个矩形对象。返回值: 布尔值，如果两个矩形相交则返回 true，否则返回 false。move(dx, dy)功能: 移动矩形。参数:dx (number): 沿 x 轴移动的距离。dy (number): 沿 y 轴移动的距离。返回值: 无。resize(dWidth, dHeight)功能: 调整矩形的大小。参数:dWidth (number): 宽度的变化量。dHeight (number): 高度的变化量。返回值: 无。getCenter()功能: 获取矩形的中心点坐标。参数: 无。返回值: 包含 x 和 y 坐标的表。getArea()功能: 获取矩形的面积。参数: 无。返回值: 矩形的面积（number 类型）。使用案例下面是一个具体的案例，展示了如何使用 xLua.module.Rect 模块创建、移动、调整大小、检查包含关系和相交关系的矩形。案例：创建和操作矩形-- 引入 Rect 模块 local rectModule = require "xLua.module.Rect" -- 创建一个新的矩形 local rect1 = rectModule.new(10, 10, 50, 30) print("矩形1: x=" .. rect1.x .. ", y=" .. rect1.y .. ", width=" .. rect1.width .. ", height=" .. rect1.height) -- 创建另一个矩形 local rect2 = rectModule.new(30, 20, 40, 20) print("矩形2: x=" .. rect2.x .. ", y=" .. rect2.y .. ", width=" .. rect2.width .. ", height=" .. rect2.height) -- 检查点是否在矩形内 local pointInside = rect1:contains(20, 20) print("点 (20, 20) 是否在矩形1内: " .. tostring(pointInside)) -- 移动矩形1 rect1:move(10, 10) print("移动后的矩形1: x=" .. rect1.x .. ", y=" .. rect1.y .. ", width=" .. rect1.width .. ", height=" .. rect1.height) -- 调整矩形1的大小 rect1:resize(20, 10) print("调整大小后的矩形1: x=" .. rect1.x .. ", y=" .. rect1.y .. ", width=" .. rect1.width .. ", height=" .. rect1.height) -- 检查两个矩形是否相交 local isIntersecting = rect1:intersects(rect2) print("矩形1和矩形2是否相交: " .. tostring(isIntersecting)) -- 获取矩形1的中心点 local center = rect1:getCenter() print("矩形1的中心点: x=" .. center.x .. ", y=" .. center.y) -- 获取矩形1的面积 local area = rect1:getArea() print("矩形1的面积: " .. area)迷雾（Fog）xLua.module.Fog 模块主要用于处理游戏中的迷雾（Fog）效果。迷雾效果用于控制玩家视野范围，增加游戏的策略性和挑战性。主要方法rect(params)功能: 设置指定矩形区域的迷雾状态。…

魔兽地图编辑器Lua作图教程4：雪月Lua框架⑦中心计时器（Timer）模块
type: item
date: 2025-01-03T18:47:00+08:00
description: 这个小节主要介绍下雪月Lua框架xLua.module.Timer 文件夹xLua.module.Timer 模块主要用于创建和管理计时器（Timers）。计时器在魔兽地图制作中非常常见，用于在特定时间间隔执行某些操作，例如刷兵、动画、状态更新、冷却时间等。主要方法new()功能: 创建一个新的计时器对象。返回值: 计时器对象 (timer 类型)。start(interval, callback, repeat)功能: 启动计时器。参数:interval (number): 计时器间隔时间（秒）。callback (function): 计时器触发时执行的回调函数。repeat (boolean, 可选): 是否重复执行，默认为 false。返回值: 无。stop()功能: 停止计时器。参数: 无。返回值: 无。pause()功能: 暂停计时器。参数: 无。返回值: 无。resume()功能: 恢复计时器。参数: 无。返回值: 无。del()功能: 删除计时器，释放相关资源。参数: 无。返回值: 无。使用案例下面是一个具体的案例，展示了如何使用 xLua.module.Timer 模块创建、启动、停止和删除计时器。案例：创建一个每秒打印一次消息的计时器-- 引入 Timer 模块 local timer = require "xLua.module.Timer" -- 创建一个新的计时器 local myTimer = timer:loop(2, function() print("计时器触发了！当前时间: " .. os.date("%H:%M:%S", os.time())) end)

魔兽地图编辑器Lua作图教程4：雪月Lua框架⑥触发器（Trigger）模块
type: item
date: 2025-01-03T18:44:00+08:00
description: 这个小节主要介绍下雪月Lua框架xLua.module.Trigger 文件夹xLua.module.Trigger 文件夹提供了与触发器（Trigger）相关的功能，包括创建、操作和管理触发器。1. 触发器的创建与注册创建触发器触发器可以通过 trigger:new() 方法创建。每个触发器可以包含多个事件和动作。local trigger = require "xLua.module.Trigger" -- 创建一个新的触发器 local myTrigger = trigger:new()注册事件触发器需要注册事件来监听特定的游戏事件。例如，单位死亡、玩家按下某个键等。-- 注册一个事件到触发器 myTrigger:registerEvent("单位-死亡", function(event, params) print("单位死亡事件被触发") end)2. 添加动作添加动作到触发器触发器可以在事件触发时执行一系列动作。这些动作可以是简单的函数调用，也可以是复杂的逻辑处理。-- 添加动作到触发器 myTrigger:addAction(function(event, params) print("执行触发器的动作") end)3. 启用和禁用触发器启用触发器触发器默认是启用状态，但可以通过 enable() 方法显式启用。-- 启用触发器 myTrigger:enable()禁用触发器有时需要临时禁用触发器，以防止其响应事件。-- 禁用触发器 myTrigger:disable()4. 销毁触发器销毁触发器当不再需要触发器时，可以通过 destroy() 方法销毁它，释放相关资源。-- 销毁触发器 myTrigger:destroy()5. 示例以下是一个简单的示例，展示了如何创建、添加动作触发器。 ocal function say_hello() print("你好!") end local trg2 = trigger:new() trg2:action(say_hello())