YDWE防守图制作教程
文章目录
- 一、成品展示
- 二、地图初始化(第12课)
- 2.1 设置地图初始参数
- 2.2 统计玩家信息
- 2.3 触发编写注意事项
- 三、英雄与难度选择(第13-14课)
- 3.1 英雄选项
- 3.1.1 物编设置
- 3.1.2 触发设置
- 3.2 难度选择
- 四、刷兵与死亡系统
- 4.1 刷兵初始化
- 4.2 波次调度与倒计时
- 4.3 单次刷兵函数
- 4.4 死亡事件(第16课)
- 4.4.1 怪物死亡与英雄死亡
- 4.4.2 怪物死亡掉落事件(23)
- 4.4.3 基地死亡(第17课)
- 五、多面板
- 5.1 创建多面板,绑定英雄自定义键值(名称和图标)
- 5.2 设置多面板内容
- 5.3 更新多面板
- 5.3.1 显示全局游戏时间
- 5.3.2 显示玩家信息
- 六、暴击
- 6.1 设置初始暴击率和暴击倍率
- 6.2 暴击事件与基地伤害事件
- 6.3 飘浮文字函数
- 七、物品系统
- 7.1 物编设置
- 7.2 物品叠加与校验
- 7.3 物品合成
- 八、技能(24)
- 8.1 光环技能
- 8.1.1 物编设置
- 8.1.2 触发实现
- 8.2 天赋技能
- 九、商店系统
- 9.1 抽奖互动
- 9.1.1 物编设置
- 9.1.2 触发实现
- 9.2 装备商店
- 十:测试
- 10.1 单位与敌人平衡调整
全文参考B站视频《【YDWE】从零开始的防守图制作教程》
一、成品展示
这是一张防守图,中间是圣诞树(防守基地)以及商店、出生点。整张图一共有四条刷兵路线。该防守图主要具备以下功能:
-
英雄选择:做一个相对简单的系统。玩家进入游戏后,每人获得一个小精灵。小精灵有四个技能,点击对应技能即可变成对应英雄。这四个英雄分别是:
- 游侠:敏捷英雄,天赋为召唤幽灵狼
- 火枪手:敏捷英雄,天赋为火焰箭
- 牛头人:力量英雄,天赋为冲击波
- 步兵:力量英雄,天赋为雷霆一击
-
多面板信息显示:显示游戏累计时间、距离下一波进攻的剩余秒数、每个玩家选择的英雄(包括英雄头像)当前攻击力、杀敌数、当前游戏难度等信息。可自动检测到离线玩家,将其显示为“用户已离线”。
-
难度选择:游戏开始5秒后,所有玩家弹出难度选择窗口进行投票。 游戏开始约40秒时,根据投票票数最高的难度确定当前游戏难度,并弹出提示。
-
商店系统:商店有出售三种基础装备(剑/盾/戒指),每种装备都可以用对应的强化宝石+能量结晶强化(强化分别需要5/10/20个),最高可强化至lv3
-
装备系统
- 自动合成:类似Dota的效果,拾取合成所需材料(如剑、戒指、能量结晶等)时,系统自动检测并合成高级装备。本图中现有三种装备,每件可升级三次,一共九种合成。
- 装备限制:玩家只能携带一种基础装备,比如剑只能拿一把,再买会掉落地面无法拾取到物品栏。
-
英雄技能:每个英雄初始自带一个天赋,还有被动光环和被动技能(怪物掉落或抽奖获得)可以学习,但都只能学习一个。如果已有该技能,点击则替换原有技能。
-
伤害系统:做了一个非常简陋的伤害系统的一小部分——暴击。玩家自带20%的暴击属性(2倍伤害),触发暴击时会显示字幕特效。暴击属性可扩展为其他虚拟属性(如闪避等)。
-
刷兵与掉落:
- 刷新的怪物将随机从骷髅法师,骷髅弓箭手和骷髅战士中获取模型,随后按照当前波数更改其生命值。
- 每60秒进入下一波,每波刷新每个方向10个总计40个敌人。每波敌人属性还会根据当前游戏难度动态增强。
- 因为兵刷出来不会自己动(会直接走过去),需要用单位组下命令,制作简易AI
- 敌人死亡会掉落金钱,并概率掉落装备、能量结晶(可叠加)、以及技能,并设置有掉落字幕。
-
圣诞老人互动功能
- 暂停刷兵:暂停期间敌人停止生成,且已暂停时无法重复操作。
- 抽奖系统:玩家击杀敌人后,会获得击杀数,击杀数可以在圣诞老人处抽奖,可以得到能量结晶和技能书。玩家可以通过对话框选择,单抽还是十连(十连将减少10%消耗)。技能书有四种——荆棘光环、专注光环、耐久光环、命令光环,重复学习将会覆盖旧的光环。
-
英雄复活:玩家死亡后会在10秒后复活
-
胜利机制:
- 如果圣诞树被摧毁,则游戏结束。基地被攻击时所有玩家都将得到提示,并显示剩余生命值百分比。
- 如果波数达到20,同时玩家清除掉了所有现有敌人,将获得胜利
二、地图初始化(第12课)
首先规划一下简单的触发分类:
- AA - 地图初始化: 游戏开始时统计玩家数量、发送消息等。
- AB - 事件入口: 处理各种游戏事件。
- BA - 物品相关: 物品掉落、合成、叠加。
- BB - 技能机制相关: 技能学习、替换等。
接着创建一个常用语句库的触发,像if语句、设置变量、设置自定义键值、创建收纳盒、显示debug信息这些经常用到的语句可以先写进去,后面用的时候直接复制,就不用挨个找语句了。
地图初始化的时候,玩家还没有进入游戏,所以要做的只有两件事——设置玩家组,统计玩家信息;以及新建物品掉落池和刷怪的单位组。
2.1 设置地图初始参数
地图初始化的时候,玩家还没有进入游戏,所以要做的只有设置一些初始参数,比如物品掉落池、抽奖池、玩家组和单位组(刷怪用)。
首先是设置怪物掉落的物品奖池。为了能在游戏的任何触发器中都能调用这个预设的物品奖池,我需要将它存储在一个全局的、中心化的存储对象里,这里选的是字符串Game的自定义键值对里,然后往里面添加掉落物品。接着同样的方式创建抽奖奖池和单位组。这样,Game的三个键“物品奖池”、“抽奖奖池”、“AI组”就都设定了。
2.2 统计玩家信息
游戏开始之后,需要统计玩家信息,这包括:
- 新建玩家组
pp(Player Group)
,存储到字符串Game
的玩家组
键下。 - 遍历玩家 1 到 4:逆天的循环可以套多层
- 获取玩家
P
。这里使用的是转换玩家ID为玩家:
- 判断
P
是用户(玩家控制者)且正在游戏中(玩家游戏状态); - 将符合条件的玩家加入
PP
组。
- 获取玩家
- 获取
pp
组中的玩家数量(玩家-玩家组中的玩家数量)。 - Debug:对玩家组🀄️所有玩家做动作——发送当前游戏的玩家数量(对玩家显示文本信息[指定时间])。
- 遍历每个玩家,为其生成小精灵(待做)
- 上图🀄️的
point
是一会要创建英雄的点位,具体对应的位置是在圣诞树跟前。- 一般地图加载慢是因为初始设置的变量比较多,执行的脚本比较多。
2.3 触发编写注意事项
- 提前将常用的语句进行存储,便于复制
- 多写一些debug语句,便于判断触发执行的流程到哪了
- 创建的临时特效、指定次数的计算器等内容用完后要及时清除,否则会持续占用内容。比如非永久循环的计时器,创建之后马上写一个清除语句,免得忘了。
三、英雄与难度选择(第13-14课)
3.1 英雄选项
3.1.1 物编设置
接下来,我需要创建这个地图所需的基本单位。目前我们刚完成初始化触发,所以要先从物编(物体编辑器)开始。
-
创建单位模板(选择英雄):首先,我需要一个用于英雄选择的小精灵,将其命名为“选择英雄”
- 删除所有技能、使用的科技和可建造建筑,清除单位类别(原本类别是工人,没有采集资源就会不停的提示单位正在空闲🀄️);
- 将黄金消耗、木材消耗、人口占用等全部设为0。生命值设为10,基础速度设为1(免得乱跑),视野范围设为500;
- 将其重命名为“单位模板”,并归类到“人族”以便管理。
-
创建英雄通用模板:基于“圣骑士”复制一个新单位作为英雄基础模板。删除所有技能、称谓、提示信息。初始三围各10点,每级属性提升各3点,计划英雄满级为5级。
-
创建四个英雄:复制四次英雄模板,创建四个英雄——火枪手(灼热之箭)、牛头人(震荡波)、游侠(野兽幽魂)、步兵(雷霆一击)。注意,护甲类型影响伤害计算,装甲类型只影响被近战攻击时的音效。为火枪手添加投射物模型,否则看不到射出的子弹轨迹。
-
创建技能模板(用于英雄选择):基于“通魔”技能创建模板(没有任何主动技能和被动技能)。设置等级1;动作持续时间、冷却时间、魔法消耗均设为0;勾选“单独释放”和“图标可见”(图标可见表示单位学习此技能后,在技能栏可以看到技能图标);删除目标点和目标特效,最后设置为非英雄技能(这样小精灵单位才可以学习)
-
创建四个英雄选择技能:使用技能模板创建四个技能:“选择步兵”、“选择火枪手”、“选择AC”、“选择牛头人”,并为每个技能设置不同的图标、说明、热键、技能位置和基础命令ID。
同一个单位身上携带的不同技能,其“基础命令ID”不能相同,否则会冲突。但不同单位的技能ID可以相同(比如大家都会火球术)。另外还需要勾选“单独释放”选项,这样,即使框选多个单位,也只有当前选中的单位会响应技能。只要遵循 “同单位技能ID不同”+“勾选单独释放” 这两个原则,就能完全避免命令冲突。
这样物编部分就做完了。虽然物编界面看起来比触发器简单直观,但实际上物编里隐藏的“坑”和未知问题远比触发器要多。物编最好只用来定义单位的“外观层”属性(如模型、基础数值等),而所有核心的“效果层”游戏逻辑(如技能机制、特殊系统)都应该尽量使用触发器来实现。当触发器实现的效果出现问题时,你可以将触发器逻辑截图向他人求助,别人能清晰地看出问题所在。但如果你用物编来实现复杂效果,一旦出现BUG,由于其内部逻辑不直观,排查将极为困难。
3.1.2 触发设置
-
创建小精灵: 在之前创建的“游戏开始”触发中,我们需要在给每位玩家创建“选择英雄”(小精灵)后,将镜头立即移动到该单位的位置。
- 为当前玩家
pa
在预设点point
创建单位“选择英雄”,并将该单位赋值给变量u
。 - 获取单位
u
的位置,并赋值给一个新的点变量pointt
(作为临时缓存点)。 - 将玩家
pa
的镜头立即平移至Pointt
点。 - 使用选择单位-指定玩家语句,让玩家自动选择到刚刚创建的英雄身上。
- 使用“清除点动作删除临时点
pointt
和预设点point
。
- 为当前玩家
-
英雄选择触发:
- 事件:必须设置为 “单位 - 任意单位 发动技能效果”, 只有这个事件才能准确获取到技能释放的目标、地点等信息。不要使用“开始施放技能”或“停止施放技能”等事件。
- 动作:收集触发单位(小精灵)、触发目标和触发技能这三个参数。如果释放的技能
S
是否是我们定义的四个英雄选择技能之一,就调用另一个英雄创建函数来生成对应的英雄(逆天-触发器运行),同时传递过去触发单位和触发技能这两个参数(逆天-变量设置)。
-
英雄创建触发:根据上一个事件触发传过来的两个参数,进行英雄的创建。将事件捕获和逻辑执行分开,让代码结构更清晰。
- 读取传入参数,使用四个“If-Then”条件判断要创建的英雄单位是哪一个,将其存入局部变量
ut(Unit_Type)
🀄️; - 在触发单位的位置
point
为玩家p
生成对应的英雄ut
,并强制玩家选择到刚刚创建的英雄单位 - 设置英雄初始暴击率和暴击倍率
- 创建英雄生成特效(其它-复生之焰),持续5秒
- 使用逆天-自定义值-设置,将
ut
存储为玩家p
的英雄(全局变量),最后删除局部变量u
和point
- 读取传入参数,使用四个“If-Then”条件判断要创建的英雄单位是哪一个,将其存入局部变量
3.2 难度选择
为实现游戏难度分级(简单、测试、中等、困难),设计了一个交互式难度选择系统,核心流程为:
-
创建难度选择界面,并注册响应事件:在地图初始化时,创建一个对话框(
loc_d
)作为选择界面的主体,并为对话框创建四个难度选项按钮,设置其标题和快捷键。为每一个难度按钮创建一个独立的触发器,定义被点击时玩家选择的难度是多少。
-
难度判定:
- 游戏开始5秒后,再为所有玩家显示难度选择对话框;
- 启动一个30秒的难度选择倒计时,当30秒的选择计时器到期后,会检查每位玩家是否已经做出选择。
如果 玩家 loc_p 的难度选择 等于 0
(未选择),为该玩家随机分配一个1-4的难度值。然后关闭该玩家的对话框; - 启动一个35秒的计时器,到期后统计每个玩家选择的难度,最高票的选择为最终的难度选择,并存储此难度信息。
四、刷兵与死亡系统
整个系统由三个核心触发器协同工作:
- AA03: 刷兵初始参数设定 (初始化)
- BB00b: 每次刷兵倒计时 (核心调度器)
- BB002: 单次刷兵执行 (刷兵执行者)
其整体工作流程可以概括为以下的序列图:
4.1 刷兵初始化
- 获取AI单位组: 从游戏缓存中读取一个预设的、名为“GAME的AI组”的单位组,这个单位组用于管理所有被刷出的敌人;
- 创建单位池: 建立一个随机单位池(骷髅战士3,骷髅弓箭手1,骷髅法师*1);
- 设置AI主动进攻: 启动一个每3秒循环的计时器,命令AI单位组中的所有单位向地图中心(0,0)发起攻击移动。如果单位已经在攻击状态,则不做改变,这确保了敌人会持续进攻。
- 启动刷兵调度器
BB00b
: 运行BB00b: 每次刷兵倒计时
(携带参数AI单位组loc_Alup
、单位池loc_utp
,初始波数loc_iw = 1
),启动了整个波次循环。
注意,这里直接对单位组🀄️所有单位发布攻击移动命令会出bug,因为此命令最多只能对单位组🀄️12个单位生效,所以只能遍历单位组🀄️的所有单位来发布命令。另外单位组的单位死亡,没有将其移出单位组,后续会处理。
4.2 波次调度与倒计时
运行1个1秒的循环倒计时:
-
倒计时递减:
- 暂停判定: 检查游戏全局变量“GAME的暂停刷兵”是否为
TRUE
。这是一个开关,可以临时暂停刷兵。 - 倒计时递减: 将全局变量“GAME的time”的值减1。这个变量代表下一波进攻到来的剩余秒数。
- 暂停判定: 检查游戏全局变量“GAME的暂停刷兵”是否为
-
更新刷兵倒计时:
- 将剩余时间
time
和当前波数loc_iw
拼接成一句富文本字符串(如“12秒后第3波进攻开始”)。 - 将这句文本更新到游戏的多面板(一个自定义的UI界面)上,让玩家清晰看到倒计时。
- 将剩余时间
-
刷兵判定:如果“GAME的time”等于
0
,调用触发器BB002: 单次刷兵执行
,执行刷兵流程,并传入当前参数(单位组、单位池、波数)。判断波数是否达标:-
如果波数
loc_iw
是否等于20,即是否是最后一波, 清除当前的1秒倒计时计时器。启动一个新的1秒循环计时器,持续检查AI单位组loc_Alup
中的单位数量。当AI单位组中单位数量为0
(即所有敌人都被消灭)时,设置所有玩家胜利。 -
如果未达到20波:启动下一波, 再次调用
BB00b
自身,但传入的波数参数为loc_iw + 1
,并清除当前计时器。这样就为下一波设置了新的倒计时,循环继续。
关键点: 每一波的倒计时时间是在
BB00b
的“刷兵结构” -> “获取到必要参数”动作中动态读取的。它根据一个由wave
+波数组成的字符串(如wave1
,wave2
)从游戏缓存中读取预设的时间值。这使得每一波的间隔时间可以灵活配置。 -
4.3 单次刷兵函数
- 读取难度: 从游戏缓存中读取玩家投票决定的最终难度值
loc_in
。这个值将直接影响怪物强度。 - 在四个角落开启刷兵: 系统会在地图的左下、左上、右上、右下四个角落并行地执行相同的刷兵逻辑。
- 单角落刷兵细节 (以左下角为例,图3):
- 运行一个快速循环计时器: 周期为0.5秒,以实现每隔半秒刷了一个兵的效果。
- 新建单位: 从单位池
loc_utp
中随机为一个玩家(灰色,通常是中立敌对)创建一个单位,并放置在固定的出生点。 - 根据波数和难度强化单位:
- 生命值公式:
25 + 当前波数 * 难度值 * 10
- 攻击力公式:
5 + 当前波数 * 难度值 * 0.5
- 公式解读: 波数和难度越高,怪物的生命值和攻击力成长越强,保证了游戏后期的挑战性。
- 生命值公式:
- 将新单位加入AI组: 将新刷出的单位添加到全局的AI单位组
loc_Alup
中,这样它就会受到第一步中“AI主动进攻”命令的驱使,并且会被“胜利判定程序”所统计。 - 判断个数并结束本次刷兵: 每个角落刷兵计数器
loc_it
会累加。 当loc_it
等于25时,表示这个角落的25个兵已刷完。- 向所有玩家发送文本信息:“第X波进攻结束了”。
- 清除当前0.5秒的刷兵计时器,结束这个角落的刷兵流程。
上述代码中,创建的怪物单位属于玩家9,它会自动攻击其它玩家。但是非中立单位即使设置了杀死之后的黄金和经验奖励,也无法生效,需要手动打开其奖励属性:
4.4 死亡事件(第16课)
设置任意单位死亡事件,将凶手单位和死亡单位分别存储为局部变量uk
和u
,然后根据死亡单位是英雄、怪物或者基地,来分别进行处理:
- 怪物死亡:将其从单位组🀄️移除,将玩家杀敌数+1,最后启用掉落函数,设置怪物的掉落情况;
- 基地死亡:见下一节
- 玩家死亡:
- 公告玩家被凶手XX杀死,将在10秒后复活( 持续10秒)
- 启动复活计时器,创建并显示一个10秒的计时器窗口,倒计时归零后复活英雄。
- 复活后将其玩家镜头移动到复活的英雄身上,并强制玩家选中次英雄
4.4.1 怪物死亡与英雄死亡
4.4.2 怪物死亡掉落事件(23)
怪物掉落函数:
- 接受参数——死亡单位u
- 设置怪物掉落概率为10%,掉落奖池为预设的掉落池
- 如果掉落,随机获取奖池🀄️的一个物品,创建在死亡怪物的位置,并在此处弹出物品掉落字幕
掉落字幕函数:
- 接收参数:掉落坐标、物品信息、字幕大小;
- 设置字幕属性:新建字幕对象并设置初始属性——掉落坐标上方50,大小为size,内容为物品信息,颜色为白色, 3秒后 自动删除这个漂浮文字;
- 动态效果——漂移
- 随机生成一个-0.6到0.6之间的X方向的偏移量 loc_xt,这决定了字幕是向左还是向右漂移;
- 根据勾股定理,计算出一个对应的Y方向偏移量 loc_yt,确保漂移方向向量 (loc_xt, loc_yt)的长度为1(即单位向量)。这使得字幕可以向任意方向(360度)等概率漂移。
- 将这两个偏移量乘以0.02,作为字幕在X和Y轴上的移动速率。这样,字幕就会以一个平缓的速度沿着随机方向飘走。
- 动态效果——大小渐变:
- 启动一个周期为0.03秒的循环计时器,共执行10次;
- 前5次字体逐渐变大:字体大小 = 基础大小 + 当前次数;后5次字体逐渐缩小:字体大小 = (基础大小 + 10) - 当前次数。
4.4.3 基地死亡(第17课)
- 物编设置:复制兽族的巫毒商店,将其模型改为圣诞树,模型缩放设为6倍。基础护甲为10点,防御升级奖励为0。设置生命上限为10000,生命回复为10点,视野为1000,放置要求改为“可通行地面”、非荒芜之地。
- 触发设置:通知所有玩家游戏失败,并启动一个10秒的计时器,10秒后为所有玩家结算游戏失败结局
五、多面板
5.1 创建多面板,绑定英雄自定义键值(名称和图标)
在地图初始化🀄️,将每种英雄的名称(name)和图标(头像)绑定到其身上,方便在多面板设置中调用:
5.2 设置多面板内容
- 获取玩家组
- 创建一个6行3列的面板,使用“设置项目文本” ,修改第一行标题为守护者、攻击强度(攻击力)和杀敌数;
- 修改2-5行后两列的图标分别为杀敌数图标和攻击力图标
- 设置每一列🀄️每一行的宽度为屏幕的5%
- 设置多面板状态为显示(默认取消)
5.3 更新多面板
5.3.1 显示全局游戏时间
创建1个计时器,每隔1秒更新一次多面板信息:
- 时间累积:使用整数
is
记录秒数,每秒自增1
;当is
达到60
时,分钟数im
加1
,秒数重置为0
;同理,分钟数达到60
时,小时数ih
加1
,分钟数重置为0
。 - 时间格式转换:将小时、分钟、秒分别转换为字符串,通过字符串拼接形成“时:分:秒”的格式(例如“1:02:03”)
- 更新面板标题:将拼接后的时间字符串
w
设置为多面板标题,实现实时显示。测试后确认时间正常累积和进位。
5.3.2 显示玩家信息
- 使用“转换玩家ID为玩家”的方式,循环读取4个玩家,设为局部变量p
- 如果p在玩家组pp中
- 根据其单位类型,设置其对应的英雄名和英雄头像(第1列)
- 使用读取自定义值的方式,获取玩家的英雄,然后获取并展示其攻击力(第2列)
- 如果玩家不在线(不在玩家组pp中),英雄名和攻击力文本都设为“用户离线”(灰色),图像设为离线图像
- 设置玩家第3列的项目文本为其杀敌数
六、暴击
6.1 设置初始暴击率和暴击倍率
在英雄选择触发🀄️,设置每个英雄的初始暴击率和暴击倍率分别为20%和200%
6.2 暴击事件与基地伤害事件
- 获取参数:使用任意单位伤害事件,获取伤害来源、受伤单位和伤害数值;
- 英雄伤害事件:如果伤害来源是四个英雄之一:
- 获取其暴击率和暴击倍率,并创建一个随机数
- 如果随机数小于等于暴击率,判定发生暴击。重算新伤害 = 原始伤害 × (暴击倍率 / 100),然后设置单位所受伤害 = 新伤害。最后调用漂浮文字函数(伤害目标位置、伤害值、是否暴击)显示暴击伤害效果;
- 如果随机数大于暴击率,判定未发生暴击,也调用漂浮文字函数显示伤害效果
- 基地伤害事件:如果受伤单位是基地,对所有玩家发送基地生命百分比信息
6.3 飘浮文字函数
- 伤害参数初始化:接收受伤单位的坐标
xy
、伤害值r
和暴击标识sign
这四个参数; - 伤害内容与样式:根据暴击标识,决定显示文本
word
为“暴击XXX!”或纯数字,并设定不同的基础字体大小size
; - 字幕基础属性:设置新建的飘浮文字
w
的初始位置(受伤单位上方)、颜色(随机红色),内容(word
)和字体大小(size
),并设置字幕显示时间为3秒; - 字幕动态效果:
- 漂移效果:设置字幕运动轨迹为X轴速度:随机值(-0.6~0.6) × 0.02;Y轴速度:√(1 - X速度²) × 0.02(确保总速度为定值)
- 大小渐变:启动循环计时器,周期0.03秒,上限为10次。前5次执行(逐渐放大):字体大小 = 基础大小 + 当前次数;后5次执行(逐渐缩小):字体大小 = (基础大小 + 10) - 当前次数。
- 透明渐变:未完待补
这里的字幕大小、运动速度、渐变效果等等需要调试一会。
七、物品系统
7.1 物编设置
- 能量结晶:模板是魔法宝石,修改了模型、选择圈大小(原来是0,鼠标不好点到)
- 武器/护甲/戒指强化宝石:同样使用魔法宝石作为模板进行修改:
- 装备:先使用攻击之爪进行修改得到一个物品模板,然后添加不同的物品技能得到 不同等级的装备。
7.2 物品叠加与校验
整个物品系统解决物品叠加(比如能量结晶)、装备唯一性校验(剑/盾/戒指)和物品合成三大功能。
如图所示,当任意单位拾取物品后,触发器会按照以下路径执行:
- 路径① (叠加处理):如果拾取的是“能量结晶”等可叠加物品,则进入叠加逻辑。叠加完成后,再进入合成判断。
叠加逻辑:这里要加一个物品栏能量结晶≠刚捡起的能量结晶的判定(否则刚捡起的结晶马上进了物品栏,在后续判定中就被删除了)。如果已经有,就删除刚捡到的能量结晶,把物品栏的能量结晶使用次数+1。 - 路径② (唯一性处理 -> 丢弃):如果拾取的是武器、护甲或戒指,并且单位已装备同类物品,则新物品会被丢弃到地上,并设置标志
loc_sign1
为 TRUE。此路径最终会因物品被丢弃而跳过合成。 - 路径③ (唯一性处理 -> 装备) 与 路径④ (普通物品):如果拾取的是可装备且单位未拥有的物品,或本身就是普通物品,则会正常放入物品栏。随后进入合成判断。
- 物品合成:只有当物品最终被成功放入单位物品栏(即没有被丢弃,
loc_sign1
为 FALSE)时,才会运行BB005:物品合成列表
触发器,检查是否可以触发合成公式。
完整的触发为:
7.3 物品合成
-
物品合成机制:在任意单位拾取物品事件🀄️,过完了能量结晶叠加和装备唯一性检验之后,执行物品合成逻辑
-
检测合成列表:逻辑写的比较随意,应该可以优化
- 接收参数:获取单位(loc_u)和物品(loc_g);
- 判定合成剑:顺序检查物品类型是否匹配剑的合成条件,即拾取物品是否是剑(从LV.0到LV.2)、能量宝石或者武器强化宝石。如果匹配,调用
BB006
函数执行合成,参数包括基础物品、强化宝石、目标物品和能量结晶的个数 - 判定合成甲:逻辑同上
- 判定合成戒指:逻辑同上
-
执行合成函数
- 参数接收与调试:函数开始后,首先接收调用者(如BB005)传入的合成配方参数。如果游戏处于测试模式,会显示调试信息并提前结束。
- 资源检查(三个循环):
- 循环1:遍历单位6格物品栏,寻找能量结晶。找到则记录其物品实体
g0
和数量it
,设置loc_sign=TRUE
; - 循环2:遍历物品栏,寻找配方指定的主材料1(如LV.0的剑)。找到则记录其物品实体
g1
,设置loc_sign1=TRUE
; - 循环3:遍历物品栏,寻找配方指定的主材料2(如强化宝石)。找到则记录其物品实体
g2
,设置loc_sign2=TRUE
;
- 循环1:遍历单位6格物品栏,寻找能量结晶。找到则记录其物品实体
- 合成条件判定:检查三个
loc_sign
类变量是否均为真(表示材料齐全),并且能量结晶的数量(loc_it
)大于等于配方要求(loc_i
)。 - 执行合成与消耗:条件满足后:
- 删除主材料1(
loc_g1
)和主材料2(loc_g2
) - 如果能量结晶的数量刚好够
loc_it=loc_i
),直接从物品栏删除能量结晶;否则减少能量结晶的堆叠数(减少loc_g0
的使用次数)。 - 创建目标物品(
loc_uta
)并给予单位loc_u
。
- 删除主材料1(
- 反馈与结束:获取单位坐标,拼接成功信息,调用字幕系统(BB007)显示“XXX合成成功!”。流程结束。
八、技能(24)
8.1 光环技能
8.1.1 物编设置
- 以生命药水为模板,制作四个光环技能学习物品:金币消耗100,最大库存1,购买时间间隔120秒。物品主动使用、使用后消失,可丢弃、抵押、市场出售。不同物品只是名字、购买说明、模型和图标不一样。
- 制作四个光环技能:
- 荆棘光环:反弹近战伤害500%(受到相当于500%自身攻击力的伤害。)
- 命令光环:增加周围单位50%攻击力
- 耐久光环:增加周围友军50%移动速度和攻击速度
- 专注光环:+10点护甲
8.1.2 触发实现
- 触发入口:以任意单位使用物品作为触发事件,如果使用的是光环学习物品,则触发光环学习函数
- 光环学习:检查单位是否已拥有其他光环(布尔表达式->逆天-自定义值-是否拥有)
-
清除旧光环:若已有光环,删除旧的光环技能(单位-删除技能->逆天-自定义值-读取),清除自定义值存储的光环技能(逆天-自定义值-清除->),
-
添加新光环:添加新光环(通过自定义值存储新光环技能,并为单位添加该技能)
-
光环位置偏移:光环范围由SetAuraRadius函数控制,检查各光环半径参数是否统一。部分单位(如大型英雄)模型过大,导致光环效果被遮挡,通过SetUnitScale缩小模型比例(或调整光环渲染层级SetAuraRenderLayer),确保效果可见。
8.2 天赋技能
为四个英雄设计了不同的天赋技能,热键都设置为Q,按钮位置为(0,2),技能等级为1(偷懒设置),种族为暗夜精灵(方便查找);其它属性按需设置:
- 火枪手:灼热之剑(基于暗夜精灵族的灼热之剑技能),增加50点灼烧伤害。
- 步兵:雷霆一击(基于人族的雷霆一击)
- 牛头人:震荡波(兽族技能)
- 游侠:野兽幽魂,召唤两只幽灵狼
九、商店系统
9.1 抽奖互动
9.1.1 物编设置
-
创建抽奖商店:以雇佣兵营地建筑为模板,制作抽奖商店,命名为Santa,模型是一个圣诞老人。他出售单位是“抽奖互动”
-
创建抽奖单位:还是使用单位模板,创建一个抽奖单位,命名为“抽奖互动”。
9.1.2 触发实现
整体逻辑如下:
- AB06:事件入口:当任意单位被出售时,如果出售单位是“互动抽奖”,引用 “BB009-抽奖选项“ 函数;
- “BB009-抽奖选项“:对购买者显示抽奖对话框;
- AA02-初始参数设定”:地图加载时创建抽奖对话框,以及单抽和十连抽两个按钮。当用户点击这两个按钮时,分别执行一次单抽和十次单抽动作(引用BB00a-抽奖执行);
- BB00a-抽奖执行:执行具体的单抽动作
以下是具体的触发:
-
基础设定:地图初始化(触发器AA02)
- 创建抽奖对话框系统:
- 新建对话框对象
loc_d
(即抽奖主界面)。 - 向
loc_d
添加两个按钮:loc_da1
(抽奖一次按钮):标题为“抽奖一次(需10杀敌数…)”,快捷键绑定Q
。loc_da2
(抽奖十次按钮):标题为“抽奖十次(需90杀敌数…)”,快捷键绑定W
。
- 将对话框
loc_d
存储到全局字符串GAME的抽奖对话框
,供其他触发器调用。
- 新建对话框对象
- 注册触发逻辑:
- 获取参数:记录点击事件的玩家
p
(按钮点击者)和对话框d
。 - 杀敌数检查: 读取玩家
P
的自定义值“杀敌数”:- 若点击“抽奖一次”(对话框按钮
loc_da1
)且杀敌数<10
,发送提示:“你的杀敌数不足,无法抽奖!”,并关闭对话框。 - 若点击“抽奖十次”(对话框按钮
loc_da2
)且杀敌数<90
,发送提示:“无法十连,杀敌数不足!”,并关闭对话框。
- 若点击“抽奖一次”(对话框按钮
- 执行抽奖:
- 杀敌数足够时,扣除对应杀敌数(一次扣10,十次扣90);
- 运行抽奖执行触发器
BB00a
; - 隐藏对话框
D
,完成交互。
- 获取参数:记录点击事件的玩家
- 创建抽奖对话框系统:
对话框需全局唯一(存储为 GAME的抽奖对话框),避免重复创建;按钮点击后需及时隐藏对话框。
-
抽奖触发入口:出售“抽奖互动”单位(触发器AB06)
- 收集参数:获取“购买者(
loc_u
)”和“被贩卖单位(loc_uf
)”。 - 删除被贩卖单位后,检查其类型。若被贩卖单位类型为 “抽奖互动”,则触发
BB009:抽奖选项
触发器。
- 收集参数:获取“购买者(
-
“BB009-抽奖选项“:对购买者显示抽奖对话框
-
实际抽奖逻辑(触发器BB00a)
- 接受参数:获取调用时传递的玩家
loc_p
。 - 抽奖物品生成:
- 从全局字符串
GAME的抽奖奖池
中获取物品池列表loc_gtp
。 - 从
loc_gtp
中随机选择一个物品,放置到玩家英雄当前位置((loc_u)所在X/Y坐标
)。
- 从全局字符串
- 结果显示:
- 生成提示文本:
[物品名称] |cffccffff 在月光中显现!|r
。 - 在玩家屏幕中央(位移
[0.00,0.00]
)显示该文本10秒。
- 生成提示文本:
- 接受参数:获取调用时传递的玩家
9.2 装备商店
- 武器强化:设置最大库存1,购买间隔120秒,60秒后开放购买。
- 能量结晶:售价30金币;强化宝石价格提升至300金币(原过低)。
- 装备可出售,黄金消耗统一为100金币;能量结晶、强化宝石不可出售。
十:测试
10.1 单位与敌人平衡调整
-
己方单位属性
- 英雄类(步兵、火枪手、牛头人、游侠):
- 步兵:力量13→调整成长(每级+4/3等);敏捷12,剩余属性分配。
- 火枪手:力量8,敏捷与智力成长调整(每级+2/4等)。
- 牛头人:每级力量+5,敏捷+3,智力+1;最终敏捷21,智力剩余9。
- 游侠:力量14,敏捷10,调整成长至合理范围。
- 英雄最大等级:从原设定提高至50级。
- 英雄类(步兵、火枪手、牛头人、游侠):
-
敌方单位与波次
- 掉落金币调整:骷髅弓箭手(1-2)、骷髅战士(0-1)、骷髅法师(2),避免前期资源溢出。
- 敌人强度:
- 血量:每波递增(最终约600血),基础血量从44提升至50,后期每波+25。
- 攻击力:最终目标单目标秒伤约100,调整基础攻击力(如50÷22≈2.5,叠加后接近目标)。
- Bug修复:复制单位时属性丢失问题(检查代码复制逻辑,确保参数同步)。