找回密码
 点一下
查看: 5034|回复: 23

【新手进阶向】触发器GUI(可视化界面)使用技巧总结

[复制链接]
发表于 2016-9-2 21:50:37 | 显示全部楼层 |阅读模式
本帖最后由 七键守护神 于 2016-9-17 06:24 编辑

2016年9月17日更新 : 复制与粘贴,剪贴板的灵活应用

GUI是SC2编辑器所提供的默认工具,一般我们称为“编辑器”的即是GUI。与GUI对应的是代码,包括触发器用的Galaxy和资料、UI部分用的XML,以及文本部分用的文本文件。在我们这篇文章中,GUI主要指触发编辑器,代码主要指Galaxy。

GUI是可视化界面,所以新手也可以完全理解,新手的地图往往是完全通过GUI界面做出来的,但GUI并不应该是仅限于新手所使用的工具。就像编写代码需要工具和技巧一样,操作GUI一样需要有工具和技巧,掌握技巧后,GUI编写出的地图绝不会逊于纯代码编写的地图。
长久以来,坛子里基本没有任何对GUI的使用总结,所以产生了使用GUI完成不了Galaxy的全部功能,或者使用GUI作图的速度不如编写Galaxy,以至于GUI的运行效率不如Galaxy等错误说法。
在这里我会逐步总结GUI的使用技巧,技巧来自于这几年我的个人经验,如有错误请指正,谢谢~

这篇教程默认你会使用GUI制作一张成品地图。
如果还不会制作地图的新人,建议去参考官方和论坛的基础教程,这篇文章只会提到那些GUI下编写地图的实用技巧,而不会提到如何使用GUI完成一张地图。

但是要想完全用好GUI的所有功能,你也得或多或少的了解Galaxy,至少是了解它的一部分运行原理。
所以,这篇文章在有些地方会扯到代码上去,希望各位不会反感。

文章更新慢,请多多包涵。

0 ——————理解触发器和Galaxy之间的联系——————
在提到这些技巧之前,作者必须要理解触发器和Galaxy之间的联系到底如何。
触发器和Galaxy互为表里关系。星际争霸2游戏不能直接使用触发器这种东西来安排地图进度,它只能读懂Galaxy。所以,你在触发器编辑器中编写的触发器,在你点下“保存”按钮的时候,会经过一系列的处理(编译),变成Galaxy代码,从而让星际争霸2游戏可以读懂你写的触发逻辑。
在触发器编辑器窗口下,按下Ctrl+F11,即可看到你编写的触发器转换成Galaxy后的样子。你写的每一个触发和动作,都在这里面对应着某一段代码。
触发器编辑器中,我们使用Ctrl+T可以新建一个触发器,使用Ctrl+Alt+R可以新建一个动作,使用Ctrl+Alt+F可以新建一个函数。
在Galaxy中,上述这些都被统称为“函数”。也就是说触发器也是函数,只不过触发器是被注册过事件而且有一定格式的函数。动作也是函数,动作就是返回void值的函数,所以我们一般不用动作来获取返回值,而是用它来发布一条新的触发指令。

函数→有返回值=GUI中的函数
函数→无返回值=GUI中的动作
函数→被注册了事件=GUI中的触发器
它们在Galaxy界面下完全等价

除了触发器和函数以外,触发器编辑器中还存在着变量,位于函数之外的叫做“全局变量”它们能在这个游戏中的任何地方被调用,位于函数内的叫做“局部变量”,它们只能在当前函数中使用。函数中使用到的“参数”也是一种局部变量。
1——————学会使用快捷键和搜索功能——————
在GUI下使用触发器不应该是“点点点”。就像玩星际2游戏本体一样,“鼠标流”是菜鸟的体现。SE不是WE,其在设计之初就有了很完善的快捷键和搜索系统。合理使用键盘和搜索可以让你的GUI操作速度提升几倍以上,达到不低于Galaxy使用者的编写地图速度。
①:快捷键
快捷键
1-“Alt+O”,这是使用最频繁的快捷键。在大部分时候它的意思是“确定”。虽然在很多时候,回车也可以表示确定,但回车在某些时候,比如具有子条目的窗口,或者文本编辑窗口,这时候按下回车会触发别的效果,所以,无论在任何时候,习惯使用“Alt+O”来当做确定键。
2-“Ctrl+W”,同样使用很频繁的快捷键。在大部分时候它的意思是“新建条目”。至于新建什么条目,要看你当前的窗口焦点在什么地方。比如,我们选中一个触发器的“条件”部分,按下“Ctrl+W”,就可以“新建条件”,在触发器的“变量”部分,按下“Ctrl+W”,就能新建一个局部变量。另外,如果是在一个子函数里面,比如“组合多项文本”,这时候按下“Ctrl+W”可以新建一个拼接的文本。这也是一个频繁使用的快捷键,使用它就可以让你免去记忆更多快捷键的麻烦,请一定要熟练使用。
3-“Ctrl+/”,插入注释。注释给触发器增加了可阅读性。注意,注释可以在触发器编辑器的任何地方插入。GUI下的注释具有的一个无与伦比的优势就是支持中文。多用注释吧,因为你现在编写的触发器在以后你自己未必能看懂。
4-“Ctrl+D”,查看原始数据。这是一个非常频繁使用的快捷键。这个快捷键可以查看语句的原始格式,在和使用英文编辑器的人交流时会非常有用。但重要的不仅于此,查看原始数据可以让你看到变量名和函数名的真实名称,而这些真实名称是在你输入自定义代码时所必须要知道的(比如,你新建了一个变量叫做“变量1”,但实际上,按下Ctrl+D后,你会发现它其实叫做“e58F98E9878F1”。更重要的是,在用Ctrl+D切换到原始数据界面后,你可以用重命名功能修改变量或函数的真实名称,使用这个功能,我们就可以做出一个在GUI界面下保持中文名称,而将其真实名称的乱码改为有意义的英文名称,比如叫做“变量1”的变量,真实名称可以改做“Value1”,制作出无论是GUI还是Galaxy界面下都可以流畅阅读的触发来。在之后我们关于“封装函数”一讲中,里面提到的大部分变量和函数名称都需要用原始数据界面来查看。

②:搜索
搜索功能是我们找到函数和变量条目的主要手段。用眼睛去找是不现实的,无论在什么地方,都需要大量的应用到搜索。
搜索大致分为三种情况:
1-搜索框
GUI教程_9.jpg
搜索框是最显而易见的搜索功能,搜索的时候需要注意一些事项:
搜索的字段尽可能简短,比如要搜索“发送演算体消息到单位”,时,只需要搜索“发送演算体”即可,然后按下Tab键,用键盘在下方的选项中选择“发送演算体消息到单位”,因为字段越长,人的记忆越可能出现误差,所以简短且接近的搜索内容是最好的选择。
搜索的字段不要有错别字,最好也不要带有空格和标点符号,因为你不确定这些标点符号是全角的还是半角的,事实上,在SE中,全角和半角的标点符号都存在一些。
搜索的内容可以是函数的名称,也可以是函数的注释,比如“文本信息”这个动作,其注释为“在屏幕的指定区域中显示一个文本消息。”,这种时候,我们不管是搜“文本信息”还是搜“文本消息”都可以将这条动作给搜出来。
2-在列表中搜索
这种搜索也可以说是“盲搜”,也就是说在不点击搜索框的情况下,在当前界面中直接输入文字,界面焦点会自动跳转到首文字与输入文字一致的地方,注意,只是首文字,这种搜索方法不能从一个条目的后半段文字开始搜起,所以这种搜索法只适合用于你所熟悉的条目,用于加快制作速度。
比如,我们在“新建动作”界面下,不点击搜索框,直接用中文输入法输入“发送演算体”。
GUI教程_10.jpg
如图。然后按空格(输入法里表示确定的意思)。
GUI教程_11.jpg
焦点自动跳转到了最符合首文字的地方“发送演算体消息”。
盲搜能够搜到有效的内容是中国人(准确说是中文输入法)的特权,因为中文输入法可以一次性输入一小段话,而英文只能跳转到首字母所在的位置,不能精确定位。
3-在下拉菜单中搜索
有的时候我们可以在编辑器中遇到一些需要下拉菜单选择的情况,比如“发送演算体消息”动作中,我们需要下拉菜单来选择发送何种消息。
这种搜索情况和盲搜类似,打开下拉菜单,直接用输入法输入内容后,焦点就跳转到了首文字符合条件的地方。不同的是,在这种搜索情况下用英文输入法直接打入一串字母是可以精确定位的,而不是只能跳转到首字母位置。
举例,我们在“发送演算体消息”动作中,打开下拉菜单,输入“设置不透明”。
GUI教程_12.jpg
输入后,按下空格。
GUI教程_13.jpg
焦点就自动跳转到最匹配的“设置不透明度”了。
2——————合理使用复制、粘贴功能——————
复制粘贴是效率之源(笑),某种程度上这个说法并不算错,制作游戏之所以需要人而不是交给AI去做,很多时候正是因为那些看起来很像但其实有微妙不同的复制条目。
在SE中,有两套剪贴板,分别适用于不同的对象。
一套是windows(或者osx)系统给予的,使用ctrl+X剪切、ctrl+C复制、ctrl+V粘贴。这个剪贴板用于剪切和粘贴字符串和文本。当你框选了一些字符或者文本,按下快捷键,使用的就是这个剪贴板。
一套是编辑器给予的,同样使用ctrl+X剪切、ctrl+C复制、ctrl+V粘贴,但它的适用范围是编辑器条目,比如一条动作、一个变量、或者一个参数。当你选中了一个编辑器条目,按下快捷键,使用的是这个剪贴板。
两个剪贴板之间没有联系。也就是说,你可以同时在内存中保留字符剪贴板中的内容和条目剪贴板中的内容。
系统自带的剪切板大家都很熟悉了,这里不再敖述,这里主要说编辑器的剪贴板。
①:哪些东西是可以被复制粘贴的呢?
触发器编辑器窗口左边部分:触发器、函数、动作、事件、录制、全局变量、注释等一切条目。
触发器编辑器窗口右边部分:事件、条件、动作、局部变量、注释、形参、实参等一切条目。
其他条目的复制相信会用电脑的就会,这里主要提到的是实参的粘贴复制,据了解,相当多的同学不知道这个是可以复制粘贴的。
选中一个动作或者函数,然后你会在窗口右边下方看到参数列表。这里面的这些选项也是可以复制的
只要参数类型一致,我们可以把一个动作或函数的参数复制下来,粘贴到另外一个动作或函数的参数里面去,这两个函数可以不是同种函数,只要你复制的这个参数的类型一致就行了。整数可以粘贴给整数,字符串可以粘贴给字符串,但整数不能粘贴给字符串。
1
jiaochen1.jpg
2
jiaocheng2.jpg
结果
jiaochen3.jpg
这样,我们就把上面那个动作的参数复制给下面那个动作了。

②:操作习惯推荐
这里仅仅是分享一些操作技巧而已:
在进行复杂的数学运算时,虽然我们可以用自定义脚本来进行更方便的运算编写,但自定义脚本中使用GUI下声明的变量时总需要手动加上gv_或者lv_,麻烦还容易出错,所以很多时候我们依然选择“算法(整数)”和“算法(实数)”来进行数学运算。
随时保持剪贴板中复制着一个“1+1”的参数条目,在需要加入一条新运算的时候,直接在运算的位置粘贴,就可以快速的加速一条新的运算了。利用这个方法,可以方便的编写出非常复杂的运算法。
jiaochen4.jpg
别忘了,在进行条目复制的时候,你还可以利用操作系统给予的剪贴板保存一个数字。有这两个剪贴板后,复杂的数学运算也可以在GUI中快速编辑吧。

3——————封装那些应该封装但暴雪却没有封装它的函数——————
触发编辑器提供了大量的函数和动作,但其实这并不是SC2所支持的全部函数内容,一部分函数没有被暴雪封装为GUI函数和动作。
而一些函数和动作对我们的编写地图非常重要,暴雪却没有封装它,这时候就需要我们自己来封装这些函数。这也是GUI使用技巧中重要的一点,就是在GUI条目不足的时候,动手制造我们自己所需要的GUI。

①: if then
相信使用GUI制作地图的大家都很熟悉“if then else”这个动作吧。但其实,很多时候我们是用不到“else”这个部分的,这时候需要我们自己封装一个只有“if then”部分的动作。
为了创建这个动作,我们需要利用到SC2编辑器提供的“宏”功能,这个功能可以让我们在Galaxy中插入任意格式的一段代码。我们需要先在GUI触发器编辑器中创建一个新的动作(Ctrl+Alt+R),给它起名叫“If Then”,然后将其属性设置为“子函数”,也就是说能让这个函数下面有一个子层级,就像是“if then else”函数和“为单位组中的每一个单位”函数一样。这样的子层级可以让我们把条件和动作添加到我们做的if then动作下面。
创建了这个动作后,为其添加两个子函数类型(快捷添加方法:选中“子函数类型”,然后Ctrl+W,即可添加一个子函数类型。Ctrl+W这个快捷键的意思就是在当前位置新建一个最符合语境的条目,非常有用,记得要多用哦)。至于为什么是两个子函数类型,因为一条是if,一条是then。
之后,选中第一条子函数类型,将其改名为“If”(或者随便什么都行,比如改成“条件”),选中第二条子函数类型,将其改名为“Then”(或者“动作”都可以,这里的名字主要是给作者自己看的)。
我们需要给这两条子函数类型起上两个“脚本识别符”。这样我们才可以在宏里使用它们。在这里分别取消掉两条子函数的“按照名称”标旗,并把下面的脚本识别符改为我们自己容易理解的内容,比如把第一条改为“if”,第二条改为“then”,注意,这里的if和then没有意义,同样是为了让我们自己容易理解。
接下来是关键,我们点选“自定义脚本代码”,然后输入如图所示的内容。实现方法关键就在这里,这里的第一个if是真正的if,第二个if就是我们刚才创建的那个子函数if的脚本识别符,而“#SUBFUNCS”表示的是在这个位置插入子函数的内容,所以,我们所创建的子函数条件就通过这样的方式,被插入到了真正的if then的Galaxy代码中。
同样的道理,我们将then的内容也添加到代码中,这样,我们在then的位置创建的动作就可以被插入到真正的Galaxy代码中。
GUI教程_1.jpg
属于我们自己的,简介的“if then”动作就做好了。马上就去试试吧,随便开一个触发器,新建动作,搜索“if then”,是不是已经有了我们自己做的这个没有else版本的动作了呢?
GUI教程_2.jpg
在大多数情况下,它用起来可比系统自带的if then else干净多了!

②:创建触发器
熟悉Galaxy的作者们会知道这个,但如果是一直用GUI制作地图的作者可能根本都不知道这个函数,但其实这是SC2中非常重要的一个函数,可惜,暴雪没把它封装成GUI。
这个函数可以将一个函数变为触发器,让它接下来能够响应相关的事件。
我们一般在GUI中创建的触发器,都是在游戏初始化的时候在默认初始化函数中被创建的,而在接下来的整场游戏中,其实并没有创建新的触发器,最多是禁用和开启之类的操作罢了。但在Galaxy下,触发器是可以在游戏过程中被动态创建的。
对于某些事件,这甚至是必须的,举个例子,我们在地图上随机的刷出了一个奖励,然后最先进入这个区域的玩家可以得到这个奖励,这就需要一个“进入区域事件”事件来响应玩家的单位进入了这个区域。但是,进入区域事件的这个区域必须是在触发器被创建时就被确定的,也就是说,如果我们利用现有的GUI,就无法得出这个随机奖励的位置,也就不知道这个区域应该在哪,结果就是无法使用“进入区域事件”来做出这个效果。
如果我们能够在刷出这个随机奖励的时候才创建这个进入区域事件,我们就可以指定这个区域的位置,所以,这个功能的实现必须依赖于“创建触发器”的封装。

正确的将一个函数变为一个触发器的流程是:
创建触发器变量 → 用设置变量动作将新创建的触发器变量创建为触发器函数 → 为这个触发器变量添加事件
创建触发器的Galaxy语句非常简单:trigger TriggerCreate("函数名");,参数是一个字符串,代表函数的名字,返回一个触发器类型的变量。
所以我们的封装也很简单,新建一个函数(Ctrl+Alt+F),命名为“创建触发器”,返回类型设置为“触发器”,参数新建一个,类型为“字符串”,命名为“trigger”,动作增加一条“自定义脚本”,在这个自定义脚本里写上“return TriggerCreate(lp_trigger)”;
GUI教程_3.jpg
这个函数就封装好了,是不是特别简单呢,别高兴太早,这只是创建了一个光杆触发器,还没有为其添加上事件,这个触发器现在是什么也做不了的。
在要使用这个函数的时候,我们先创建一个触发器类型的变量,然后让这个变量 = 创建触发器(“函数名”);,就可以让一个函数变成一个触发器,之后,就可以为它添加各种事件了。
要变为触发器的函数有一定的格式要求,这个函数必须返回“布尔”型的返回值,并且有且仅有两个布尔类型的参数。

对了,别忘了再封装一个TriggerDestroy(触发器);动作,用来摧毁那些用过了的触发器哦,有创建就得有摧毁,这是培养良好制作习惯重要的一部分。

③: 为触发器添加事件
刚刚创建出来的触发器是不能响应事件的,因为我们还没有给它绑定事件。事实上,GUI下的触发器就是被绑定了事件的函数。
事件类似于动作,它可以在触发器被创建后给触发器添加事件响应。比如,进入区域事件,就应该是我们在创建了一个触发器之后,用“TriggerAddEventUnitRegion”这个事件为其注册。当前,这条动作(事件)本身只有Galaxy版的,我们要在GUI中使用它的话,同样需要对它进行封装。
创建一个新动作,起名叫“为触发器添加事件(单位进入区域)”,返回类型为“无”(因为不需要这里返回什么),为其添加三个参数,参数1起名叫“trigger”为触发器类型,参数2起名叫“unit”为单位引用类型(用UnitRefFromUnit函数获取单位引用),参数3起名叫“rect”为区域类型,参数4起名叫“into”为布尔值类型。这些起名只是七键的个人习惯,如果你自己有其他的习惯可以按照自己喜欢的起名。
然后,新建一个自定义脚本,在里面输入“TriggerAddEventUnitRegion(lp_trigger, lp_unit, lp_rect, lp_into);”(参数1:要注册事件的触发器变量,参数2:单位引用,如果是任意单位则填写null,参数3:区域,参数四:是进入/否离开)
这样就把添加区域事件的Galaxy代码封装成了GUI动作了。
之后,我们就可以实现把一个函数创建为触发器的流程:
GUI教程_4.jpg

不同的事件,在格式上也会有一些不同,这里为新手提供一个比较直观的方法来得知事件参数应该怎么填写。
新建一个地图,然后把默认的触发器的事件改为我们想要知道格式的那个事件,按下Ctrl+F11,搜索“TriggerAddEvent”,即可找到这个事件拥有的参数数量和类型。到此为止,我们已经学会了如何将“Galaxy限定”的动态创建触发器功能封装到GUI中,需要注意的是,一场游戏中同时存在的触发器总量有上限,而且这个上限比较低,是4096,超过的话游戏就会崩溃。所以一定注意不要滥用创建触发器这个功能,已经用完的触发器要及时的用“TriggerDestroy”函数进行销毁。

④:封装“函数引用”功能
引用也叫指针。和CreateTrigger一样,函数引用也是一个“Galaxy限定”的功能,这个功能并不是星际2刚发出来的时候就有了的,而是在自由之翼1.5补丁中加入的。
如果你还不懂如何使用函数引用,或者不知道函数引用可以做什么,那么请参考头目这个帖子:
http://bbs.islga.org/forum.php?m ... peid%26typeid%3D120
函数引用是非常非常有用的功能,虽然对我们这些使用GUI做地图的作者来说听起来感觉很玄,但其实说白了,函数引用的作用是“把函数本身当作变量用”。这里为了方便理解,举个例子:
有一个Boss,他有三个T技能,在每次攻击时,他都会从这三个技能中抽取一个来使用。
这三个技能我们分别把它们写成了三个函数。如果不使用函数引用的话,我们只能这样写:
GUI教程_6.jpg
看起来似乎还好?才不是呢,这里只是三个分支罢了,如果是10个?如果是超过100个的分支呢?这也造成了一部分“GUI作图速度不快”言论的起源,这种写法让人感觉到有些笨拙。
如果我们能够使用函数引用的话,就可以把上述的“函数引用测试1”“函数引用测试2”“函数引用测试3”这三个函数当作变量存入一个数组中,然后通过遍历的方法使用它们。
但很可惜,星际2自带的GUI并不支持函数引用功能。一部分作者会选择把这些需要变为变量存入数组的函数写成触发器,触发器的话就可以当作变量使用了。但是别忘了之前我们在“③:为触发器添加事件”里提到的触发器有数量上限这回事,滥用触发器是不好的习惯,说不定什么时候就被它坑到了,这种时候我们需要用函数来解决问题才对。
既然星际2的GUI自身不支持函数引用,那我们应该怎么处理这类问题呢?答案是用功能。
宏是GUI最强大的功能之一,是GUI的功能超过Galaxy的部分。如果你以前编过程(特别是C++一类的程序),那么你应该很熟悉宏。没错,星际2的GUI界面支持类似C++的那种宏。
简而言之,宏的意思就是可以在游戏脚本中插入任意一条语句,而不用管这个语句是否合符语法规范。所以,既然星际2的GUI自身不支持函数引用,我们就用宏功能强制写入一条函数引用。
要想使用宏,需要先创建一个自定义动作,然后将这个动作的属性里的“子函数”打上勾。这样,这个函数就变成了一个宏函数,它自身不会被直接编译,而是会将一段Galaxy代码直接写入游戏脚本中。

我们回到刚才的问题,现在的情况是,“有一个Boss,他有三个T技能,在每次攻击时,他都会从这三个技能中抽取一个来使用”。根据需求,我们需要一个函数数组,可以放入三个函数变量,然后在Boss攻击时,运行这个数组中的随机变量。
为此我们需要先创建函数引用。如何创建函数引用的方法在头目的帖子里有说明,我们在触发器中创建一个全局的自定义脚本,并在其中写入:
  1. void gf_funcType(){}
  2. funcref<gf_funcType>[4] gf_funcRefGroup;
复制代码
这样,我们就创建了一个尺寸为4的一个函数数组,可以将函数作为变量填写进去了。
这里我们是通过创建一段Galaxy代码来创建数组的,当你对宏的了解有更深入的话这里也可以考虑用宏来做到同样的事,那样就可以做到整篇地图不见一句代码了(七键一直认为通篇不见一句代码比通篇不见一行GUI触发更有意义,虽然后者经常被某些人拿出来炫耀)。
然后,我们新建一个自定义动作,“子函数”属性打勾,为其添加一个参数,参数的类型选择“任意类型”(是不是很奇怪参数可以选择“任意类型”?这是子函数特有的,表示任意内容,所以我们可以用它来当作引用的参数),起名“funcRef”,再新建一个参数,类型为整数,起名“tag”,然后在其下面的自定义脚本中写入代码:
  1. gf_funcRefGroup[#PARAM(tag)] = #PARAM(funcRef);
复制代码
我们来分析一下这句代码,让我们能够理解它的意思,之后才可以更好的编写自己的宏。
gf_funcRefGroup是我们刚才新建的那个函数数组,要注意的是“#PARAM(tag)”,#PARAM的意思就是“直接引用”,也就是说,参数中的“Tag”会被直接插到这个位置,而不是作为一个参数被传到这个位置,要牢记这是一个宏,不是函数,我们是直接在操作这句代码。
#PARAM(funcRef)的意思同上,将“funcRef”这个位置的输入值直接插在这里,通过这种方法,我们成功的实现了“把函数引用当作参数”这一目标。
注意,这里是宏,等于直接在游戏脚本中写入这些内容,所以参数前面不需要加上“lp_”。
我们做好了“封装函数引用”动作,接下来,要封装“使用函数引用”函数,让我们能够通过一个整数值来运行数组中的函数。
封装方法和之前封装触发器事件的方法大同小异,这里不需要用到宏。我们新建一个自定义动作,新建一个整数类型的参数,起名为“tag”,在动作里添加一个自定义脚本,输入:
  1. gf_funcRefGroup[lp_tag]();
复制代码
这样就可以在GUI界面下,通过整数编号运行函数数组里面的函数了。
GUI教程_8.jpg
终于可以用“聪明方法”来做出这种遍历函数数组的方式了,不是吗~
要看以上触发的效果,可以下载附件的测试地图,进游戏后点击右上角的按钮。


今天先写到这里,之后会逐渐补充这个帖子。写得比较啰嗦,请见谅 = = 最后希望更多喜欢GUI的朋友能够接受我的这些观点~

包含了以上内容的演示地图:
GUI教程_5.jpg
GUI使用技巧.SC2Map (19.75 KB, 下载次数: 32)








发表于 2016-9-2 21:52:41 | 显示全部楼层
顶起
回复

使用道具 举报

发表于 2016-9-2 22:06:56 | 显示全部楼层
很好地教程,期待7J能继续往下写。现在系统的教程很少,给想学习编辑器技术的人制造了不小的困难。真的很期待这类教程越来越多。
回复

使用道具 举报

发表于 2016-9-3 02:12:39 | 显示全部楼层
好教程,太有用了~正想问问头目的AddEvent系列函数是怎么封装的
回复

使用道具 举报

发表于 2016-9-4 21:23:05 | 显示全部楼层
不能再感谢了,我就佩服死暴雪了,CreateTrigger这么重要一个函数,结果没有封装成GUI,不知道那根筋抽着了。
回复

使用道具 举报

发表于 2016-9-4 21:46:04 | 显示全部楼层
dohanfeng030 发表于 2016-9-4 21:23
不能再感谢了,我就佩服死暴雪了,CreateTrigger这么重要一个函数,结果没有封装成GUI,不知道那根筋抽着了 ...

因为地图内最大触发上限是4096,所以如果提供了API有可能导致问题
回复

使用道具 举报

发表于 2016-9-5 11:19:51 | 显示全部楼层
顶你!这个教程对新手作图有很大帮助!可惜的论坛貌似没有关于AI的教程啊 如何能在自己图里给电脑加点智商使其不那么笨的教程要是写点就好了
回复

使用道具 举报

发表于 2016-9-11 22:03:09 | 显示全部楼层
加入引用的封装,这已经不是新手向的了。我觉得好多老鸟都未必已掌握这知识。我虽然玩编辑器好多年,也就是近期才学会宏和引用,而且引用还很生疏,有时候套嵌的多了,自己都蒙了.....
回复

使用道具 举报

发表于 2016-9-11 22:23:27 | 显示全部楼层
yxxiaobin 发表于 2016-9-11 22:03
加入引用的封装,这已经不是新手向的了。我觉得好多老鸟都未必已掌握这知识。我虽然玩编辑器好多年,也就是 ...

引用封装我之前就发布过帖子
http://bbs.islga.org/read-htm-tid-2447388-page-1-fpage-1.html
SC2Mapster上也发过,没人回复。
本身这东西的用处就是库开发者用来封装Galaxy脚本给其他人使用的。所以对大部分人都没用
回复

使用道具 举报

 楼主| 发表于 2016-9-12 02:13:23 | 显示全部楼层
yxxiaobin 发表于 2016-9-11 22:03
加入引用的封装,这已经不是新手向的了。我觉得好多老鸟都未必已掌握这知识。我虽然玩编辑器好多年,也就是 ...

新手进阶向就是可以通过这个帖子向老鸟进发的意思。当然写的时候其实没想太多,就想总结一下近期的一些心得。
要把触发器GUI用好这些应该都是有必要的。与其绕弯路,不如一开始就掌握正确的方法。
回复

使用道具 举报

发表于 2016-9-16 21:59:47 | 显示全部楼层
七键守护神 发表于 2016-9-12 02:13
新手进阶向就是可以通过这个帖子向老鸟进发的意思。当然写的时候其实没想太多,就想总结一下近期的一些心 ...

我要说明七键的几点错误
搜索英文盲搜也可以的,只要你按的速度不是很慢可以打一串单词的。
if then do其实是有封装的,在使用if then else multiple的时候把那个新建的动作拖出来就行了。
快捷键并不比右键菜单快,假如暴雪把新建动作触发什么的还放的像WE那么近的话我还是愿意用右键。

点评

盲搜的话,搜英文最好在汉字输入界面下,把英文输好后敲回车。  发表于 2016-9-17 20:38
回复

使用道具 举报

 楼主| 发表于 2016-9-17 05:50:14 | 显示全部楼层
priceles 发表于 2016-9-16 21:59
我要说明七键的几点错误
搜索英文盲搜也可以的,只要你按的速度不是很慢可以打一串单词的。
if then do ...

1·不是“不是很慢”,而是需要非常快。只要稍微愣神,搜索就失败了。并且你没法在不使用输入法的情况下搜索一个较长的字段,也就是说,你很难在第一次搜索的时候就定位到目标条目的附近,然后键盘按一两下就可以选定并确认条目。

2· 如果需要先Ctrl+W新建If then else multiple然后Ctrl+W新建else if再把else if拖出来,效率远不如Ctrl+W接盲搜if,经计算,使用else if写出一个条目,步骤多达9步(新建、搜索“i”、下、回车、下、Ctrl+W、拖拽、点击if then else multiple、删除if then else multiple),并且其中有两步使用了鼠标。而使用封装好的if then只需要3步(新建、搜索“i”、回车),也就是说,我写触发的速度可以达到你的三倍。并且,else if没有if then好看,GUI界面下,好看也是一个很重要的要求。

3· 右键菜单不可能比快捷键快。人眼的响应有速度限制,而快捷键没有。与观察相比,输入是几乎不需要时间的,这是在WE时代里同样的触发,打代码比使用GUI快得多的根本原因。合理使用快捷键基本可以实现双手不离开键盘的高速输入,在很多时候,这比在不成熟的IDE里打Galaxy快多了。

这里不是要实现什么以前难以实现的功能,而是技巧分享,效率是第一需求,希望大家可以更有效的利用GUI触发器这个设计良好的工具。

点评

1 打这个并不需要非常快的,只要两个键间隔在1秒内整个单词句子输入长达10秒都没问题还可以包含空格 2 有个功能叫复制粘贴,而且拖出来可以删掉原来的。 3 右键菜单非常快,但在SE不适用 因为你要插入一条新动作总  详情 回复 发表于 2016-9-17 08:07
回复

使用道具 举报

发表于 2016-9-17 08:07:11 | 显示全部楼层
七键守护神 发表于 2016-9-17 05:50
1·不是“不是很慢”,而是需要非常快。只要稍微愣神,搜索就失败了。并且你没法在不使用输入法的情况下 ...

1 打这个并不需要非常快的,只要两个键间隔在1秒内整个单词句子输入长达10秒都没问题还可以包含空格
2 有个功能叫复制粘贴,而且拖出来可以删掉原来的。
3 右键菜单非常快,但在SE不适用 因为你要插入一条新动作总是要选定目标的,而SE把这个按钮放的太远了,而且按下菜单上的键一部分人并不是依靠眼睛而是依靠习惯鼠标动作的。而且组合键对于绝大部分人很难按。
回复

使用道具 举报

 楼主| 发表于 2016-9-17 14:15:55 | 显示全部楼层
priceles 发表于 2016-9-17 08:07
1 打这个并不需要非常快的,只要两个键间隔在1秒内整个单词句子输入长达10秒都没问题还可以包含空格
2  ...

这就是限制,明明有可以保证绝对不会出错的中文输入法不用,却要用一不小心就会误输入的直接打英文,有必要这样吗?
我刚更新了关于复制粘贴的技巧的部分。你是准备在剪贴板里保留一条函数或者一条参数,还是一个else if?哪个的收益比较大?如果你不是通过新建,那么你每次在需要else if的时候都需要去找一个来复制,不是任何时候当前函数都会有一个else if的。封装一个好用的if then很困难吗?为啥就要用更加麻烦的自带版?
“组合键对于大部分人很难按”不知道如何得出的结论。最常用的组合键是Ctrl+W,可以应对大部分的新建条目,这个组合键很难按?
回复

使用道具 举报

 楼主| 发表于 2016-9-17 14:19:22 | 显示全部楼层
说真的,我第一次见到有人说“快捷键不比鼠标选菜单更快”,在任何领域。
回复

使用道具 举报

发表于 2016-9-28 04:55:26 | 显示全部楼层
学习了~
对了,复杂的数学运算怎么没提表达式?讲求效率、可读性和可维护性,表达式最高
回复

使用道具 举报

 楼主| 发表于 2016-9-28 05:19:53 | 显示全部楼层
zt0616 发表于 2016-9-28 04:55
学习了~
对了,复杂的数学运算怎么没提表达式?讲求效率、可读性和可维护性,表达式最高

嗯嗯嗯,因为只是在讲复制技巧时顺便提到了数学运算,之后会加上~
回复

使用道具 举报

发表于 2018-7-30 00:23:15 | 显示全部楼层
挺好的教程,谢谢。。。。。。。
回复

使用道具 举报

发表于 2018-8-3 18:02:52 | 显示全部楼层
话说写自定义脚本的时候可以在ide里面编辑吗。。里面的变量名一个比一个反人类,记不住。。没有tab活不下去
回复

使用道具 举报

发表于 2019-1-2 20:54:06 | 显示全部楼层
学习了!!!!!!!!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-27 12:08 , Processed in 1.354702 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表