研究War3编辑器(7):在触发器中使用JASS脚本

您所在的位置:网站首页 魔兽三冰封王座代码 研究War3编辑器(7):在触发器中使用JASS脚本

研究War3编辑器(7):在触发器中使用JASS脚本

2024-07-15 16:06| 来源: 网络整理| 查看: 265

JASS脚本

JASS(Just Another Scripting Syntax) is an event driven scripting language used in Blizzard Entertainment’s Warcraft III game. Map creators can use it in the World Editor to create triggers and AI scripts. JASS (仅仅是另一个脚本语法)是一个事件驱动型的脚本语言,被用在War3中。用户可以在地图编辑器中使用它来创建触发器和AI脚本。 ——Jass Coding | Warcraft 3 World Editor Wiki | Fandom

http://jass.sourceforge.net/doc/ 是一个非官方的JASS手册。

本篇目标是尝试在触发器中使用JASS脚本。并讨论一些相关的内容。

触发器中运行“单行脚本”

在触发器的动作中,有一个类型是Custom Script 在这里插入图片描述 这个“动作”代表运行一个单行的JASS脚本。 例如call DisplayTextToPlayer(GetLocalPlayer(), 0,0, "Hello, yaksue!")将显示“Hello, yaksue!”给玩家 在这里插入图片描述 接着,我设置这个触发器的事件为“当一个单位死亡” 在这里插入图片描述 测试: 在这里插入图片描述

触发器转换为“自定义文本”

上述的使用方式中,只能运行简单的命令,但有时逻辑必须使用多行来表示。

为此,可以将一个触发器转换为“自定义文本” 在这里插入图片描述 正如编辑器所提示,这个转换是不可逆的:(其实这也意味着转换之后,对逻辑的控制更加底层了) 在这里插入图片描述 转换之后生成了多行代码。对这个结构暂时先不研究。 不过可以看到:之前定义的逻辑,在Trig_Untitled_Trigger_001_Actions这个函数中: 在这里插入图片描述 现在稍微改变Trig_Untitled_Trigger_001_Actions其中的逻辑,加一个循环,让它计数10次然后输出信息:

function Trig_Untitled_Trigger_001_Actions takes nothing returns nothing local integer i=0 loop exitwhen i==10 call DisplayTextToPlayer(GetLocalPlayer(), 0,0, "yaksue count:"+I2S(i)) set i=i+1 endloop endfunction //=========================================================================== function InitTrig_Untitled_Trigger_001 takes nothing returns nothing set gg_trg_Untitled_Trigger_001 = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Untitled_Trigger_001, EVENT_PLAYER_UNIT_DEATH ) call TriggerAddAction( gg_trg_Untitled_Trigger_001, function Trig_Untitled_Trigger_001_Actions ) endfunction

测试: 在这里插入图片描述

地图的脚本

地图可以导出脚本 在这里插入图片描述 不过我并没有找到“导入脚本”的操作。我觉得这可能意味着,存在于地图中的数据,并没有全部都能被导出到脚本中,否则的话二者就可以无缝转换,而不是现在这样只能地图单向到脚本。

通过比较差异来学习脚本操作

我能想象到的一个利用地图的“导出脚本”功能来学习JASS的一些函数的方法是: 比较操作前后的差异。

例如: 我新建一个空白的地图,导出脚本到test_a.j 然后在地图中做些操作,例如放置几个农民: 在这里插入图片描述 再导出脚本到test_b.j

这样,可以比较两个脚本的差异(比较差异的软件我使用了Meld): 在这里插入图片描述 经过简单的分析,就可以明白CreateUnitsForPlayer0中有放置4个农民的操作:

function CreateUnitsForPlayer0 takes nothing returns nothing local player p= Player(0) local unit u local integer unitID local trigger t local real life set u=BlzCreateUnitWithSkin(p, 'hpea', - 209.7, 79.4, 109.955, 'hpea') set u=BlzCreateUnitWithSkin(p, 'hpea', - 90.2, 74.0, 66.645, 'hpea') set u=BlzCreateUnitWithSkin(p, 'hpea', 30.3, - 11.6, 155.725, 'hpea') set u=BlzCreateUnitWithSkin(p, 'hpea', - 21.9, - 131.8, 169.700, 'hpea') endfunction

而其中BlzCreateUnitWithSkin就是放置单位的操作了。

接下来,我可以在一个新的地图中,建立一个触发器,使用Map initialization作为事件,转换为“自定义文本”,然后将生成农民的代码拷贝到函数体中: 在这里插入图片描述 之后,我虽然在地图编辑器内看不到农民,但是因为有了一个在地图初始化阶段就触发的触发器,其中有逻辑放置农民。所以我运行游戏的时候可以看到4个农民: 在这里插入图片描述

如何查阅原生函数

DisplayTextToPlayer用来显示信息,BlzCreateUnitWithSkin用来放置单位,这些函数都是“原生函数(Native functions )”

在 http://jass.sourceforge.net/doc/globals.shtml#native中有如下描述: Native functions are functions that are implemented within the Warcraft III engine. They form the API which the game exports to JASS programmers. Unless you have access to Warcraft III’s source code, you probably will not be defining a new native function, but you will probably call them. Their prototypes are declared in common.j, common.ai, and Blizzard.j. 原生函数(Native functions)是War3引擎所实现的函数,他们构成了导出给JASS程序员的API。除非你可以获取War3的源代码,否则你不可能定义新的原生函数,只能调用他们。函数的声明被放在了common.j,common.ai,Blizzard.j中。

我通过搜索,在我的C:\Users\admin\Documents\Warcraft III\JassHelper路径发现了common.j和Blizzard.j: 在这里插入图片描述 其中DisplayTextToPlayer和BlzCreateUnitWithSkin都能在common.j中找到:

native DisplayTextToPlayer takes player toPlayer, real x, real y, string message returns nothing native BlzCreateUnitWithSkin takes player id, integer unitid, real x, real y, real face, integer skinId returns unit


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3