当前位置: 首页 > news >正文

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】从零开始的防守图制作教程》

一、成品展示

在这里插入图片描述

这是一张防守图,中间是圣诞树(防守基地)以及商店、出生点。整张图一共有四条刷兵路线。该防守图主要具备以下功能:

  1. 英雄选择:做一个相对简单的系统。玩家进入游戏后,每人获得一个小精灵。小精灵有四个技能,点击对应技能即可变成对应英雄。这四个英雄分别是:

    • 游侠:敏捷英雄,天赋为召唤幽灵狼
    • 火枪手:敏捷英雄,天赋为火焰箭
    • 牛头人:力量英雄,天赋为冲击波
    • 步兵:力量英雄,天赋为雷霆一击
      在这里插入图片描述
  2. 多面板信息显示:显示游戏累计时间、距离下一波进攻的剩余秒数、每个玩家选择的英雄(包括英雄头像)当前攻击力、杀敌数、当前游戏难度等信息。可自动检测到离线玩家,将其显示为“用户已离线”。
    在这里插入图片描述

  3. 难度选择:游戏开始5秒后,所有玩家弹出难度选择窗口进行投票。 游戏开始约40秒时,根据投票票数最高的难度确定当前游戏难度,并弹出提示。
    在这里插入图片描述

  4. 商店系统:商店有出售三种基础装备(剑/盾/戒指),每种装备都可以用对应的强化宝石+能量结晶强化(强化分别需要5/10/20个),最高可强化至lv3

  5. 装备系统

    • 自动合成:类似Dota的效果,拾取合成所需材料(如剑、戒指、能量结晶等)时,系统自动检测并合成高级装备。本图中现有三种装备,每件可升级三次,一共九种合成。
    • 装备限制:玩家只能携带一种基础装备,比如剑只能拿一把,再买会掉落地面无法拾取到物品栏。
  6. 英雄技能:每个英雄初始自带一个天赋,还有被动光环和被动技能(怪物掉落或抽奖获得)可以学习,但都只能学习一个。如果已有该技能,点击则替换原有技能。

  7. 伤害系统:做了一个非常简陋的伤害系统的一小部分——暴击。玩家自带20%的暴击属性(2倍伤害),触发暴击时会显示字幕特效。暴击属性可扩展为其他虚拟属性(如闪避等)。
    在这里插入图片描述

  8. 刷兵与掉落

    • 刷新的怪物将随机从骷髅法师,骷髅弓箭手和骷髅战士中获取模型,随后按照当前波数更改其生命值。
    • 每60秒进入下一波,每波刷新每个方向10个总计40个敌人。每波敌人属性还会根据当前游戏难度动态增强。
    • 因为兵刷出来不会自己动(会直接走过去),需要用单位组下命令,制作简易AI
    • 敌人死亡会掉落金钱,并概率掉落装备、能量结晶(可叠加)、以及技能,并设置有掉落字幕。
  9. 圣诞老人互动功能

    • 暂停刷兵:暂停期间敌人停止生成,且已暂停时无法重复操作。
    • 抽奖系统:玩家击杀敌人后,会获得击杀数,击杀数可以在圣诞老人处抽奖,可以得到能量结晶和技能书。玩家可以通过对话框选择,单抽还是十连(十连将减少10%消耗)。技能书有四种——荆棘光环、专注光环、耐久光环、命令光环,重复学习将会覆盖旧的光环。
      在这里插入图片描述
  10. 英雄复活:玩家死亡后会在10秒后复活

  11. 胜利机制:

    • 如果圣诞树被摧毁,则游戏结束。基地被攻击时所有玩家都将得到提示,并显示剩余生命值百分比。
    • 如果波数达到20,同时玩家清除掉了所有现有敌人,将获得胜利

二、地图初始化(第12课)

首先规划一下简单的触发分类:

  1. AA - 地图初始化: 游戏开始时统计玩家数量、发送消息等。
  2. AB - 事件入口: 处理各种游戏事件。
  3. BA - 物品相关: 物品掉落、合成、叠加。
  4. BB - 技能机制相关: 技能学习、替换等。

  接着创建一个常用语句库的触发,像if语句、设置变量、设置自定义键值、创建收纳盒、显示debug信息这些经常用到的语句可以先写进去,后面用的时候直接复制,就不用挨个找语句了。

在这里插入图片描述

地图初始化的时候,玩家还没有进入游戏,所以要做的只有两件事——设置玩家组,统计玩家信息;以及新建物品掉落池和刷怪的单位组。

2.1 设置地图初始参数

  地图初始化的时候,玩家还没有进入游戏,所以要做的只有设置一些初始参数,比如物品掉落池、抽奖池、玩家组和单位组(刷怪用)。

在这里插入图片描述
  首先是设置怪物掉落的物品奖池。为了能在游戏的任何触发器中都能调用这个预设的物品奖池,我需要将它存储在一个全局的、中心化的存储对象里,这里选的是字符串Game的自定义键值对里,然后往里面添加掉落物品。接着同样的方式创建抽奖奖池和单位组。这样,Game的三个键“物品奖池”、“抽奖奖池”、“AI组”就都设定了。

在这里插入图片描述

2.2 统计玩家信息

游戏开始之后,需要统计玩家信息,这包括:

  1. 新建玩家组 pp(Player Group),存储到字符串 Game玩家组 键下。
  2. 遍历玩家 1 到 4:逆天的循环可以套多层
    • 获取玩家 P。这里使用的是转换玩家ID为玩家:
      在这里插入图片描述
    • 判断 P 是用户(玩家控制者)且正在游戏中(玩家游戏状态);
    • 将符合条件的玩家加入 PP 组。
  3. 获取 pp 组中的玩家数量(玩家-玩家组中的玩家数量)。
  4. Debug:对玩家组🀄️所有玩家做动作——发送当前游戏的玩家数量(对玩家显示文本信息[指定时间])。
  5. 遍历每个玩家,为其生成小精灵(待做)

在这里插入图片描述
在这里插入图片描述

  • 上图🀄️的point是一会要创建英雄的点位,具体对应的位置是在圣诞树跟前。
  • 一般地图加载慢是因为初始设置的变量比较多,执行的脚本比较多。

2.3 触发编写注意事项

  1. 提前将常用的语句进行存储,便于复制
  2. 多写一些debug语句,便于判断触发执行的流程到哪了
  3. 创建的临时特效、指定次数的计算器等内容用完后要及时清除,否则会持续占用内容。比如非永久循环的计时器,创建之后马上写一个清除语句,免得忘了。

三、英雄与难度选择(第13-14课)

3.1 英雄选项

3.1.1 物编设置

接下来,我需要创建这个地图所需的基本单位。目前我们刚完成初始化触发,所以要先从物编(物体编辑器)开始。

  1. 创建单位模板(选择英雄):首先,我需要一个用于英雄选择的小精灵,将其命名为“选择英雄”

    • 删除所有技能、使用的科技和可建造建筑,清除单位类别(原本类别是工人,没有采集资源就会不停的提示单位正在空闲🀄️);
    • 将黄金消耗、木材消耗、人口占用等全部设为0。生命值设为10,基础速度设为1(免得乱跑),视野范围设为500;
    • 将其重命名为“单位模板”,并归类到“人族”以便管理。
      在这里插入图片描述
  2. 创建英雄通用模板:基于“圣骑士”复制一个新单位作为英雄基础模板。删除所有技能、称谓、提示信息。初始三围各10点,每级属性提升各3点,计划英雄满级为5级。
    在这里插入图片描述

  3. 创建四个英雄:复制四次英雄模板,创建四个英雄——火枪手(灼热之箭)、牛头人(震荡波)、游侠(野兽幽魂)、步兵(雷霆一击)。注意,护甲类型​影响伤害计算,装甲类型只影响被近战攻击时的音效。为火枪手添加投射物模型,否则看不到射出的子弹轨迹。

  4. 创建技能模板(用于英雄选择):基于“通魔”技能创建模板(没有任何主动技能和被动技能)。设置等级1;动作持续时间、冷却时间、魔法消耗均设为0;勾选“单独释放”和“图标可见”(图标可见表示单位学习此技能后,在技能栏可以看到技能图标);删除目标点和目标特效,最后设置为非英雄技能(这样小精灵单位才可以学习)
    在这里插入图片描述
    在这里插入图片描述

  5. 创建四个英雄选择技能:使用技能模板创建四个技能:“选择步兵”、“选择火枪手”、“选择AC”、“选择牛头人”,并为每个技能设置不同的图标、说明、热键、技能位置和基础命令ID。
    在这里插入图片描述
      同一个单位身上携带的不同技能,其“基础命令ID”不能相同​​,否则会冲突。但不同单位的技能ID可以相同(比如大家都会火球术)。另外还需要勾选“单独释放”选项,这样,即使框选多个单位,也只有当前选中的单位会响应技能。只要遵循 “同单位技能ID不同”+“勾选单独释放” 这两个原则,就能完全避免命令冲突。

  这样物编部分就做完了。虽然物编界面看起来比触发器简单直观,但实际上物编里隐藏的“坑”和未知问题远比触发器要多物编最好只用来定义单位的“外观层”属性(如模型、基础数值等),而所有核心的“效果层”游戏逻辑(如技能机制、特殊系统)都应该尽量使用触发器来实现。​当触发器实现的效果出现问题时,你可以将触发器逻辑截图向他人求助,别人能清晰地看出问题所在。但如果你用物编来实现复杂效果,一旦出现BUG,由于其内部逻辑不直观,排查将极为困难。

3.1.2 触发设置

  1. 创建小精灵: 在之前创建的“游戏开始”触发中,我们需要在给每位玩家创建“选择英雄”(小精灵)后,将镜头立即移动到该单位的位置。

    • 为当前玩家 pa 在预设点 point 创建单位“选择英雄”,并将该单位赋值给变量 u
    • 获取单位 u 的位置,并赋值给一个新的点变量 pointt(作为临时缓存点)。
    • 将玩家 pa 的镜头立即平移至 Pointt 点。
    • 使用选择单位-指定玩家语句,让玩家自动选择到刚刚创建的英雄身上。
    • 使用“清除点动作删除临时点 pointt和预设点 point
      在这里插入图片描述
  2. 英雄选择触发

    • 事件:必须设置为 “单位 - 任意单位 发动技能效果”, 只有这个事件才能准确获取到技能释放的目标、地点等信息。不要使用“开始施放技能”或“停止施放技能”等事件。
    • 动作:收集触发单位(小精灵)、触发目标和触发技能这三个参数。如果释放的技能 S 是否是我们定义的四个英雄选择技能之一,就调用另一个英雄创建函数来生成对应的英雄(逆天-触发器运行),同时传递过去触发单位和触发技能这两个参数(逆天-变量设置)。
      在这里插入图片描述
  3. 英雄创建触发:根据上一个事件触发传过来的两个参数,进行英雄的创建。将事件捕获和逻辑执行分开,让代码结构更清晰。

    • 读取传入参数,使用四个“If-Then”条件判断要创建的英雄单位是哪一个,将其存入局部变量ut(Unit_Type)🀄️;
    • 在触发单位的位置point为玩家p生成对应的英雄ut,并强制玩家选择到刚刚创建的英雄单位
    • 设置英雄初始暴击率和暴击倍率
    • 创建英雄生成特效(其它-复生之焰),持续5秒
    • 使用逆天-自定义值-设置,将ut存储为玩家p的英雄(全局变量),最后删除局部变量upoint

在这里插入图片描述

3.2 难度选择

为实现游戏难度分级(简单、测试、中等、困难),设计了一个交互式难度选择系统,核心流程为:

在这里插入图片描述

30秒到期
地图初始化
创建对话框/注册点击事件
游戏开始
等待5秒
向所有玩家显示对话框
启动30秒选择倒计时
玩家点击难度按钮
保存该玩家选择并关闭其对话框
遍历所有玩家
玩家已选择?
为其随机分配难度
跳过
等待5秒
统计所有玩家选择的票数
确定最高票难度
向全体宣布最终游戏难度
  1. 创建难度选择界面,并注册响应事件:在地图初始化时,创建一个对话框(loc_d)作为选择界面的主体,并为对话框创建四个难度选项按钮,设置其标题和快捷键。为每一个难度按钮创建一个独立的触发器,定义被点击时玩家选择的难度是多少。
    在这里插入图片描述

  2. 难度判定
    在这里插入图片描述

    • 游戏开始5秒后,再为所有玩家显示难度选择对话框;
    • 启动一个30秒的难度选择倒计时,当30秒的选择计时器到期后,会检查每位玩家是否已经做出选择。 如果 玩家 loc_p 的难度选择 等于 0(未选择),为该玩家随机分配一个1-4的难度值。然后关闭该玩家的对话框;
    • 启动一个35秒的计时器,到期后统计每个玩家选择的难度,最高票的选择为最终的难度选择,并存储此难度信息。

四、刷兵与死亡系统

整个系统由三个核心触发器协同工作:

  • ​​AA03: 刷兵初始参数设定​​ (初始化)
  • ​​BB00b: 每次刷兵倒计时​​ (核心调度器)
  • ​​BB002: 单次刷兵执行​​ (刷兵执行者)

其整体工作流程可以概括为以下的序列图:

AA03(初始化)BB00b(调度器)BB002(执行器)游戏系统游戏开始0.00秒1. 读取AI单位组2. 创建单位池3. 设置AI进攻循环4. 启动第一波:传入(单位组,单位池,波数=1)1. 时间自减(若非暂停)2. 更新多面板倒计时显示3. 执行刷兵传入(单位组,单位池,当前波数)在4个角落刷兵每波25个单位,每0.5秒一个显示“第X波进攻结束”启动胜利判定循环检查AI单位组是否全灭设置所有玩家胜利alt[AI单位组全灭]loop[每1秒判断一次]启动下一波传入(单位组,单位池,波数+1)alt[是否为最终波(20波)][非最终波]alt[倒计时结束]loop[每1秒循环一次 (由B控制)]AA03(初始化)BB00b(调度器)BB002(执行器)游戏系统

4.1 刷兵初始化

  1. 获取AI单位组: 从游戏缓存中读取一个预设的、名为“GAME的AI组”的单位组,这个单位组用于管理所有被刷出的敌人;
  2. 创建单位池: 建立一个随机单位池(骷髅战士3,骷髅弓箭手1,骷髅法师*1);
  3. 设置AI主动进攻: 启动一个每3秒循环的计时器,命令AI单位组中的所有单位向地图中心(0,0)发起攻击移动。如果单位已经在攻击状态,则不做改变,这确保了敌人会持续进攻。
  4. 启动刷兵调度器BB00b: 运行BB00b: 每次刷兵倒计时(携带参数AI单位组loc_Alup、单位池loc_utp,初始波数loc_iw = 1),启动了整个波次循环。
    在这里插入图片描述

注意,这里直接对单位组🀄️所有单位发布攻击移动命令会出bug,因为此命令最多只能对单位组🀄️12个单位生效,所以只能遍历单位组🀄️的所有单位来发布命令。另外单位组的单位死亡,没有将其移出单位组,后续会处理。

在这里插入图片描述

4.2 波次调度与倒计时

运行1个1秒的循环倒计时:

  1. 倒计时递减

    • 暂停判定: 检查游戏全局变量“GAME的暂停刷兵”是否为TRUE。这是一个开关,可以临时暂停刷兵。
    • 倒计时递减: 将全局变量“GAME的time”的值减1。这个变量代表下一波进攻到来的剩余秒数。
  2. 更新刷兵倒计时

    • 将剩余时间time和当前波数loc_iw拼接成一句富文本字符串(如“12秒后第3波进攻开始”)。
    • 将这句文本更新到游戏的多面板(一个自定义的UI界面)上,让玩家清晰看到倒计时。
  3. 刷兵判定:如果“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 单次刷兵函数

  1. 读取难度: 从游戏缓存中读取玩家投票决定的最终难度值loc_in。这个值将直接影响怪物强度。
  2. 在四个角落开启刷兵: 系统会在地图的左下、左上、右上、右下四个角落并行地执行相同的刷兵逻辑。
  3. 单角落刷兵细节 (以左下角为例,图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课)

设置任意单位死亡事件,将凶手单位和死亡单位分别存储为局部变量uku,然后根据死亡单位是英雄、怪物或者基地,来分别进行处理:

  • 怪物死亡:将其从单位组🀄️移除,将玩家杀敌数+1,最后启用掉落函数,设置怪物的掉落情况;
  • 基地死亡:见下一节
  • 玩家死亡
    • 公告玩家被凶手XX杀死,将在10秒后复活( 持续10秒)
    • 启动复活计时器,创建并显示一个10秒的计时器窗口,倒计时归零后复活英雄。
    • 复活后将其玩家镜头移动到复活的英雄身上,并强制玩家选中次英雄

4.4.1 怪物死亡与英雄死亡

在这里插入图片描述

4.4.2 怪物死亡掉落事件(23)

怪物掉落函数:
在这里插入图片描述

  1. 接受参数——死亡单位u
  2. 设置怪物掉落概率为10%,掉落奖池为预设的掉落池
  3. 如果掉落,随机获取奖池🀄️的一个物品,创建在死亡怪物的位置,并在此处弹出物品掉落字幕

掉落字幕函数:

在这里插入图片描述

  1. 接收参数:掉落坐标、物品信息、字幕大小;
  2. 设置字幕属性:新建字幕对象并设置初始属性——掉落坐标上方50,大小为size,内容为物品信息,颜色为白色, ​​3秒后​​ 自动删除这个漂浮文字;
  3. 动态效果——漂移
    • 随机生成一个-0.6到0.6之间的X方向的偏移量 loc_xt,这决定了字幕是向左还是向右漂移;
    • 根据勾股定理,计算出一个对应的Y方向偏移量 loc_yt,确保漂移方向向量 (loc_xt, loc_yt)的长度为1(即单位向量)。这使得字幕可以向任意方向(360度)等概率漂移。
    • 将这两个偏移量乘以0.02,作为字幕在X和Y轴上的移动​​速率​​。这样,字幕就会以一个平缓的速度沿着随机方向飘走。
  4. 动态效果——大小渐变
    • 启动一个​​周期为0.03秒的循环计时器,共执行10次;
    • 前5次字体​​逐渐变大​​:字体大小 = 基础大小 + 当前次数;​​后5次字体逐渐缩小:字体大小 = (基础大小 + 10) - 当前次数。

在这里插入图片描述

4.4.3 基地死亡(第17课)

  1. 物编设置:复制兽族的巫毒商店,将其模型改为圣诞树,模型缩放设为6倍。基础护甲为10点,防御升级奖励为0。设置生命上限为10000,生命回复为10点,视野为1000,放置要求改为“可通行地面”、非荒芜之地。
    在这里插入图片描述
  2. 触发设置:通知所有玩家游戏失败,并启动一个10秒的计时器,10秒后为所有玩家结算游戏失败结局
    在这里插入图片描述

五、多面板

5.1 创建多面板,绑定英雄自定义键值(名称和图标)

在地图初始化🀄️,将每种英雄的名称(name)和图标(头像)绑定到其身上,方便在多面板设置中调用:

在这里插入图片描述

5.2 设置多面板内容

在这里插入图片描述

  1. 获取玩家组
  2. 创建一个6行3列的面板,使用“设置项目文本” ,修改第一行标题为守护者、攻击强度(攻击力)和杀敌数;
  3. 修改2-5行后两列的图标分别为杀敌数图标和攻击力图标
  4. 设置每一列🀄️每一行的宽度为屏幕的5%
  5. 设置多面板状态为显示(默认取消)

在这里插入图片描述

5.3 更新多面板

5.3.1 显示全局游戏时间

创建1个计时器,每隔1秒更新一次多面板信息:

  • 时间累积:使用整数is记录秒数,每秒自增1;当is达到60时,分钟数im1,秒数重置为0;同理,分钟数达到60时,小时数ih1,分钟数重置为0
  • ​​时间格式转换​​:将小时、分钟、秒分别转换为字符串,通过字符串拼接形成“时:分:秒”的格式(例如“1:02:03”)
  • ​​更新面板标题​​:将拼接后的时间字符串w设置为多面板标题,实现实时显示。测试后确认时间正常累积和进位。
    在这里插入图片描述

5.3.2 显示玩家信息

在这里插入图片描述

  • 使用“转换玩家ID为玩家”的方式,循环读取4个玩家,设为局部变量p
  • 如果p在玩家组pp中
    • 根据其单位类型,设置其对应的英雄名和英雄头像(第1列)
    • 使用读取自定义值的方式,获取玩家的英雄,然后获取并展示其攻击力(第2列)
  • 如果玩家不在线(不在玩家组pp中),英雄名和攻击力文本都设为“用户离线”(灰色),图像设为离线图像
  • 设置玩家第3列的项目文本为其杀敌数

六、暴击

6.1 设置初始暴击率和暴击倍率

在英雄选择触发🀄️,设置每个英雄的初始暴击率和暴击倍率分别为20%和200%
在这里插入图片描述

6.2 暴击事件与基地伤害事件

在这里插入图片描述

  1. 获取参数:使用任意单位伤害事件,获取伤害来源、受伤单位和伤害数值;
  2. 英雄伤害事件:如果伤害来源是四个英雄之一:
    • 获取其暴击率和暴击倍率,并创建一个随机数
    • 如果随机数小于等于暴击率,判定发生暴击。重算新伤害 = 原始伤害 × (暴击倍率 / 100),然后设置单位所受伤害 = 新伤害。最后调用漂浮文字函数(伤害目标位置、伤害值、是否暴击)显示暴击伤害效果;
    • 如果随机数大于暴击率,判定未发生暴击,也调用漂浮文字函数显示伤害效果
  3. 基地伤害事件:如果受伤单位是基地,对所有玩家发送基地生命百分比信息
    在这里插入图片描述

6.3 飘浮文字函数

在这里插入图片描述

  1. ​​伤害参数初始化​​:接收受伤单位的坐标xy、伤害值r和暴击标识sign这四个参数;
  2. ​​伤害内容与样式:根据暴击标识,决定显示文本word为“暴击XXX!”或纯数字,并设定不同的基础字体大小size
  3. 字幕基础属性​​:设置新建的飘浮文字w的初始位置(受伤单位上方)、颜色(随机红色),内容(word)和字体大小(size),并设置字幕显示时间为3秒;
  4. 字幕动态效果
    • 漂移效果:设置字幕​运动轨迹为X轴速度:随机值(-0.6~0.6) × 0.02;Y轴速度:√(1 - X速度²) × 0.02(确保总速度为定值)
    • 大小渐变:启动循环计时器,周期0.03秒,上限为10次。​​前5次执行​​(逐渐放大):字体大小 = 基础大小 + 当前次数;​​后5次执行​​(逐渐缩小):字体大小 = (基础大小 + 10) - 当前次数。
    • 透明渐变:未完待补

这里的字幕大小、运动速度、渐变效果等等需要调试一会。

七、物品系统

7.1 物编设置

  1. 能量结晶:模板是魔法宝石,修改了模型、选择圈大小(原来是0,鼠标不好点到)
    在这里插入图片描述
  2. 武器/护甲/戒指强化宝石:同样使用魔法宝石作为模板进行修改:
    在这里插入图片描述
  3. 装备:先使用攻击之爪进行修改得到一个物品模板,然后添加不同的物品技能得到 不同等级的装备。
    在这里插入图片描述

7.2 物品叠加与校验

整个物品系统解决物品叠加​(比如能量结晶)、装备唯一性校验(剑/盾/戒指)和物品合成三大功能。
在这里插入图片描述
如图所示,当任意单位拾取物品后,触发器会按照以下路径执行:

  1. 路径① (叠加处理):如果拾取的是“能量结晶”等可叠加物品,则进入叠加逻辑。叠加完成后,再进入合成判断。
    叠加逻辑:这里要加一个物品栏能量结晶≠刚捡起的能量结晶的判定(否则刚捡起的结晶马上进了物品栏,在后续判定中就被删除了)。如果已经有,就删除刚捡到的能量结晶,把物品栏的能量结晶使用次数+1。
  2. 路径② (唯一性处理 -> 丢弃):如果拾取的是武器、护甲或戒指,并且单位已装备同类物品,则新物品会被丢弃到地上,并设置标志 loc_sign1 为 TRUE。此路径最终会因物品被丢弃而跳过合成。
  3. 路径③ (唯一性处理 -> 装备)路径④ (普通物品):如果拾取的是可装备且单位未拥有的物品,或本身就是普通物品,则会正常放入物品栏。随后进入合成判断。
  4. 物品合成:只有当物品最终被成功放入单位物品栏(即没有被丢弃,loc_sign1 为 FALSE)时,才会运行 BB005:物品合成列表 触发器,检查是否可以触发合成公式。

完整的触发为:
在这里插入图片描述

7.3 物品合成

  1. 物品合成机制:在任意单位拾取物品事件🀄️,过完了能量结晶叠加和装备唯一性检验之后,执行物品合成逻辑
    在这里插入图片描述

  2. 检测合成列表:逻辑写的比较随意,应该可以优化

    • 接收参数:获取单位(loc_u)和物品(loc_g);
    • 判定合成剑​​:顺序检查物品类型是否匹配剑的合成条件,即拾取物品是否是剑(从LV.0到LV.2)、能量宝石或者武器强化宝石。如果匹配,调用BB006函数执行合成,参数包括基础物品、强化宝石、目标物品和能量结晶的个数
    • 判定合成甲:逻辑同上
    • 判定合成戒指:逻辑同上
      在这里插入图片描述
      在这里插入图片描述
  3. 执行合成函数

    1. 参数接收与调试:函数开始后,首先接收调用者(如BB005)传入的合成配方参数。如果游戏处于测试模式,会显示调试信息并提前结束。
    2. 资源检查(三个循环)
      • 循环1:遍历单位6格物品栏,寻找能量结晶。找到则记录其物品实体g0和数量it,设置loc_sign=TRUE
      • 循环2:遍历物品栏,寻找配方指定的主材料1(如LV.0的剑)。找到则记录其物品实体g1,设置loc_sign1=TRUE
      • 循环3:遍历物品栏,寻找配方指定的主材料2(如强化宝石)。找到则记录其物品实体g2,设置loc_sign2=TRUE
    3. 合成条件判定:检查三个loc_sign类变量是否均为真(表示材料齐全),并且能量结晶的数量(loc_it)大于等于配方要求(loc_i)。
    4. 执行合成与消耗:条件满足后:
      • 删除主材料1(loc_g1)和主材料2(loc_g2
      • 如果能量结晶的数量刚好够loc_it=loc_i),直接从物品栏删除能量结晶;否则减少能量结晶的堆叠数(减少loc_g0的使用次数)。
      • 创建目标物品(loc_uta)并给予单位loc_u
    5. 反馈与结束:获取单位坐标,拼接成功信息,调用字幕系统(BB007)显示“XXX合成成功!”。流程结束。
      在这里插入图片描述

八、技能(24)

8.1 光环技能

8.1.1 物编设置

  1. 以生命药水为模板,制作四个光环技能学习物品:金币消耗100,最大库存1,购买时间间隔120秒。物品主动使用、使用后消失,可丢弃、抵押、市场出售。不同物品只是名字、购买说明、模型和图标不一样。
    在这里插入图片描述
  2. 制作四个光环技能
    • ​​荆棘光环​​:反弹近战伤害500%(受到相当于500%自身攻击力的伤害。)
    • ​​命令光环​​:增加周围单位50%攻击力
    • ​​耐久光环​​:增加周围友军50%移动速度和攻击速度
    • ​​专注光环​​:+10点护甲

8.1.2 触发实现

  1. 触发入口:以任意单位使用物品作为触发事件,如果使用的是光环学习物品,则触发光环学习函数
    在这里插入图片描述
  2. 光环学习:检查单位是否已拥有其他光环(布尔表达式->逆天-自定义值-是否拥有)
    • 清除旧光环:若已有光环,删除旧的光环技能(单位-删除技能->逆天-自定义值-读取),清除自定义值存储的光环技能(逆天-自定义值-清除->),
      在这里插入图片描述

    • 添加新光环:添加新光环(通过自定义值存储新光环技能,并为单位添加该技能)
      在这里插入图片描述
      在这里插入图片描述

  光环位置偏移​:光环范围由SetAuraRadius函数控制,检查各光环半径参数是否统一。部分单位(如大型英雄)模型过大,导致光环效果被遮挡,通过SetUnitScale缩小模型比例(或调整光环渲染层级SetAuraRenderLayer),确保效果可见。

8.2 天赋技能

  为四个英雄设计了不同的天赋技能,热键都设置为Q,按钮位置为(0,2),技能等级为1(偷懒设置),种族为暗夜精灵(方便查找);其它属性按需设置:

  1. 火枪手:灼热之剑(基于暗夜精灵族的灼热之剑技能),增加50点灼烧伤害。
  2. 步兵:雷霆一击(基于人族的雷霆一击)
  3. 牛头人:震荡波(兽族技能)
  4. 游侠:野兽幽魂,召唤两只幽灵狼

九、商店系统

9.1 抽奖互动

9.1.1 物编设置

  1. 创建抽奖商店:以雇佣兵营地建筑为模板,制作抽奖商店,命名为Santa,模型是一个圣诞老人。他出售单位是“抽奖互动”
    在这里插入图片描述

  2. 创建抽奖单位:还是使用单位模板,创建一个抽奖单位,命名为“抽奖互动”。
    在这里插入图片描述

在这里插入图片描述

9.1.2 触发实现

整体逻辑如下:

  1. AB06:事件入口:当任意单位被出售时,如果出售单位是“互动抽奖”,引用 “BB009-抽奖选项“ 函数;
  2. “BB009-抽奖选项“:对购买者显示抽奖对话框;
  3. AA02-初始参数设定”:地图加载时创建抽奖对话框,以及单抽和十连抽两个按钮。当用户点击这两个按钮时,分别执行一次单抽和十次单抽动作(引用BB00a-抽奖执行);
  4. BB00a-抽奖执行:执行具体的单抽动作

以下是具体的触发:

  1. 基础设定:地图初始化(触发器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的抽奖对话框),避免重复创建;按钮点击后需及时隐藏对话框。

  1. 抽奖触发入口:出售“抽奖互动”单位(触发器AB06)
    在这里插入图片描述

    • 收集参数:获取“购买者(loc_u)”和“被贩卖单位(loc_uf)”。
    • 删除被贩卖单位后,检查其类型。若被贩卖单位类型为 “抽奖互动”,则触发 BB009:抽奖选项 触发器。
  2. “BB009-抽奖选项“:对购买者显示抽奖对话框

  3. 实际抽奖逻辑(触发器BB00a)
    在这里插入图片描述

    1. 接受参数:获取调用时传递的玩家 loc_p
    2. 抽奖物品生成
      • 从全局字符串 GAME的抽奖奖池 中获取物品池列表 loc_gtp
      • loc_gtp 中随机选择一个物品,放置到玩家英雄当前位置((loc_u)所在X/Y坐标)。
    3. 结果显示
      • 生成提示文本:[物品名称] |cffccffff 在月光中显现!|r
      • 在玩家屏幕中央(位移 [0.00,0.00])显示该文本10秒。

9.2 装备商店

在这里插入图片描述

  • 武器强化:设置最大库存1,购买间隔120秒,60秒后开放购买。
  • 能量结晶:售价30金币;强化宝石价格提升至300金币(原过低)。
  • 装备可出售,黄金消耗统一为100金币;能量结晶、强化宝石不可出售。

十:测试

10.1 单位与敌人平衡调整

  1. 己方单位属性

    • 英雄类(步兵、火枪手、牛头人、游侠):
      • 步兵:力量13→调整成长(每级+4/3等);敏捷12,剩余属性分配。
      • 火枪手:力量8,敏捷与智力成长调整(每级+2/4等)。
      • 牛头人:每级力量+5,敏捷+3,智力+1;最终敏捷21,智力剩余9。
      • 游侠:力量14,敏捷10,调整成长至合理范围。
    • 英雄最大等级:从原设定提高至50级。
  2. 敌方单位与波次

    • 掉落金币调整:骷髅弓箭手(1-2)、骷髅战士(0-1)、骷髅法师(2),避免前期资源溢出。
    • 敌人强度:
      • 血量:每波递增(最终约600血),基础血量从44提升至50,后期每波+25。
      • 攻击力:最终目标单目标秒伤约100,调整基础攻击力(如50÷22≈2.5,叠加后接近目标)。
    • Bug修复:复制单位时属性丢失问题(检查代码复制逻辑,确保参数同步)。
http://www.dtcms.com/a/474166.html

相关文章:

  • 专业的聊城做网站费用网站开发三剑客
  • 鸿蒙NEXT压缩与解压全攻略:从图片优化到文件处理
  • 网站建设 重庆品牌营销的定义
  • Ubuntu安装JDK与Maven和IntelliJ IDEA
  • 使用el-table实现行内编辑功能
  • 虹口高端网站建设中英文网站是咋做的
  • Linux 之 【基本指令 与 shell命令以及运行原理】
  • AI虚拟细胞(AIVCs)赋能生命科学:三大数据支柱与闭环学习破解传统实验困局
  • 茂名营销型网站制作公司做灯笼手工简单做法
  • 长沙网站排名优化二极管 东莞网站建设
  • 【Linux探索学习】第三篇Linux的基本指令(3)——开启Linux学习第三篇
  • 牛客算法_模拟
  • 多线程 —— CAS 原理
  • 兰州做网站的有哪几个网站后台登陆不了
  • css实现表格中最后一列固定
  • 优秀原创设计网站门户系统设计
  • linux环境docker如何让启动的容器在后台运行
  • 软考架构师高分避坑指南:三科实战拆解与破局之道
  • 新手向C语言JavaPython 的选择与未来指南
  • 摄影网站难做吗网站如何集成微信支付
  • Redis5安装与核心命令详解
  • 单个请求中同时使用 multipart/form-data 和 application/json 的可行性及正确实现方式
  • wordpress网站配置甜妹妹福利wordpress
  • 新奇的Word表格单元格合并
  • 网站建设模板系统网站漂浮广告怎么做
  • 【如何解决“支付成功,但订单失败”的分布式系统难题?】
  • MQTT系列(三)
  • app开发流程表北京网站优化快速排名
  • 衡石科技嵌入式BI:重构企业应用的数据智能生态
  • rdd数据存储在spark内存模型中的哪一部分