2024年3月13日发(作者:)
新手做图入门指导教程〔第一章〕
作者:心魔工作室-巴哈姆涛
前言:
现在有很多玩家都对WE有着浓厚的兴趣,而且都想能创作出自己的魔兽地图,虽然
在论坛里也有很多相关的讨论贴,但是大部份都是针对一些对WE有一定了解的玩家所做
的,而对于刚刚起步并才开始弄WE的玩家则没有一些基本的教程或讨论贴,所以,在此,
本人决定以自己学习WE及做图的经验与心得写一个面向初识WE玩家的地图制作指导教
程,希望对各位新手们有所帮助!当然要完成一张RPG地图或是对战地图还要有作者的很
大的决心及恒心,对魔兽这个游戏,包括战役地图,对战地图及RPG地图要有一定的了解,
至少要会玩魔兽。如果你有以上两点条件的话,呵呵,那么请继续往下看吧,你一定会有
所收获的!
第一章: 认识WE
第一节 相关的名词及概念
相信有些新手们还不知道什么是WE吧!呵呵,WE就是World Editor的简写啦,译
做中文应该是叫做世界编辑器,这个东西就是大多数地图制作者们的工具了,你只需要在
魔兽的安装目录下就能找到了。如果是第一次运行的话,会出现个用户协议之类的,不用
管了,有对话框就只管按确定吧!
关于什么是T?-我们在一些讨论贴中经常会看到一些诸如“用T吧,T不对吧”的
语句,其实这个T也是一个简写,它是触发事件编辑器(Trigger),它的功能是很强大的,
知道为什么对战地图时一来每个玩家都有一定的资源和单位吗?就是它弄的了,还有像一
些RPG地图里的剧情啊,对话啊,包括开始时选择英雄也是用它来实现的,可以说,只要
是一张RPG地图的话,T就是整个地图的精髓与灵魂所在。没有T,那么你的地图就只是
一张好看的摆设罢了!!!(由于这是新手教学贴,所以在以下的课程里面会专门提出来进行
讲解,现在暂不讨论)
关于JASS,我想还是有很多人听说过JASS吧,这个的确是个好东东,功能比T还要
强大,但是需要一定的程序设计能力的人才会用了吧,这对于新手来说更是不沾边的了,
所以在本教程中不涉及讨论!如果各位有兴趣的话可以自己去找点相关的教程!
另外的几个相关东东:物品管理器,声音管理器及输入管理器将在具体的制图过程教
学中提到!
第二节 熟悉WE
不知怎么说呢,大多数地图作者都必须经历的一个过程吧:修改地图。呵呵,没错,
修改地图是了解并熟悉WE的一个捷径。虽然现在都不提倡修改地图,不过做为学习WE
的一个手段,我还是建议大家先从改图学起,而最简单的就是先修改官方的对战地图了!
下面将以Lost Temple这张人气较高的对战图来入手,让我们一起揭开WE的神秘面纱!
运行WE,进入后先将菜单栏里的窗口选项打开,将里面的刷子表那里的勾去掉,这
样WE的速度会有所提高。选择菜单栏里的文件-打开地图,在目录里找到要打开的地图,
如:Lost Temple.打开之后,就是这个地图的地形了!
认识工具面板:在地图中有一个工具面板,如果没显示的话可以在菜单栏的层面里面
打开。它包括:地形面板,地形装饰物品面板,单位面板,地区面板和镜头面板。以下将
会分别说明!
1.地形面板,最好理解的一个了,你现在所能看到的整个地图的地形。包括平地,坡
地,水,草地和悬崖等都是用它弄出来的,自己试着改改看吧!
2.地形装饰物面板,呵呵,和上面那个差不多,不过内容就多了,看到地图上的树啊,
花啊鸟啊什么的了吗?就是用它弄了,同理,自己试着改去吧!
3.单位面板:也是事先放东西的工具了,地图上的中立怪,商店,生命泉和金矿就是
用这个放的了,还有一个就是玩家开始地点也是由这个来完成。
4.地区面板:基本上是用在T里面的,现在唯一能做的就是弄传送门。暂时先不管!
5.镜头面板:用在交待剧情时用,同样要用T来弄,也先不管了!
说到这里,基本上WE里要用到的几个工具大家都知道一点点了,具体怎么用就在下
面以修改地图的实例来说明了。(示范图为Lost Temple) 新手做图入门指导教程〔第一
章〕
一.修改金矿的数量,是不是觉得对战时金矿不够采,才12500的金子,改多一点吧。
先将工具面板打开至单位面板,此时在地图上选中一个金矿,双击,会出现一个对话框,
里面很明显有个“金钱含量”的框框,默认的是12500,这个就是该金矿的含金量了,想
改多少自己弄吧。
二.如何让中立怪死后掉落物品。是不是看到金矿旁边的怪有两个有白色圈圈在动啊?
那个就说明杀了此单位后它会掉东东,怎么弄呢?同上面一样,选中它,双击,出现对话
框了,此时你可以修改它的一些属性,如生命值比例,所属玩家等。看到掉落物品的选项
没?就是那个,点了它后,打开下拉列表,里面有两个选项,两个都可以设置其死后掉落
的物品,自己试试看怎么设置吧,这里就不再说明了!
三.在原有地图上加一些单位:如商店,酒馆或是金矿放几个怪!打开单位面板,在中
立无敌意里面可以找到如金矿,泉水,商店酒馆等中立建筑,也有一些单位,如小鸡野狗
等。想在哪里放就放吧。要加入怪的话就打开中立敌对里面,慢慢找吧。放了之后就自己
设置其掉落物品了,当然也可以改更其所属玩家,如果将怪改为中立无敌意,那么它就不
会主动攻击你,根本就不会攻击你了,但是你杀了他也得不到经验和金钱!
四.如何加个传送门。以地图的左上和右下的两个小岛为例,先在两边各放一个传送门
(单位面板-中立无敌意-建筑),之后将工具面板打开为地区面板,点击后在左上的传送
门所以位置(门下)弄出一个区域来,之后命名为DOOR A,同理在右下传送门处也弄一
个,名为DOOR B,下面则是激活传送门了,切换回单位面板,双击左上传送门,出现对
话框后有个激活选项,打勾,出现下拉列表,选择DOOR B,此时这个传送门就好了,接
下来同样的方法弄右下的,选择DOOR A。
至此,简单的修改就已经完成了,当然了,我们并不满足这点点的修改,接下来当然
要来点实在的,比如改改英雄啊,技能啊什么的!
第三节 物体编辑器初识
物体编辑器来了,这个相当于一个数据库了,魔兽地图中的所有数据都差不多在这个
里面了。打开物体编辑器后会有一排的各种选项,先看单位的吧!
单位列表:里面有所有你在正常地图里面所能见到的一切单位!而要弄懂这个也并不
太难,只不过是里面的内容很多,弄起来费时间吧了,我就找几个常用的来介绍说明。
先来个变态的,比如,将农民改的比英雄还强大,首先打开人族,对战,单位,选中
农民,右边就会出现该单位的相关数据了。要变态当然是攻击超高,护甲超强,技能超变
态,血超多,跑得超快,打人也快,好的,慢慢来,一项一项改吧!
首先是护甲,里面有个基础防御,这个就是初始护甲了,改吧,改为100。之后是战
斗-攻击-基础伤害。这个就是攻击力,也改为100吧。然后是战斗-攻击-攻击类型,
可以改为混乱,这样就暴强了。战斗-攻击-魔法施放时间间隔时间,就是攻击的间隔,
改为1试试,每秒打一下,哈哈,其他的几个较为好理解,故不再说明,自己一试就明白
了!有些比较奇怪的就可以不用去管了!接下来是战斗-防御类型,改为神圣吧,这样就
只有混乱攻击才打得动了。下面是技能-普通,这个就是该单位的技能了,可以自己加了,
想加什么就双击看吧~!后面的什么生命值啊魔法值这些就不用我再多说了吧。这样一来,
你的这个农民已经暴强了,哪个英雄见了都吓跑!
其它的一些单位也同样的改,至于建筑嘛,会多出几个东西来,如升级的科技,训练
的单位,都是一看就知道是什么了,所以不再多说,如果是商店的话,看一下它技能及售
出的商品及可雇佣的单位等就行了。关于英雄则有些初始属性等,这些也是自己试试就行
了!
物品:很简单,就是物品,或是称宝物等,就是游戏中的那些!
可破坏物:就是树啊,箱子,门等
地形装饰物:各种雕像,柱子。。。。。。。
技能:又是一个重要的东西,和单位及物品关联大呢。在这里就是让玩家自己修改单
位或物品技能的地方了,举例说明一下,想让大法师的水元素一次召唤出10个水元素来
吗?先找到该技能,然后修改里面的数据-召唤单位计数。改为10吧。其实在技能这个
地方最多的就是修改各种数据了,比如等级,伤害值,魔法消耗,施放间隔等,自己试着
改一改,因为要每个东西都说明的话估计要一年吧~!汗!
而后面的效果及科技呢就是在自己做图时再考虑了,不过自己也可以先看看,不难!
第四节 具体问题解答
现在说一下几个常见的问题吧!
1.物品技能怎么修改?比如想把一个血瓶改成加血10000!
先在物体编辑器里的物品里找到你要改的物品(血瓶),在右边的数据里找到技能-
技能:具有医疗效果的物品(较小的),这个就是加血多少的技能了,然后再切换到技能里,
找到特殊的-物品,在里面找到相应的技能(具有医疗效果的物品(较小的)),将生命值
取得那里改成10000就行了!
是不是只觉得只有一个血瓶不过瘾,改多点吧,好的,切换回物品,还是先中血瓶,
在右边找到状态-负荷数量 改吧,改成100,哈哈,一买血瓶就有100个了,爽!
2.想让英雄的技能多一点,可以,单位里面找到英雄,比如大法师,找到技能-英雄。
在这里加吧,加个先知的召唤狼也行,不过最多此处技能不能超过5个。想加点一般技能
么?如重生。在技能-普通里面加吧!
其它的一些如英雄升级可超过10级等将会在以后的分类主题里面给大家说的,不过
目前此类问题都有置顶贴解答了,大家不妨可以去看看!
新手做图入门指导教程〔第二章〕
作者:心魔工作室-巴哈姆涛
绪言:相信大家在看过第一章之后对WE的一些基本功能都有一定的了解了吧(如果
你在看过后有照着上面的说明去修改过图),那么接下来当然是一步步接近我们感兴趣的话
题了,制作属于自己的地图!一起来看吧!通过对本章的学习,你将会学会如何在游戏中
创建单位,如何制作打怪掉宝,失败及胜利条件以及自定义单位及技能的制作!
第二章 创建属于自己的RPG地图
第一节 创建一张新地图
修改地图我们会了,那么我们怎么样来创建一张自己的地图呢?在菜单栏的文件下有
个创建新地图选项,用它就行了!
这个就是对你的地图的基本大小和地形的设置了,比如弄成宽64,高128,初始海拔
为7,地形设置为城邦,之后点确定就会生成新地形了!好了,现在在你眼前的就是你刚
才创建的新的地图的地形了,是不是很难看,呵呵,那就让它变漂亮一点吧,用第一章学
到的知识,打开工具面板,用地形面板及地形装饰物面板来弄吧!
那么一张新地图要有自己的名字,这个怎么弄呢?在菜单栏的情节选项里面可以弄相
关的信息!点击后出现下拉列表,选择第一项地图描述!
名字:就是在游戏中的显示出的地图的名字了,如Lost Temple等等!
建议玩家数:就是推荐的玩家人数,一些对战图上都有的如1V1,2V2等等!
作者:当然是写上自己的名字啦,不过这个好像在游戏中都看不到!
修改地图读取中的画面:同样在地图属性的窗口中选择场景读取中就可以修改了,点
击使用战役场景。其它的相关信息自己弄吧!
怎么样弄玩家数:创建了一张新地图后,在默认情况下是只能有一个玩家的,要多
玩家的话就得我们自己弄了!同样是在情节选项下,不过这次要选择玩家属性!之后会出
现设置玩家的窗口!你在这里可以设置玩家为用户,或是电脑,一般来说,RPG地图里都
要有一或两家电脑玩家来作为敌对方的,而且大多数都是用玩家11和玩家12来弄!之后
是弄玩家的势力了,一般来说有两个势力:正义和邪恶。具体代表图有3C,多数TD图等,
而像FOOTMAN这种图则是有四个势力,那么也可以自己设置!在情节属性窗口中选择
势力,然后在重新定义里打勾,添加势力即可,然后就拖动相应玩家到各个势力中了,最
后别忘了在固定玩家设置里打上勾!其它的几个选项就暂时不用!
这几部份弄完了,我们当然是得做开形了!用第一章中学过的知识自己弄吧!
第二节 自制一张简单的RPG地图
在现有的地图上我们得先设置玩家开始点!如果是在对战地图中,这个开始点将会是
给你创建基地和初始农民的地点,在RPG地图里面就是游戏开始后玩家的初始视野地点了,
比如我们就先把玩家开始点都弄到地图左上吧!(提示:给电脑玩家设置开始点的话,可以
放在任意位置)
一张RPG地图不像对战地图那样各位玩家有自己的单位和部队,大部份的RPG地
图都是以英雄作为自己的控制对像的,那么我们下面就说一下给玩家创建英雄单位!
首先将工具面板切换到区域面板,并在玩家开始点的地方画一个区域,命名为Heros!
之后打开菜单栏的触发事件编辑器,打开后会有一个初始化的对战初始化的T,将它删除!
然后自己新建一个类,之后在该类下新建触发器,命名为Create heros for players!选中
你新建的T之后就会在右边出现相关信息窗口了,右上空白窗口可以自己写点提示说明之
类的,下面的就是具体的T语句了!关于此处的T,请参考附带的演示地图!
创建好英雄单位后我们的冒险就开始了,此处我们先在地图上放一些供我们攻击的单
位,让其所属玩家为玩家12,我们知道,一般打死中立怪后会掉宝而且会得金钱,怎么让
打死非中立单位也掉宝和得金钱呢,同样会T来弄!关于此处的T,请参考附带的演示地
图!
作者: binaire 2005-11-6 08:03 回复此发言
--------------------------------------------------------------------------------
2 新手做图入门指导教程〔第二章〕
一个游戏自然还得有胜利条件及失败条件,这些也是T的功劳!关于此处的T,请参
考附带的演示地图!
以上所提及到的这些内容在地图均有演示,各位请自己在地图里参看!
第三节 初识触发器 T
一个完整的触发器由三个部份组成:事件、环境、和动作!
事件-即一个事件或是任务、剧情的开始,也可以这样理解,举个例子,上课铃响了
就是一个事件,或是早上8.00到了也是一个事件,这意味着接下来我们该上课了,也可以
把事件理解成为导火索吧! 环境-相当于是条件,接着上面的例子来说,早上8.00到了,
环境:如果是周一至周五。那么我们就得上学(班),如果是周末,我们就休息,也就是说
不做出相应的动作!这里上学及上班就是动作!
动作-具体的各项命令,如上学,上班,吃饭等,当然这里是用现实生活中的例子来
打比方!那么下面我们就来看一个例子以帮助大家理解这三个部份!
引用某位圣人的一个经典例子:
有一个花园,花园里面有一条狗!
事件-一个人进入花园
环境-此人是狗的主人
动作-狗摇尾巴
或者是
事件-一个人进入花园
环境-此人不是狗的主人
动作-狗就叫
这个就是一个简单的触发器了,下面就用WE中的具体事件来举个例子!就以3C的
某个人的英雄被杀了而出现字幕来说明!
事件-a unit dies 一个单位死亡
环境-triggering unit is a hero = ture 死亡的单位为英雄单位
事件-游戏-Display to all players the text:name of owner of triggering uni
t + 的英雄被 + name of owner of killing unit + 打死了! 出现提示字幕
当然,在3C中还得有打死了一个英雄后对各位玩家的奖励和对打死英雄的玩家的特
别奖励以及判断死亡英雄是否属于玩家控制等,这里就不讨论了,其实这些就是多个动作
的运用了,基于新手对WE和知识的情况来考虑,本人只提供简单基本的触发器语句的教
学,如果是自己想要更进一步了解更多的话则可以找一些其他的教程或是演示!
事件里面可以分为时间,单位,初始化等多个类型,各位可以打开WE里的触发器自
己研究,环境和动作的内容则就更多了,在这里不可能都作介绍,这些都还得大家自己去
研究学习了!
第四节 自定义单位、物品及技能的制作
一张RPG地图要有自己的风格及创意当然少不了自定义单位和技能了,那么这些东西
是怎么来的呢?其实都是在原有的单位及技能上创建的!而要做到这些,我们又得回到物
品编辑器了!
创建自定义单位:在物体编辑器的单位列表里找一个原始单位作为你要自定义的单位,
如用大魔法师来做,选中大魔法师,右键自定义单位,之后会出现对话框,输入该单位的
名字,之后会在自定义的类下面多出一个人族-英雄-XXXX(你刚才输入的名字)选中他
后,同样右边就会出现其相关数据了,这里的数和标准单位里面的相比除了名字不同外,
其他都相同,所以,既然是自定义单位,那么就改吧,模型,声音,攻击,护甲,图
标……………………这样就完成了一个自定义单位了!同理,自定义技能的方法也是一样的,
只不过你可以修改它们的等级及效果,对召唤技能而言还可以修改召唤出来的单位的数量
及种类!这些都是属于基本问题了,自己一看都知道,所以就靠各位自己研究了!
第五节 制作RPG地图的一些建议
说了那么多,大家应该对一张RPG地图的产生方法有一定的了解了,不过总体来说,
制作一张RPG地图是一个相当辛苦的过程,所以如果各位真下定决心要制作的话,那么我
在这里给大家几点建议:
1.明确自己要做哪种RPG地图?如战役类、角色扮演类、对抗类、TD或是生存防
守…………只有明确了自己做图的目标后才能在拟定出一个相关的地图制作计划(即头脑里
面有个想,不要到实际做图时还在考虑做成什么才好)
2.创建地图时大小要适中。不要想着地图弄得大就好,还得想想自己是否有能力将全
部地形都用完,有没有合适的剧情来填充庞大的地形,其实有很多很经典的地图有的都是
极小型的地形的,如小猪保卫战。而大地图当然也有,比如本人的最终幻想的两个作品用
的都是最大的地形设置,当然,在这之前也是要充分考虑好每一块地形的使用的!
3.创建适合自己RPG地图的单位、技能和物品等!一张RPG地图都是有自己的个性
的,这就在自定义单位、技能和物品上得到了充分体现。如果是一张角色扮演图,你得设
计自定义单位的职业,名字及称谓等,甚至还得弄出相应的技能及物品。而对于生存一类
的,你要考虑的则是单位的技能是否真正有威力,物品是否能够满足游戏的需要!
4.游戏系统。这个就很多了,比如物品合成,升级,打宝,挑战等,这些主要是为了
丰富一张地图的而发展出来的,当然也可以吸引更多的玩家以及体现作者的制图水平,不
过在做一些游戏系统时也得注意是否和游戏相适合,有些系统如果做得很抢眼的话,反倒
会把你一张地图的主旨给遮蔽了!
总结
通过这两章的学习,各位可以说对WE都有一定的知识基础了,而在今后的学习中,
各位其实就是要专门去学习T了,毕竟T是有着很强大功能的东东,也是很多高手们一直
在研究的话题!而由于本人水平有限,能教给各位的也就只能是最基本的东西了,对于W
E而言,大家要想有提高还得靠自己钻研!本人的新手制图指导教程到此也就结束了,因
为下一步各位就算得上是进入了WE的进阶提高阶段,而此时各位可以去找其他相关的教
程学习了,因为大家有了一定的知识作为基础,剩下的就是针对专门的问题而进行学习了!
在此谢谢各位的支持,也希望各位能打造出属于自己的地图!另外,如果有需要的话,本
人还会继续做一些基础T的演示供大家参考学习,不过注意喔,只是弄基础的演示,而像
单体技能群体化或是多重物品栏等就已经超出了我的能力范围了!
最后一句,学习WE大部份要靠自己自学为主!
WE速成心得(单位篇)
作者:lq201313
第一次亲密接触
第一次打开WE,就是启动魔兽目录下那个没有图标的
问题:
1。启动后没反应:下载破解补丁。
2。下载破解补丁怎么用:解压至魔兽目录,覆盖原文件。
3。还是不能启动:如果你是在网吧,请换一台机子,如果你是在家,请重装磨兽。
4。以上做完还是不能启动:人品问题。
进入WE,面对WE的界面你会一下子茫然了,不要怕,现在听我的步骤:
步骤:
1。选中菜单命令拦中的窗口命令,将刷子表的勾取掉,这样开WE的速度会加快3
0%。
2。按一下F6,开启单位编辑。在这个编辑器中,你可以对单位,物品,魔法,魔法
效果,科技等等进行编辑。
3。按一下F4,开启扳机编辑trigger,也就是大家俗称的T。在这个编辑器中,你可
以对游戏的事件进行编辑。这个将在以后细说。现在选择游戏初始化这个事件,按Delete
键将其整个删除,这样这个地图将不再是对战地图,有助于我们测试地图。
初出茅庐
在这里我要详细介绍的是?单位编辑F6
步骤:
1。按一下F6,开启单位编辑,选中单位编辑中的单位编辑栏。
2。选中左边竖排的树状分支中的人类?对战?单位?人类农民。当你选中一个单位时,
在左边竖排就会出现这个单位的相关设定。
提示:
单位编辑栏中的树状分支放置了魔兽中所有可编辑的单位。
3。Ctrl-C将此单位复制,然后Ctrl-V粘贴,这时一个复制的农民创建在自定义单位
的目录下,现在我将对一些主要,用处大的设定进行讲解。
图象类
模型文件:单位的模样,动作。
提示:
1。WE中几乎所有的图形都可以当作单位的模型文件,这样我们可以将单位的模样改
成鲜花,建筑,冰山,光影,魔法效果等等,如果你想使用自定义模型,那么就选种自定
义选项,然后输入自定义模型路径,如果你输入的路径是错误的,那么单位在游戏中将会
没有图形,也就是看不见的单位。
2。如果你想将剑圣的样子换成牛头的样子,可以选中剑圣模型文件设置项,然后Ctr
l+C将其复制下来,再在选择牛头的模型文件设置项,用Ctrl+V粘贴。
染色:修改模型文件的颜色。
提示:
用3种颜色来设置:红,绿,蓝。可以输入0?255之间的整数,比如:红255,绿0,
蓝0那么单位将以红色为主;红255,绿0,蓝255那么单位将以紫色为主。如果联合模
型文件的修改,我们可以制造出重所未见的图形。
缩放值:修改模型文件的大小
选择缩放:就是点他时出的圆圈大小
提示:
可以将单位放大或缩小10-0.01之间。
图象-特殊的:单位爆炸而死时的效果,血肉横飞呀。
声音类
单位声音设置:设置单位的声音。
战斗类
允许攻击模式:设置单位攻击的模式,有4种模式可以选择:
1。没有?选中后,单位将不能攻击,游戏中单位的攻击按键也将不存在,如:强攻键
A。
2。攻击1?选中后,单位将按照攻击1的相关设定来进行攻击。攻击2同理。
3。所有?选中后,单位将同时拥有攻击1和攻击2两种攻击模式。
提示:
如果攻击1是近战对地,攻击2是远战对空,那么就会出现对地时是近战,对空时是
用远程攻击。但是在目标允许的选项里有重叠的话则只发挥攻击1里的数据的作用
武器类型:设定单位是近战攻击还是远程攻击。
1。没有-没有攻击模式,不能近战也不能远程。
2。立即-攻击动作与伤害同时发生。
3。普通-近战攻击模式,设定后投射图像设置项将无效
提示:
普通-近战攻击模式,也可以设定很远的攻击范围。这样的攻击效果和远程差不多,
只是没有投射图像。
4。炮火-就像投石车一样,只能打一片。对于新手来说这个模式还太复杂。我就不多
说了。
5。箭矢-远程攻击模式,设置后投射图像设置项将起到作用。
6。箭矢(反弹)-远程攻击模式,但可以反弹攻击多个单位。
7。箭矢(直线/穿刺)-远程攻击模式,但可以穿刺攻击下个单位。
伤害骰子数量:和攻击力底线有关:最小攻击=基础伤害+伤害骰子数量。 2 WE速
成心得(单位篇)
伤害骰子面数:和攻击力高线有关:最大攻击=基础伤害+伤害骰子数量*伤害骰子面
数。
基础伤害:设定基础伤害。
基础防御:设定基础防御。
目标允许:允许可伤害的单位类型。
提示:
1。空中、地面、建筑、守卫是4大类,如果选只选了这4项就能够攻击绝大部分物
体。这4项必须至少选一项,否则单位就无法战斗。
2。A组:中立、敌人、玩家单位、结盟的。
B组:别人的、自己的。
C组:古代的(应译为古树)、非古代的。
D组:可攻击的、无敌的。
E组:有机的、机械的。
F组:死亡、活的。
G组:英雄、非-英雄。
H组:自杀性的、非-自杀性的(有生命倒记时的单位:比如水元素,先知的狼)。
各个组内是或关系,即满足其中一个就可执行,而各组间是且关系,即有满足所有的
条件才可执行,比如A组中选择空中,G组选择英雄,那么因为英雄是地面单位,所以不
满足条件,不能攻击。
3。目标允许就是允许可伤害的单位类型,单位类型中有地面,空中,敌人,盟友,自
己,英雄,非英雄等等,如果:将地面打勾,那么无论远程攻击,还是近战攻击,都只能
进攻地面部队;如果:将英雄打勾,那么只能进攻英雄。
投射图像:设定远程攻击模式下的箭矢图象。只对远程攻击模式有效。
提示:
1。配合攻击模式,可以做出打地面单位是一种箭矢图象,打空中单位又是另一种箭矢
图象的效果。
射弹速率:箭矢图象运动的速度。
提示:
1。只有当箭矢图象击中单位后,单位才受到伤害,如果攻击速度高,射弹速率低,就
会出现一大串的箭矢慢慢的向目标单位移动~_~!。
射弹弧度:就是箭矢的抛物线轨迹。
远程:就是射程,一般一个屏幕宽2000左右。
攻击间隔:就是攻击速度。
技能类
技能分为三类:单位技能,英雄技能,物品技能。这一类,将在技能编辑章节细说。
单位技能:指不用学习和升级的技能。只要单位身上设置了单位技能,那么此技能就
默认为1级。
主动技能:就是英雄技能,只对英雄单位有效,是指可以学习和升级的技能,当英雄
生级后可以加点。
单位特性类
这一类因为比较简单,我就不一一说明了。
目标作为:设置单位的类型。作用参考目标允许,一般默认就可以了。
移动类型:设置单位可行走的区域。
1。步行/盘旋/骑马:不能下海和爬山。
2。漂浮:可以在水上行走。不能爬山。
3。飞行:能下海和爬山。
4。没有:单位的行走不受任何限制,任意穿行单位或阻碍。
触碰体积:可以点中单位的范围,也就是单位所占的空间。
最后,关掉单位编辑器,回到WE的主窗口,在菜单命令拦中的窗口命令中开启单位
窗口。这时会弹出一个单位窗口,在单位窗口中默认显示的是PLAYER1,人类,对战的单
位,现在将对战改为自定义,我们最开始的哪个单位显示出来了,然后将单位放在地图上,
按F9或用鼠标点WE菜单命令拦中红色小勾就可以进行测试了。
作为一个菜鸟,如果你能将以上的介绍弄清,那么WE你就算扫盲了。
今天就贴到这里,下次发送技能编辑。
WE速成心得(技能篇)
作者:lq201313
再接再厉
如果你看过了单位篇的介绍,相信你对WE已经不是那么陌生了把,所以现在我们就
开始对魔兽中的技能进行探究。在开始前我要阐明为了照顾新手,我对技能只进行较易懂,
较狭义的讲解,并且只对技能的共同特征进行讲解。
首先技能分为3类,单位技能,英雄技能,物品技能。
1。单位技能:技能无须学习,不能主动的升级,只要单位拥有技能就可以使用。
提示:
1。单位技能无论你设置多少级,一但放在单位身上都默认为1级,但这并不是说单
位技能的等级没用,在以后的触发篇(Trigge)中,我们可以通过触发器来变换技能等级。
2。英雄技能:技能可以学习,可以主动的升级,只在英雄发挥作用,一个单位一般只
能拥有5个英雄技能。
3。物品技能:技能无须学习,不能主动的升级,只要单位拥有带有此技能的物品就可
以使用,只在物品发挥作用。
提示:
在魔兽中3类技能没有明确的类别限制,各个技能的类别可以通过设置进行改变。也
就是说,英雄技能一样可以设置为单位技能,单位技能一样可以设置为物品技能等等,这
样我们使各类技能之间的特性变为共性。
首先,我们一样要进行一些步骤。
步骤:
1。打开WE,按下F6开启物体编辑器。
2。点击技能编辑栏,在右边出现的树型分支中选择人类?英雄?专注光环。
3。Ctrl?C复制,Ctrl?V粘贴,出现一个专注光环技能在自定义分支中。
图象类
光影效果:设置光影类效果,如:死亡之指的红色闪电,先知的连锁闪电。
提示:
1。光影效果的特点就是在2个点之间创造1个闪电型效果,什么叫闪电型效果?就
是像闪电一样可变化长度且快速传导的效果,它的启始点是释放单位的位置,终止于目标
单位的位置。
2。不是任何有启始点和终止点的技能都可以设置光影效果,能拥有光影效果的技能有
连锁闪电,死亡之指,医疗波等等。
3。大部分可以设置光影效果的技能只能有1种光影效果,如:死亡之指,法力吸取
等,但个别技能可以有2种光影效果,如:连锁闪电,医疗波等,这种技能的光影效果的
分为主要和次要两部分,主要的就是施法单位和第一目标单位之间的光影效果,次要就是
上级目标单位和下级目标单位之间的光影效果。但如果只设置1种光影效果,那么就默认
主要和次要的光影效果都是同样的。
动画名字:设置单位释放技能时做出的动作,一般共有的动作为:attack(攻击的动
作),walk(行走的动作),stand(站立的动作),spell(释放魔法的动作),death(死
亡的动作)等等,我们可以在WE中查找自己想要的动作。
提示:
1。有些单位是没有上述的动作的,因为各个单位模型文件中的动作不一样,动作名字
也不一样。
2。在WE中查找单位的动作,可以通过WE中窗口命令中的单位面板来查找,开启
单位面板,在单位面板中找选出想要的单位,这时在WE左边的物体观察窗口中会显现单
位,可以动作的单位就会显现相关的动画,以及动画名称。
3。有些动画有一些参数,如Attack - 1,Attack - 2,Attack Slam,Stand victory
等等,我们在设置动画时应这样设置,如:Attack - 1,设置成:
│attack │
│one │
再如:Stand victory,Attack Slam设置成:
│stand │ │attack │
│victory │ , │slam │。
图标?关闭:设置可开启或关闭的技能开启后的图标,如:圣骑的无敌开启后的图标。
图标?普通:设置技能图标。
图标?研究:设置学习技能的图标,也就是加点时的图标。
图象?目标:设置释法后,目标单位的技能图象效果。也就是在你施法的目标上显示一
个图象模型文件。
提示:
1。图象?目标只能针对有明确目标的技能,也就是单体技能。一般只能设置1个,多
了无用,但个别技能可以设置多个。
2。图象?目标的技能图象效果是不会持续的,只能存在很短的时间,有多短?也就是
1次图象效果动画的时间,如你设置的图象模型文件没有动画,那么将不会显示。 2 WE
速成心得(技能篇)
3。图象?目标的设置使我们可以随心所欲的改变施法时在目标单位上显现的图象效果,
换句话说,它可以使我们的技能更COOL,比如:我们可以将圣骑的神圣之光技能的图象?
目标设置成圣骑的复活技能的效果,这样在使用神圣之光给盟友加血时,会有个光柱或天
使从天而降的效果。
图象?目标附加点:设置图象?目标的图象效果可以在目标单位上创建几个。最大为6,
最小为默认0,这个0不是代表无,而是与图象?目标设没设置有关,没设置在大也没用,
只要设置了图象?目标,就会有图象被创建。
图象?目标附加点1:设置第一个目标图象创建在目标单位身上的位置。图象?目标附
加点2/3/4/5/6:同理。
提示:
1。新手对于图象?目标附加点也许很难理解,举个例:当我们得到物品闪电球时,会
有个闪电球在我们的武器上旋转,这个就是创建了1个闪电球的动画图象在单位武器上,
他的附加点就是weapon(武器),而我们中了暗影突袭的毒后头上就会有个黑色小鬼,这
个小鬼的附加点就是overhead(头上),这样也许你会好理解些。
2。由于附加点是个十分庞大字符串库,所以我在此引用长风长歌的解析:
主要部位:
overhead 漂浮在单位的头顶上,但不随单位的动作而晃动
head 在单位的头上,并随单位头部的动作而晃动
chest 在单位的胸部 ,并随单位胸部动作而晃动
origin 预设,就是在单位的位置上,不会晃动
hand 手上(有时和在武器上很难分清)会随手动
foot 脚上 会随脚动
weapon 武器上 会随武器动一般在武器的半截位置或尖端
sprite 游符,小精灵(只对建筑、机械单位及英雄血法有效)也就是围着血法转的球
体,配合下面的first second third fourth fifth sixth使用,但不是所有建筑或机械都有
这六个位置,这六个位置对于不同事物是不同的。用时可以自己测试。若没有修饰默认为
first
medium 中间(只对建筑有效)配合下面的first second third fourth fifth sixth使
用,测试结果是最后一种部位有效。
large 全体(只对建筑有效) 同上
mount 坐骑(只对有坐骑的有效,说明的见下面举例)
rear (对四足动物或有坐骑的有效)就是他们的屁股位置
部位位置修正:
left 左边(如hand left=左手,输入left hand也是)
right 右边
rallypoint 集结点,但是这个集结点是指默认集结点位置,不会随你在游戏中的点选
而改变
具体搭配挺多大概有:
left chest,right chest,left mount,right mount,left hand,right hand,left rear,righ
t rear,mount rear,left foot,right foot,weapon left,weapon right
举例:拿人族骑士来说吧(因为他几乎所有部位俱全)特效是旗帜
origin-在身体偏右侧地面上,会随骑士移动移动,单不受他的修饰性动作的影响
hand=right hand/hand right-在右手,手举起时旗帜会挥动
left hand/hand left-在左手,同上
head-在头上,扭头时旗帜也动(没有left head与right head)
chest-向前进时胸部前倾,旗帜也是
left chest=left mount=mount left=chest left、right chest=right mount=moun
t right=chest right:身体一侧,会随身动
left/right:在左/右前腿,会随腿动而动
rear=right rear:在右后腿(马的腿)
left rear:在左后腿
mount:在马头上
mount rear 马屁股上
foot= (right foot )=right
left foot=left
weapon left(不可写left weapon):左手武器尖端
weapon=weapon right:右手武器
此外1 没有overhead left//origin left等语句
2 如果使用了错误语句如:left eye只会从左到右执行有意义部分即left;若写成了e
ye left则什么也不执行。
最后在说一句,不是所有的单位都有以上附加点的。
箭矢技巧:设置释放技能时发出的箭矢图象。
提示:
1。此项其实就和单位设置中的箭矢图象一样,就是你射出技能击打目标的图象。如:
死亡缠绕投出的哪个骷髅。如果我们将此项去掉,那么此种技能将看不到射出的图象,这
对我们编辑某种急发技能很有帮助,如:我们将山丘的风暴之锤的箭矢技巧删除,在设置
图象?目标为季风,这样就会看见一道闪电从天而降击中目标,然后目标就被击晕。还是一
个COOL
作者: binaire 2005-11-6 08:05 回复此发言
--------------------------------------------------------------------------------
3 WE速成心得(技能篇)
2。不是所有的技能都可以设置箭矢技巧,需要原技能有的才可以用。
箭矢速度:设置箭矢技巧的飞行速度。这个还是我在单位篇中说的,如果太底,等你
第2个技能发出来时,你的第一个技能还没击中目标了。
图象?按钮位置?关闭?X:设置可开启或关闭的技能开启后图标的横排位置。也就是技
能图标在单位命令栏的横排位置。
图象?按钮位置?关闭?Y:设置可开启或关闭的技能开启后图标的纵排位置。
图象?按钮位置?普通?X/Y:设置技能图标的位置。
图象?按钮位置?研究?X/Y:设置学习技能时技能图标的位置。
提示:
1。技能图标的位置具体如下:
│X0,Y0│X1,Y0│X2,Y0│X3,Y0│
│X0,Y1│X1,Y1│X2,Y1│X3,Y1│
│X0,Y2│X1,Y2│X2,Y2│X3,Y2│
2。技能与技能图标位置之间最好不要重叠,这样技能也许会看不见。如果位置重叠,
技能会隐藏,但被动技能一样发挥作用,这提示我们一个隐藏技能的方法。但他不是100%
的有用,这也许是WE的一个BUG。
图象?施法者:同图象?目标,只是它作用在技能释放者头上。
状态类
影响区域:设置技能的作用区域。
提示:
1。此项只对圆周面攻击技能有作用,如:牛头的战争践踏,山丘的雷霆一击,各种光
环技能,对牛头的震荡波技能无作用,对于震荡波一类的面攻击技能,在他的数据类设置
项里有相关项可设置。
2。此项的原理是设置以施法者为圆心的攻击圆形区域的半径大小,一个屏幕的宽度差
不多是2000左右。
所定允许:设置技能可对其施法或作用的单位类型,可参照单位篇中的所定允许。
提示:
1。关于技能的所定允许,我说可以参照单位篇中的所定允许,并不是说它和单位篇中
的道理一样,小小的改动是可以的,但是当你想对技能的所定允许进行大幅度的改变时,
你照着单位的所定允许改是不行的,因为每种技能的所定允许是WE事先设置定的,也就
是什么样的技能就会有什么样的所定允许,就好像ID一样,在这里他的所定允许的ID改
变或混乱了,这个技能都不会达到你要的效果。所以这时我们就要找和我们想要的所定允
许差不多的技能,将其所定允许复制下来进行粘贴,再在最小范围内进行改变。
持续时间?单位:设置技能对普通单位持续的时间。
持续时间?英雄:设置技能对英雄持续的时间。
提示:
1。持续时间只对有持续效果的技能有作用,比如:圣骑的无敌时间,山丘的风暴之锤
击晕的时间,暗影突袭中毒的时间等等,对与没有持续效果的技能此项无作用。
2。持续时间为0时并不是没有,而是永远持续,直到单位死亡。所以最短魔法效果
时间都是0.01秒。
3。持续时间还关系着魔法效果的时间(魔法效果将在下面讲解)。
物品技能:设置此技能是物品技能。False为假,True为真。
英雄技能:设置此技能是英雄技能。False为假,True为真。
提示:
1。如果以上2项都为False,那么此技能就为单位技能。
特效:设置技能特效效果,就是一种图象效果。
提示:
1。特效只作用与可设定持续时间且面攻击的技能,如:先知的地震,巫妖的死亡凋零
等。
2。特效只作用在施法的区域,不在单位身上出现,如:先知地震升起的火山,巫妖死
亡凋零的那一片暗影。
3。换掉或去掉特效都不会影响技能的作用,只是图象效果变了,比如:将鹿子的宁静
特效换成先知的地震,那么在施展宁静时,就会是地震的图象效果,但还是宁静在作用。
4。特效是可以具体编辑的,如:我们可将巫妖死亡凋零中的暗影换成圣骑的神圣之光
或巫妖的霜之星星。这样可以个性化我们的技能,创造新的技能效果。它的具体编辑过程
是:
a.在物体编辑器中选择魔法效果栏,在左边的树状分支中找到你要编辑的特效(你可
以使用编辑中的查找命令来寻找),记住是特效不是魔法效果。
b.选种想要编辑的效果后,右边会出现相应的设置项,现在你可以自己编辑特效了,
但一般特效的附加点请不要改变,因为特效是作用在区域的效果。
作者: binaire 2005-11-6 08:05 回复此发言
--------------------------------------------------------------------------------
4 WE速成心得(技能篇)
c.最后在你的技能中起用你编辑的特效。
魔法效果:设置技能魔法效果,就是一种图象效果。
提示:
1。魔法效果只作用与可设定持续时间的技能,如:圣骑的无敌,山秋的风暴之锤,巫
妖的死亡凋零,各种光环技能等
2。魔法效果只在目标单位身上出现,随目标单位移动而移动,是持续显示的,持续时
间和持续时间项有关,如:圣骑无敌的光罩,山秋风暴之锤击晕单位的晕圈,巫妖死亡凋
零单位头上的黑色小火(一般人没注意)
3。换掉或去掉魔法效果都不会影响技能的作用,只是魔法效果变了。如:将圣骑的专
注光环的魔法效果换成吸血光环,那么各个单位就会呈现吸血光环效果,但作用的还是专
注光环。如去掉魔法效果,一般的技能看不到魔法效果,但部分技能的部分效果一样出现,
如暗影突袭每秒出现中毒的伤害(真是阴魂不散呀)。
4。魔法效果是可以具体编辑的,方法同特效的编辑。在这里要说明的是魔法效果和特
效在编辑中不同的是,特效编辑中的图标在游戏中没用,而魔法效果的图标就会在单位的
状态栏中显示出来。
等级:设置技能可有几级。
提示:
1。此项一般只有英雄技能有意义,因为单位技能无论你设置多少级,他都只有1级
有用。
2。并非单位技能无用,我们可以用触发编辑器设置其等级的变化,将在以后的触发篇
中说明。
3。物品技能完全没用。
要求等级:设置英雄学习技能需要的等级,只对英雄技能有效。
跳级要求:设置技能学习的跳级要求,默认0为每2级可学习。
魔法释放时间:设置在发出魔法前等待的时间,也就是让你的单位将动作做够在释放
魔法。典型代表:血法的火。
魔法释放时间间隔:设置魔法释放后恢复的时间。
魔法释放范围:设置技能施法单位和目标单位之间可距离的范围,如果你想做BT的技
能,把这个改高点就可以吓死人,如:大家看过在自己基地用死亡凋零打对方基地的巫妖
吗。
魔法消耗:设置技能施展需要的魔法值。
科技树?是否使用:设置技能使用是否有科技限制。若有,技能就必须完成相关科技的
建造才能使用。
科技树?要求:设置用来限制的科技。
科技树?要求?等级:设置用来限制的科技还必须达到的等级。
提示:
1。如果你在做RPG地图,一般可以将科技类的限制全去掉。
写完以上后,大部分人也许还是对技能感到很茫然,这是肯定的,因为我只讲了技能
的共性,而各个技能的特性却未讲分毫,不是笔者偷懒,而是WE中的技能上百?量大,但
都浅而易懂?简单,所以我若在此一一点到,未免烦琐了些。为了生动大家对技能的理解,
激发大家对技能的研究,我就试做几个技能给大家看看:
技能1:一个面攻击的霜之星星。
原形技能:山丘的雷霆一击。
步骤1:将雷霆一击图标和名字改为霜之星星。
步骤2:将雷霆一击图象?施法者去掉
步骤3:将雷霆一击持续时间改为2秒。
步骤4:在物体编辑器技能栏中找到霜之星星,将其图象?目标项复制下来。
步骤5:在物体编辑器魔法效果栏中找到雷霆一击魔法效果,在它的图象?目标项粘
贴。
步骤6:把雷霆一击魔法效果的图标去掉。
步骤7:将技能赋予英雄,放上些敌方单位测试。
如果你成功了,你可以试试用大法师的暴风血技能改改。
技能2:一个群体攻击的死亡之指。
原形技能:先知的连锁闪电。
步骤1:将连锁闪电图标和名字改为死亡之指的图标。
步骤2:将连锁闪电的2个光影效果改为死亡之指。
步骤3:将连锁闪电图象?特别的改为死亡之指图象?特别的。
步骤4:对技能的相关数据进行修改,攻击力改高。
步骤5:将技能赋予英雄,放上些敌方单位测试。
如果你成功了,你可以试试用加纳的叉状闪电技能改改。
技能3:降低敌人防御力的光环。
原形技能:圣骑的专注光环。
步骤1:将专注光环的图标和名字改为你喜欢的名字。
步骤2:按住Shift双击(这样允许你输入负数)专注光环数据?装甲奖励在里面输入-
100
步骤3:在物体编辑器技能栏中找到减速光环(使用编辑中的查找命令查找),将减速
光环设置中的所定允许复制,粘贴到你的专注光环所定允许中。
步骤4:在物体编辑器魔法效果栏中找到专注光环魔法效果,将里面的图标换成你设
置的图表,相关介绍也换成减防光环的介绍。
步骤5:将技能赋予英雄,放上些敌方单位测试。
如果你成功了,你可以试试邪恶光环等其他光环。
以上的例子只是小小的变化,但我们却可以从中找到一片森林,也可以说WE中的每
一个技能都是片森林等待着你动用想向力发现。
最后我们联系我们在单位篇中的内容,我们来做一个效果。
效果:当一个单位攻击敌人时是正常效果,强攻友军时发出医疗波对目标进行加血
我们只运用物体编辑器来做这个效果................
JASS语言教程
前言 jass语言概述
0. 教程对象
本教程适用于没有接触过计算机语言的人。由于jass非常简单,所以对学过一种中高
级语言的人完全没有难度,而本教程对j语言的各部分都介绍的比较详细,所以没有必要
学。如果只会用行号的basic(不包括vb、vbscript、ASP)的话,那还是看看这篇教程
吧(不过可以略过很多部分)。
如果是完全没有接触过编程的话,建议第一遍通读,大体掌握jass语言的结构,然后
再由基础到高级一步步的提高。
基础篇是对于语言的基本结构的介绍,首先要掌握好里面的关键部分,打好这个基础
后,可以跟随高级篇里面的范例一步步的学jass的应用。
1. jass的特点
jass语言是一个语法非常简单的语言,语法结构上比较接近basic,同时也引用了许多
c的东西。
2. 如何学习和使用jass
在trigger editor窗口中,我们可以很容易的把一个t转成j,方法是Edit(alt+e)->C
onver to Custom Text(x),然后我们就可以在已有的j的基础上进行编辑。
由于we里的文本编辑器功能不够丰富,另外,we的容错机制比较差(j的错误太多
容易导致直接关闭),所以这里推荐两个专门用于jass编辑的工具:jass editor(汉化版)
和jass workshop(by soarchin)。两个工具各有各的特点,后面会在涉及到的部分提到。
另外还需要得到cj和bj两个接口函数库,这个在je和jw中均有提供
3. jass和trigger的关系
在地图编辑过程中,绝大多数用j能够完成的东西也能够用t来完成。事实上,所有的
t最后都会转化成j,trigger只是面向we的独特体系。具体的说,war3提供的API有c
ommon.j和blizzad.j两个文件,其中c.j是纯粹的接口,而blz.j是对cj里面接口函数的
封装,主要面向trigger editor,t生成的j代码中,绝大多数函数都是bj里的。
4. 为什么要学习j
a.用heavylock等工具压缩后,trigger和j面向we的部分被删除了,只留下script.
j里面干净的j部分,为了研究别人的map,就要能读懂别人的代码;
b.t虽然能完成几乎所有的功能,但是对于内存释放和另外一些功能实现的能力太
差;
c.虽然t看似是一个语法结构完整的可读性比较高的语句,但是因为常常语句太长导致
可读性大大下降,而j可以更方便的体现逻辑性,事实上j的可读性更强;
d.用j可以写出比t效率高很多的代码,当然这是在对计算机工作原理比较了解的前提
下。
第一章 jass基础
0. 本章概述
本章介绍jass语言的最基本内容,包括注释、基本数据类型、变量、数组、基本运算
符、运算的优先级、常量、基本运算法则
首先在这里说明一点,jass是区分大小写的,也就是说,jass不会认为“a”和“A”
是同一种东西
-----------------------------------------
1. 注释(comment)
注释符号://
不论是we的语法检查器还是war3,“//”之后该行的内容将被忽略
-----------------------------------------
2. 数据类型:
jass虽然不大,但是提供的功能足够丰富,共提供了6种基本数据类型:
1) integer : 32位有符号整数型(4byte) 取值范围:
[-2147483648, 2147483647] (2^31+符号位)
2) real : 实数型(单精度浮点型,4byte) 取值范围:[1.5*10^(-45), 3.4*10^38]
3) boolean : 布尔型(1byte) 记录 true(真)或 false(假)
4) string : 字符串型(不定长) 用来记录字符
5) handle : 数据指针型 是jass语法的一个基础类型,相当于passcal中的pointer
类型,由它可以派生出其他数据类型的指针。用来指向内存中的一个数据地址
6) code : 函数指针型 用于指向内存中的函数地址
* 其他数据类型: 1.16有81种,1.17又新增5种,都是由继承handle而来,在
common.j最开始的部分,
声明形式如下:
type ****** extends handle //此处即使不是handle,也是其他由handle继承而来
的类型
-----------------------------------------
作者: 我爱不死族 2005-11-6 21:41 回复此发言
--------------------------------------------------------------------------------
2 JASS语言教程
3. 变量:
知道了jass的基础数据类型,下面我们要了解如何使用这些数据。首先就是要对数据
进行存取,基本的办法就是使用变量。什么是变量呢?就是war3在运行的时候在内存中
申请一块数据空间,用来存取数据的。
1) 变量的类型:分全局变量和局域变量两种,在j中最常用的是局域变量
2) 变量的命名:
首先要给变量一个独特名字,作为这个变量的标志,以便在以后的使用过程中访问。
变量名称必须以英文字母开头,变量名中可以包括:大小写英文字母(A~Z, a~z)、
数字(0~9)、下划线(_),其它符号会被认为非法(不要用中文命名变量名)。
we会自动给全局变量加上“udg_”前缀,在jass中使用全局变量的时候直接手动输
入“udg_”前缀即可访问全局变量。
第二章 jass语法结构
0. 本章概述
本章介绍jass语言的基本语句,包括判断、循环、判断和循环的嵌套、数组
-----------------------------------------1. jass的判断语句
与大多数的语言一样,jass使用了if作为判断语句。jass的if与passcal的判断语法
相似(这里不得不b4 basic一下,赋值与判断相等居然都使用“=”,否则的话这里把basic
也加进去了)。语法:
a)
if 判断式 then
...
...> endif 当 判断式 的值为 true 的时候,执行语句 若出现else,则为当 判断式 的值为 true 则执行到 else 之前的语句,否则的话,执 行 else 到 endif 之间的语句 if 判断式 then ... elseif 判断式 then ... elseif 判断式 then ... ...> endif 实现多重判断,不做更多的解释了。 -----------------------------------------2. jass的循环语句 一般的语言会提供for循环和loop循环两种循环,另外还有结构化语言中不提倡使用 的goto这个转向语句。for循环实际上是一种最简单情况的loop循环,而靠goto控制 的转向可以用loop来完成。遗憾的是jass没有提供另外两个循环中非常方便的关键字 continue和break,不过靠if和exitwhen也可以完成的。语法: loop ... exitwhen 表达式 ... ... endloop 当表达式的值为true的时候,退出该循环。需要说明的是,可以有不止一 个exitwhen,并且exitwhen可以在loop中的任意位置。在使用循环的时候,要注意避 免死循环。所谓死循环,就是一直循环下去不会满足退出的条件,这在使用loop循环的 过程中非常常见,例如: set i=1 loop exitwhen i>5 ... //中间忘记了set i=i+1 endloop war3有针对死循环的容错机制,当达到一定循环次数的时候会自动退出 function,也就是说endloop后的语句不会被执行。 -----------------------------------------3. 判断与循环的嵌套 往往一个判断或者一次循环不能够满足我们想要做的事情,这个时候就涉及到了嵌套。 嵌套不难理解,就是在一个判断或循环中,使用了另外一个判断或循环,如: loop ... if ... then loop ... endloop else if ... then ... endif endif ... loop ... endloop endloop 为什么要把嵌套单独拿出来讲一节,就是因为对初学编程的人来说,使用嵌 套的时候常常会出现一些错误。一旦出现了嵌套,一定要先结束里层,然后再结束外层, 如下面的语法是不正确的: loop if ... then ... endloop ... endif 可能看到我前面写的东西,各位也比较喜欢空格了吧。在循环和判断的时候用 空格来缩进,这样能够更直观的现实逻辑关系,使代码的可读性大大加强。但是缩进也可 能导致一些主观的判断错误,例如: if ... then ... if .... then ... else ... endif 在储存的时候这段代码会报错。问题比较容易,自己看吧(j需要endif的语法 结构事实上能够比较好的避免大多数问题,像在c里面考试还会常常出这类的题hoho)。 -----------------------------------------4. 数组的使用 有些时候,你会不会觉得一些重复的操作很烦呢?比如把一个单位身上的物品丢在一 个地方,过一段时间之后再放回身上,例如: local unit u = GetTriggerUnit() 3 JASS语言教程 local item item1 = UnitItemInSlotBJ(u, 1) local item item2 = UnitItemInSlotBJ(u, 2) local item item3 = UnitItemInSlotBJ(u, 3) local item item4 = UnitItemInSlotBJ(u, 4) local item item5 = UnitItemInSlotBJ(u, 5) local item item6 = UnitItemInSlotBJ(u, 6) ... 这种时候,我们可以用一个array(数组)来表示一组东西。1) 数组的声明: 数组也是变量,所以也有全局和局域之分。全局的数组只要在全局变量的设置中,把 array勾上就可以了,实际上是在变量的声明过程中,在变量类型和变量名称之间加入array 关键字: local item array items* 补充:在全局变量的声明中,还有个size选项,那个选 项实际上是假的,只是你自己输入一个数字提示自己这个数组应该有多大而以。jass为了 防止mapper不熟练使用数组产生的bug,采用了自动增加数组长度的方式。2) 数组的引 用: 使用方括号“[]”作为数组的索引,如访问index=1的变 量 set item[1] = CreateItem(...) 数组索引的最低值为0,最高值俺没测试过,不过估计没 谁那么疯狂,不断的往数组里面添东西。 结合if判断和loop循环,数组可以减少我们大量的重复工作。------------ ================================================= 《jass使用教程?高级篇》 ================================================= 第三章 过程、函数,Trigger与指针 0. 本章概述 本章设计到jass语言中更复杂的一些东西,熟练使用好这些东西,你将体会到更多作 图的乐趣。从本章开始,我会尽量结合自己在作图的一些经历,配合范例讲解j的实际应 用 ----------------------------------------- 1. function概述 结构化语言的特点就是,使用判断、循环和独立的过程来完成所有的功能。function 是一段用来完成一个独立功能的代码,使用好j,就要学会用好function 1) function的构成 一段function,由声明、函数体两部分构成: function 名称 takes [nothing | 参数列] returns [nothing | 返回类型] //声明 ... // 函数体部分 endfunction //标志一段function的结束 2) function的分类 a) 过程与函数 在passcal中,声明一段函数只用这个关键字,而声明过程则用另一个关键字;在c 中,则直接使用变量类型来声明函数,可以把无返回类型的函数(void类型)理解成过程。 我在这里沿用passcal的概念,将不返回值的函数定义为过程。 b) 常函数与变函数 常函数返回一个固定的值,而变函数则根据参数的不同和函数体内的运算。常函数是 在function的声明前加constant关键字: constant function c) API与自定义function API(Application Programming Interface,应用程序接口)是指包含在common.j 中的函数,该部分函数实际上是一些已经由系统封装好的函数,用户只要知道function名、 功能、参数,就可以利用这部分function做到自己想要做的事情,通常API是实现用户无 法通过自定义function来实现的功能,在cj中,API的声明形式如下: native CreateItem takes integer itemid, real x, real y returns item 自定义function是指用户在使用过程中,自己定义的一些过程或函数,如我们用到一 个地图初始化的trigger中注册trigger的部分: function InitTrig_MapInit takes nothing returns nothing set gg_trg_MapInit = CreateTrigger( ) call TriggerAddAction( gg_trg_MapInit, function Trig_MapInit_Actions ) endfunction 3) function的参数 在function的声明中,takes与returns之间的部分为参数部分。 nothing关键字表示无参数。传递参数的时候,要写明传递的参数的类型和参数在函 数过程中的名称,如传递几个参数,不同参数之间用逗号(,)隔开: 4 JASS语言教程 a. function **** takes integer i returns **** //传递一个integer型参数 b. function **** takes real x, real y returns **** //传递两个real型参数 b. function **** takes nothing returns **** //不传递参数 4) function的返回值类型 返回值类型是在声明中returns后面的部分。 如使用nothing关键字,则表示不返回任何数值,该function为一个过程。函数只 能有一个返回类型,可使用任何在cj中声明的变量类型: a. function **** takes **** returns integer //返回integer型 b. function **** takes **** returns nothing //过程 ----------------------------------------- 2. function的使用 1) 过程体与函数体 过程体由变量声明、代码两部分组成。变量声明部分是对本地变量的声明,前面已经 介绍过,用local关键字来声明 函数体除了过程体以外,还需要有返回函数值的语句,这是函数与过程的区别。 2) function的可见度 只有一个function在前面已经声明过,后面的代码才能使用这个function。一个 function对整个map都是可见的。 3) 调用function,传递参数,在function中使用参数,取得函数返回值 我们定义了一个function,那么如何在后面的过程中使用呢? 对于过程和函数,都可以使用下面的方法来调用: call 名称(<参数列>) 参数列中参数的数量必须与声明中的数量相同,并且类型一一对应,如有一个函数: function xyz takes integer a, real b, string c returns integer ... endfunction 我们在调用这个函数的时候,必须如下形式传递: call xyz(1,0.5,"c") 传递的参数可以是数值(如1 0.5 "a"等)、常量(如bj_PI、UNIT_STATE_LIFE等)、 变量。在function使用参数的时候,直接使用声明function时候的变量名称: function *** takes integer i, integer j returns *** local integer a = i + 1 set j = j + a .... endfunction 需要说明的是,参数的传递都是按值传递的,假如有这样2个funciton: function add1 takes integer i returns nothing set i=i+1 endfunction function b takes nothing returns nothing local integer t = 1 local force foc = GetPlayersAll() call add1(t) call DisplayTextToPlayer(foc, I2S(t)) call DestroyForce(foc) set foc = null endfunction 那么函数b的最后在屏幕上的显示结果将是“1”,换句话说,add1函数在创建的时 候,首先申请了一个整数的空间并命名为i,然后把b函数传递来的值复制给i,在add1 函数使用完毕之后,i的数值被销毁,而b函数传递的t的值并没有改变。 这样的话,我们如何得到函数的计算结果呢?通过返回值!如上一段函数,把add1 改为: function add1 takes integer i returns integer return i+1 endfunction 其中,return就是返回语句。return有两个功能,第一是推出函数,第二是返回函数 结果。在过程中,可以不使用return,但是一旦使用,不能接任何参数;在function中, 至少要有一个return加返回值用来返回函数值。调用函数时,不加call则返回函数值,也 就是说,我们可以把调用的函数看成一个变量: set i=add1(i) call DisplayTextToForce(GetPlayersAll(),add1(i)) call add1( add1(i) ) * 注意: return的参数不是用括号(“()”)来传递,而是用空格。因为return后面的语句都 不会被继续执行,所以常常被用来提前退出function。 * 补充: 得到函数返回值的速度要比变量慢很多,所以不推荐使用常函数。 4) function的执行过程 当我们在一段代码a中调用function b的时候,a会首先把参数传递给b,然后把控 制权交给b,b把所有的东西都处理完之后,再把控制权交回给a。也就是说,一条语句调 用一个function,就意味着只有那个function所有语句都执行完毕之后,才会继续运行 调用语句后面的语句。 前面已经说过,function是线性运行的,而trigger是并行运行的,那么假如我在做 一个既能的时候,想要生成一个范围内的效果。但是如果在程序中用PolledWait执行的时 候会发现,实际上的时间没法和真实的技能效果时间对应上,那么怎么解决呢? 一般的方法是另外做一个trigger用来产生效果,在技能触发了t之后,使用来显示效 果的t生效,然后再在本段t中进行伤害,到了一定时间之后在将那个效果t禁止。 用j的话,我们可以利用trigger的工作原理,将两段代码合并在一起。 首先,我们需要一个使function立即执行并不等待function结束的功能,下面介绍 这个功能的实现: // 参数用来传递一个function function RunFunctionAsTrigger takes code cFun returns nothing //申请一个居于的trigger,因为我们只要求这个trigger运行一次,所以不需要全局 变量 local trigger trg = CreateTrigger() //把参数传递来的function作为新创建的trigger的action call TriggerAddAction(trg, cFun) //立即触发这个trigger,实际上就是让function作为另外一个进程运行,不需要等 待执行结束 call TriggerExecute(trg) //由于这个trigger已经在运行中,我们不再需要它了,所以马上毁掉这个trigger, 并释放内存 call DestroyTrigger(trg) set trg = null endfunction 第二步,我们要想要在一定范围内持续出现一个效果,那么这个效果应该是每一定时 间出现的,所以要创建第二个基础函数。另外考虑到,这个trigger持续一段时间后怎么 结束呢?所以要让这个function有返回类型: //传递一个function的参数,一个real型是说明多少秒之后执行,bool型说明是否 只执行一次 7 JASS语言教程 function RunFunctionAsTriggerWithTimer takes code cFun, real timeout, bool ean periodic returns trigger //与前面的过程一样,只对变动部分进行讲解 local trigger trg = CreateTrigger() call TriggerAddAction(trg, cFun) //给这个trigger注册一个事件,这个函数的意思就是用于多少秒的时候执行,是否只 执行一次 call TriggerRegisterTimerEvent(trg,timeout,periodic) //返回我们做好的这个trigger return trg endfunction 准备工作已经做好了,以后实现类似功能的时候,我们都可以调用这两个函数。使用 j的好处就是,我们可以把大量重复的工作封装成function,用到这个功能的时候,只要 调用这个function就可以了,而不用一遍一遍的复制,做重复的工作。 下面的是在一定范围内不断产生lich的frost nova的效果: //用来产生效果,围绕一点(udg_fFSLocX,udg_fFSLocY)(两个都是全局变量),产生 一个效果 function FSEffectWithTimer takes nothing returns nothing //随机产生一个x和y,可以看成近似一个圆,因为出现在这个圆之外是个小概率事件 local real x = udg_fFSLocX+GetRandomReal(0,400)*SinBJ(GetRandomReal(-18 0,180)) local real y = udg_fFSLocY+GetRandomReal(0,400)*SinBJ(GetRandomReal(-18 0,180)) //产生效果 local effect eff = AddSpecialEffect("AbilitiesSpellsUndeadFrostNovaFro ",x,y) //等待2秒 call PolledWait(2) //销毁效果,释放内存 call DestroyEffect(eff) set eff = null endfunction //用于在技能中拿来RunFunctionAsTrigger的 function FrostSpaceEffect takes nothing returns nothing //把效果函数注册成每0.1秒运行一次,即每0.1秒产生一个效果 local trigger trg = RunFunctionAsTriggerWithTimer(function FSEffectWithTim er, 0.1, true) //等待5秒 call PolledWait(5) //摧毁效果trigger,释放内存 call DestroyTrigger(trg) set trg = null endfunction 好了,现在你可以做一个技能,然后把上述的jass放到里面,看看效果如何了:) >>>>>>>>>>>>>>>>>>>>>>>>>>> 束 <<<<<<<<<<<<<<<<<<<<<<<<<< 结 <<<<<<<<<<<<<<<<<<<<<<<<<< 例 2 >>>>>>>>>>>>>>>>>>>>>>>>>>> 范 在这个范例中,我将带大家实现一个多重物品栏的功能。 准备知识: 在war3种,blz为每个unit和item都提供了一个integer型的UserData,让各位 mapper可以很方便的做一些事情(有点像windows标准控件的tag属性)。 思路: 首先是要在hero使用技能的时候触发这个trigger,然后把hero身上的item移走物 品,下次的时候再把物品取回来,所以我们要给物品创建一个数组来保存。一个物品栏有 6个物品,每个hero有n1个物品栏,又有n2个hero,可是jass只提供了1维数组, 怎么做呢?聪明的你一定想到了x*a*b+y*b+z的办法,的确这样,我们就给每个hero一 个特定的整数标志,每个物品栏一个数字,这样就可以了。下面是利用unit的userdata 的实现方法。这个方法共支持8个物品栏 全局变量: integer udg_iUnitIndex //用来使每个unit有独特的id item array udg_itemGoods //用来存取所有的物品栏中的物品 函数: //unit物品栏ID:使用userdata的1-3 bit;共支持2^3=8个物品栏,如果想再多的 话,就把里面的数字乘以2就可以得到16个了 //用来读取物品栏id: function fiGetUnitDataGoodsID takes unit whichUnit returns integer //由于只是用0~7这几个数,所以我们只要去modulo(模,可理解为余数)就可以 了 return ModuloInteger( GetUnitUserData( whichUnit ), 8 ) 8 JASS语言教程 endfunction //用来存放物品栏id: function pSetUnitDataGoodsID takes unit whichUnit, integer newData returns nothing local integer it = GetUnitUserData( whichUnit ) //新的id只要用newData再加上原来的数字除以8的整数部分乘以8就够了 call SetUnitUserData( whichUnit, ( it/8*8 + newData ) endfunction //Unit - UnitID:7~ bit;用来记录单独的Unit function fiGetUnitDataID takes unit whichUnit returns integer //只要整数部分就可以了 return GetUnitUserData( whichUnit )/8 endfunction function pSetUnitDataID takes unit whichUnit, integer newData returns nothi ng local integer it = GetUnitUserData( whichUnit ) //将新的数字乘以8之后,再加上余数部分就可以了 call SetUnitUserData( whichUnit, newData*8+ModuloInteger( it, 8 ) ) endfunction 下一步,我们要设定一个全局变量,在每个hero出现的时候,加上这么两句: set udg_iUnitIndex = udg_iUnitIndex + 1 call pSetUnitDataID( udg_iUnitIndex ) 然后是unit切换物品栏的action: //得到当前的unit local unit u = GetTriggerUnit() //得到下一个物品栏的id,由于只是0~7这几个数字,所以只要在每次+1之后取除 以8的余数就可以了 local integer index = ModuloInteger(fiGetUnitDataGoodsID(u)+1,8) //得到userdata,由于这个data已经有独立的unit的id和item的id,所以不用分 别取了 local integer id = GetUnitUserData(u) local integer i = 0 local integer it //保存当前身上的物品,并丢在隐藏的地方 loop exitwhen i>5 set it = id*6+i //设定物品为当前物品栏第几栏的物品 set udg_itemGoods[it] = UnitItemInSlot(u, i) //移到地图隐蔽处 call SetItemPositionLoc(udg_itemGoods[it],udg_locItemTemp) call TriggerSleepAction(0) //使物品无敌 call SetItemInvulnerable(udg_itemGoods[it],true) //使物品不可见 call SetItemVisible(udg_itemGoods[it],false) set i = i + 1 endloop //设定下一个物品栏标号 call pSetUnitDataGoodsID(u,index) set id = GetUnitUserData(u) set i = 0 //取回物品 loop exitwhen i>5 set it = id*6+i //使物品可见 call SetItemVisible(udg_itemGoods[it],true) //使物品不无敌 call SetItemInvulnerable(udg_itemGoods[it],false) call TriggerSleepAction(0) //放回物品栏 call UnitAddItem(u,udg_itemGoods[it]) set i = i + 1 endloop * 补充: ModuloInteger是bj函数: function ModuloInteger takes integer dividend, integer divisor returns intege r local integer modulus = dividend - (dividend / divisor) * divisor if (modulus < 0) then set modulus = modulus + divisor endif return modulus endfunction 前面介绍过if语句的速度要比运算满很多,因为我们这个函数里面不涉及到负数,所 以在这里我们可以自定义一个自己的函数: function MyModuloInteger takes integer dividend, integer divisor returns inte ger return dividend - (dividend / divisor) * divisor endfunction >>>>>>>>>>>>>>>>>>>>>>>>>>> 结 束 <<<<<<<<<<<<<<<<<<<<<<<<<< ----------------------------------------- 3. 指针变量 在jass中,有50多个继承自handle类型的指针类型变量。按照习惯handle翻译成 句柄,但是我觉得这里的句柄不是太符合句柄的含义,还是用更根本的pointer更适合, 所以我就直接称之为指针类型了。 9 JASS语言教程 前面已经说过,指针用来指向内存中的一块内存区域,这块区域有可能是个自定义类 型的变量,有可能是一个function(code),有可能指向一个复合的单位(如unit,包括 在we中看到的所有数据,这种类型应该是war3中最复杂的)…… 在使用指针类型的时候,我们不能进行数学运算,只能通过API函数来存取。而在war3 中,所有的单位都是只给一个句柄,如unit、item、region、camera……在给指针类型赋 值的时候,大多数的函数过程是这样的: 首先分配给这种指针类型所指向的实体类型申请一块内存空间,然后把照着参数把相 应的资料给这个实体变量,然后再返回这个变量在内存中的地址,也就是指针变量,最后 这个被赋值的变量指向那块内存地址。如果在一段函数中使用了指针类型得到了一个值, 使用完之后不做任何处理的话,那块被占用的内存虽然不会再使用了,但是由于前面已经 申请了,所以系统会认为这块内存是被占用了的,不会再动用这块内存空间,这就是所谓 的内存泄漏问题。 t虽然能够完成绝大部分的功能,但是对于内存处理这部分却是无能为力。例如存在最 严重的就是location变量的内存泄漏问题,虽然一次才8个字节,但是常常我们一次性就 使用了大量的location,导致时间越长,内存泄露越多。用j的话,就一定要记住: 释放内存! 什么样的变量需要释放内存呢?我们可以在je的搜索栏输入destroy和remove, destroy中的绝大部分都是需要释放内存的(也有少部分一旦释放,就是去了我们原来想 要的效果了,例如fogmodifier类型),remove中location是一定要释放的,region和 rect就要根据具体情况了,否则也会跟fogmodifier出现一样的情况,这些东西就要靠经 验了。 最后要说的是,既然指针变量要用API,那么应该怎样得到自己想要的函数呢?最好 要先对jass的API有一定的了解,例如soarchin写的API函数介绍(本教程不会提供jass 的API函数介绍)。在最开始使用的时候,可以利用we的t,现做一个自己想要的语句, 然后转成j,把语句拿过来用??不过要注意的是,trigger编辑器使用的绝大部分是bj里面 的函数,最明显的是带有BJ后缀或者Swap(ped)后缀,一般都会有对应的cj函数,而两 者几乎无差别(这个最好用jw来看)。等熟练一些之后,你就会发现一些blz的命名规则 了,如判断一个unit,就是IsUnit***,得到unit的一个什么东西,就GetUnit****,设置 就是SetUnit***,想要得到一个group,就GetUnits***,得到force就GetPlayers***…… 总之这个要靠经验的,旁边开着个金山词霸,基本上就能把一个函数的功能猜个八九不离 十。当然,最好还是看看jass API的中文介绍,这个最保险,然后可以照着别人的jass学 习。了解了jass的动作原理后,你会发现通过jass来学习别人的东西要比看别人的trigger 来学习快很多??我经常是把t的演示先转成j然后再看的。 WE1.18 / 1.20 免Cd补丁下载地址 WE V1.20 免CD补丁(中英文各版本通用)(本补丁需要在升级了官方V1.20升级档 之后再使用): [url]/newpatch20/[/url] WE V1.18 免CD补丁(中英文各版本通用)(本补丁需要在升级了官方V1.18升级档 之后再使用): [url]/newpatch19/[/url] =POEM=宝宝 2005-12-25 05:06


发布评论