38 123
发新话题
打印

[原创教程] 教你如何从t过渡到jass中来,再更新一层楼(081024)。

教你如何从t过渡到jass中来,再更新一层楼(081024)。

想想作为jass区的斑竹,不能起到良好的带头作用,让jass如此下去,学的人都没有。

    遍观大部分的jass教程,都是直接开始就从代码讲起,让很多人不知所云,所以想来还是自己写篇教程,也好留下点什么。

    说到jass,我们首先想到的就是一排一排的英文字母,而且英文这东西向来是大家深恶痛绝的东西,让很多人打了退堂鼓,其实在我眼中看来,就是一些函数,加上参数,然后被凋用而已。

    通过这篇教程,我的目的是让大家能在we中使用自己编辑的函数,至于以后更高级的东西,已经有很多的教程了,我也可以偷个懒,不用写了。

    jass中使用最多的是函数,而说到函数,它的出生到使用的过程“定义-参数-主体--被调用”。函数的功能由主体实现,

    终于发现教程这东西有多难写了,一天了憋出个这东西7" />7",先公开吧,以后再补充。

   这里是everguo的jass教程总汇,也可以直接看这个,如果你看得懂或有足够耐心的话。

上面我说的大家可以看不懂,没关系,下面让我来一步一步的让大家从不懂到会点在到自己写函数。

由于我是写给那些没有学过编程的人看的,学过编程的人不需要看我这个教程,这个教程我只介绍怎么做,而不说为什么这么做。

谁把八楼的做出来,加加,拒绝高手来骗分。

  • 2楼:全局变量在触发器中的基础应用
  • 3楼:从t的语句说jass
  • 4楼:关于用局部变量替换全局变量,以及全局变量的局限
  • 5楼:一般触发的jass语句的结构
  • 6楼:一些与函数有关的理论,开始写自己的函数
  • 7楼:实战
  • 8楼:如何移植jass代码
  • 21楼:如何在jass中加你想加的相关的触发语句
  • 37楼:快速查找想要的函数的一点方法


这里有一个触发语句和jass语句对应的UI,想学jass可以尝试下。 编辑器汉化UI.rar (597.97 KB)
然后就是bj和cj的函数列表 bj_cj.rar (71.37 KB)

本帖最近评分记录
sure,this means nothing.

TOP

用we是做技能是一件很快乐的事情,而用触发做复杂点的技能的话,你不得不用到变量,对于GUI来说,我们能使用的变量只有一种,那就是全局变量。

        全局变量的定义,我在这里以最常用的两种全局变量来说,一个是单位,一个就是点。

        下面让我们从一个基本的触发技能入手,学习全局变量的使用。可能大家对这个都很熟悉了,但是我不得不讲,因为这是一个jass的基础东西。
如图所示,按步骤建立两个全局变量。



        建立好全局变量以后,就可以在触发中使用,在这里,新建一个触发器,名字为ceshi,一个完整的触发分为三部分,分别是事件、条件、动作。
        触发的意思可以描述成这样“一件事情的发生,在一定的条件下,导致了另外一件事情的发生”。

        比如说:一个鸟人在天上飞行的时候,被一架飞机给撞了,结果翅膀受伤,不得不送到医院去救治。

        如果把这件事作为一个完整的触发,那么
                事件:鸟人撞机
                条件:翅膀受伤无法飞行
                动作:只好住院

        相信大家可能有了个初步的了解,那么我再举一个和魔兽更接近的例子。

        尤迪安向泰兰德求爱,结果被玛维这个sm女王看见,醋意大发,誓要追杀尤迪安千里之外。

        这个又该写成
                事件:尤迪安向泰兰德求爱
                条件:其实玛维也爱尤迪安(这什么乱七八糟的)
                动作:命令玛维使用吃飞醋技能,攻击速度提高1000%,移动速度提高522,三围提高到99999、99999、99999。
                      等待1秒
                      命令玛维对尤迪安使用暴头攻击

        好了废话太多,下面让我们进入正题。

        在触发中将第一个事件完整的表现出来。当然我们不可能象上面的那么写。于是就成了下面这样。

        在这里面还没有使用到我们刚刚定义的两个变量。所以我们在接下来就是把代码进行改造,将变量用起来。

        如图所见,代码被我们修改了后,就可以使用了。你可以在代码中使用鸟人,mubiao,它们代表的是一个人,它们这一刻灵魂附体。

如果我们不加那两段语句,后面的语句仍然会运行,但是已经看不出任何效果了。因为mubiao它不是任何一个单位,在代码中它叫null,就是空,就是虚无,虚无做的东西还是虚无。
1鸟人撞机.w3x (16.82 KB)
sure,this means nothing.

TOP

上面一部分想来大家已经是相当的了解了,我在这里提出来,主要是一个过渡的引导,下面继续。

从上一部分,我已经说了变量和触发的一些常识,从这一个部分开始,我们将会逐渐转换到jass中来,将t转换成jass可能大家都知道,就是点编辑-转换为自定义文本,然后我们编辑的触发全部都成了jass,注意这个动作在jass代码被修改后无法逆转。

        如果我们不想转化为jass却又想看jass的代码该怎么办?在这时候,自定义脚本就能为我们解决这个事情,动作里面第三行的custom script。在触发中新加一条代码,自定义文本中写一个错误的jass表达式,比如我可以输入“jass i love you.”,然后点触发左上的初始打开,把勾去掉,然后再点上,出现了什么?啊呀呀,弹出来一个对话框,里面全是英文,而且居然发现里面还有“jass i love you.”这句话,好到此完毕。这素用错误代码主动弹出错误看jass的一个步骤。


        继续从该行往上看,我们会看到这样的代码,这三句代码分别完成了触发中的三句的功能。
[jass]set udg_mubiao = GetTriggerUnit()
set udg_dian = GetUnitLoc(gg_unit_nfoh_0004)
call IssuePointOrderLocBJ( udg_mubiao, "move", udg_dian )
[/jass]
        这三行的每一句都对应着触发的一条对应的语句,怎么样,这个参照很明了吧。

        如果你还想这个触发能使用的话,把自定义代码删掉吧,再把允许的勾勾上。

附件

2看jass代码的东西.w3x (16.58 KB)

2008-4-16 20:07, 下载次数: 22

sure,this means nothing.

TOP

从现在开始,我们要直接抛弃t语句,直接将触发转换为jass语句,因为这部分讲的是局部变量,所以我们不但要在这个教程中抛弃t语句,而且还要将全局变量一并抛弃,好吧,我们开始使用局部变量。

        局部变量和全局变量一样,在使用之前是一定要声明的,而且必须在函数的第一行开始定义,我把它写出来。我们在触发中用了多少的全局变量,就要在函数中定义多少个变量来替换它。
[jass]local unit niaoren = null             //这个变量是单位类型
local location yiyuan = null                    //这个变量是点类型
[/jass]
                在这里,解释一下,local的意思就是该变量素函数的局部变量,这个是定死了的,记住就行了,第二个“unit”和“location”分别表示这个局部变量的类型是一个单位和一个点,第三个niaoren和yiyuan则分别代表这个局部变量的名字,以后你要使用这个局部变量,你就得用它。

        在这里我们将把这两个声明的局部变量替换掉我们原来定义的两个全局变量,上面说了全局变量在jass中是要加上一个udg_开头的前缀,所以前面两个变量的名称在jass中分别为“udg_danwei”,“udg_dian”,我们在jass代码中查找这两个东西,用niaoren替换udg_danwei,用yiyuan替换udg_dian。不用担心出错,出错了找我。

        可能有人会问,不就是替换全局变量,可是有什么用呢?恩,那我再做个小实验。

        新建一个触发,事件中输入“玩家1输入字符包括jass完全匹配”,然后复制一份该触发,在事件中分别写上这么个东西。好吧,进入游戏,我们会看到一个什么样的东西呢?




3替换全局变量.w3x (17.08 KB)

运行结果:

为什么会出现这种让人错乱的东西呢?那素因为LOOP A 其实是预先定义好了的一个全局变量,当一个事件触发了两个动作,而一个动作中将A增加设为10,却在另外一个动作中被设为100,我加了等待语句,让两个动作执行时间重合了,就出现了这么个东西。
所以在触发中用全局变量的话,很容易发生冲突,而用局部变量就不会有这种问题。









下面这个图是给大家测试用的,里面有两个全局变量“dafashi”,“xuemofashi”,请将触发转成jass后,将全局变量替换。
注意这两个变量都是单位,所以需要定义两个局部单位变量。
替换全局变量的图.w3x (16.5 KB)
sure,this means nothing.

TOP

怎么说了这么久才到第四部分?
这部分说的是t转换为jass后的结构,好吧,我们还是用原来的例子,这里是转换后的代码。

[jass]//这部分是触发的一个条件判断函数
function Trig_ceshi_Conditions takes nothing returns boolean
if ( not ( GetEventDamage() > 200.00 ) ) then
return false
endif
return true
endfunction

//这部分是触发的动作函数,这个地方一般来说是我们添加代码的地方,刚刚我们已经将全局变量替换为局部变量了
//下面这个素我们要替换全局变量的东西
function Trig_ceshi_Actions takes nothing returns nothing
local unit niaoren
local location yiyuan
set niaoren = GetTriggerUnit()
set yiyuan = GetUnitLoc(gg_unit_nfoh_0004)
call IssuePointOrderLocBJ( niaoren, "move", yiyuan )
endfunction

//这部分是触发的一些初始化函数,里面包含了触发的声明,事件注册,条件添加,事件添加等一系列的代码
//这部分一般来说可以无视,因为你转换成jass后就基本上不会再动它了。我们主要需要修改的部分是触发的主体,动作函数。
//===========================================================================
function InitTrig_ceshi takes nothing returns nothing
set gg_trg_ceshi = CreateTrigger( )
call TriggerRegisterUnitEvent( gg_trg_ceshi, gg_unit_nhrq_0000, EVENT_UNIT_DAMAGED )
call TriggerAddCondition( gg_trg_ceshi, Condition( function Trig_ceshi_Conditions ) )
call TriggerAddAction( gg_trg_ceshi, function Trig_ceshi_Actions )
endfunction
//===========================================================================[/jass]


代码由三个部分组成,这三个部分都是函数。
sure,this means nothing.

TOP

我承认,我前面说的基本上可以说是废话,5555,因为我还不知道怎么把这个教程转为jass的。下面让我门更深入吧。


函数是什么东西?

我们可以把它想象成一个机器,我们给它足够的材料,它就能为我们生产出一件东西,或则能对某些东西进行处理。
再具体点,我把它说成一个绞肉机,然后将一头猪塞进去,出来的就是一条火腿肠,可能比较浪费,但能出来就好。在这里,绞肉机就素函数名称,猪就是绞肉机这个函数的参数,也就是原材料,火腿肠就是绞肉机这个函数的返回值。

参数又是什么东西?

正如我说过,参数就象绞肉机的原材料,当然不可能是一头真正的猪,它只能是we中预先规定好了的变量类型。

变量类型又有哪些?

在讲变量前,请先做一道简单的数学题。。。。。。。。。。
如果我有一个苹果,你有一个苹果,我们把苹果拿出来,有几个苹果。请用方程解答。

解:
设x等于我的苹果数,那么x=1。
设y等于你的苹果数,那么y=1。
那么我们的苹果数z=x+y=1+1=2。
答:我们一共2个苹果。

这题可能有点脑残,但它可以表示一个变量的定义和使用的过程。

现在我们用jass来描述这个解题的过程。
[jass]local integer x = 1 //恩,这是我的苹果数量,integer表示它是一个整数
local integer y = 1 //y就是你的苹果数量
local integer z = x + y //大家的[/jass]

我们继续这个脑残的话题。
如果我有x个苹果,你有y个苹果,我们把苹果拿出来,有几个苹果。请用方程解答。

解:
x等于我的苹果数
y等于你的苹果数
我们的苹果数z=x+y

答:我们一共x+y个苹果。

让我们用函数的方法把这个题解出来
[jass]function add takes integer x,integer y returns integer
local integer z
set z = x + y
return z
endfunction
[/jass]

不知道大家理解了点什么没有。



接下来我们将前面祈祷的绞肉机的操作过程用代码描述出来。

首先,我们需要什么?绞肉机、和原材料,对。那么开始准备吧。


绞肉机
[jass]function jiaorouji takes nothing returns nothing

endfunction
[/jass]
原材料,就是一头猪的说
[jass]local unit zhu[/jass]

最终产物
[jass]local item huotui
[/jass]
然后我们要怎么把猪塞到绞肉机里呢?这样写?

[jass]function jiaorouji takes nothing returns nothing
local unint zhu
endfunction[/jass]
那当然是不行的了,因为zhu这个变量成了局部变量了,这里我把他说成一个绞肉机的零件,所以我们应该这么写。
[jass]function jiaorouji takes unit zhu returns nothing //takes unit zhu表示这个函数需要一个单位作为原料

endfunction[/jass]
但是因为return nothing,如果硬要翻译成中文的话就是‘返回没有什么’,就是‘没有什么返回啦’,所以zhu进去了后,什么都不吐出来。

然后,火腿又该从那里出来呢?
[jass]function jiaorouji takes unit zhu returns item
local item huotui
return huotui //return表示这台机器造出的东西是huotui
endfunction
[/jass]
因为魔兽不能真正的让一头猪变成火腿,所以我们只有删除zhu,再创建一个物品,恩,就是火腿啦。

好吧下面继续写代码。
[jass]function jiaorouji takes unit zhu returns item
local item huotui //将火腿定义
call CreateItemLoc( 'modt', GetUnitLoc(zhu) ) //凭空在猪的位置变出一个火腿
call RemoveUnit(zhu) //把猪人道毁灭
set huotui = GetLastCreatedItem() //然后这个火腿就是最后的产物
return huotui //然后我说这个火腿就是猪被绞后留下的东西
endfunction[/jass]

这个东西就素绞肉机了,然后我们需要的是将这个机器使用起来,那么我们在触发动作函数中把它加上吧,我们把一头可爱的小猪给绞了,让它变成一根火腿。

可能你会说,你那地方的绞肉机是火腿进去,变成猪出来。。。。。。。。。。。。。那么我满足你吧。
[jass]function jiaorouji2 takes item huotui returns unit
local unit zhu
call CreateUnitAtLoc(Player(0),'npig',GetUnitX(GetTriggerUnit()),GetUnitY(GetTriggerUnit()),0)
set zhu = GetLastCreatedUnit()
return zhu
endfunction[/jass]
sure,this means nothing.

TOP

光说不练素不行滴,下面我们来开始写自己的代码,并在动作函数中调用它。


先在t中将事件和条件写好


然后转化成jass


最后把我们的绞肉机加上并在触发的动作函数中调用


你可能会说,这绞肉机也太简陋了吧,没关系,能用就可以了。

附件

test.w3x (19.09 KB)

2008-4-17 19:19, 下载次数: 23

sure,this means nothing.

TOP

下面是我做的一个地图的jass代码,当然我不会打开地图然后截图给大家看,所以我直接把它给拷贝出来了,现在我要把它做到一个地图中,具体步骤如下。。

这里面一共有8,9个函数,但是能用的,有效果的东西就那么4个,而且里面只用了一个全局变量,游戏缓存(udg_gamecache)。
复制内容到剪贴板
代码:
call  CreateEwsp(-700,0,700,0,0,100,'e001',0,90,0,90,3,36,400,8,0.04)          //创建一个空间圆的函数
(x坐标,y坐标,高度,red,green,blue,单位类型,垂直翻转速度,垂直翻转初始角度,绕z轴旋转速度,z轴初始偏移速度,自转速度,马甲数量,圆圈半径,持续时间,timer周期)

call fire('h002',-1200,-400,24,500,8)                                         //类似喷泉的一个函数
(单位类型,x坐标,y坐标,马甲数量,半径,持续时间)

call wall('h002',-1200,-400,24,500,8,2)                                       //类似围栏的一个函数
(单位类型,x坐标,y坐标,马甲数量,半径,持续时间,下点的跳数)

call creatline(tru,'e000',12,40,50,10,0.04,120,50,10,30)                      //这个素飘动的红丝带
(触发单位,马甲类型,数量,角度偏移,间隔,持续时间,timer周期,初始高度,高度增量,初始大小,大小增量)
然后,由于函数中用到了马甲,所以要对马甲进行设置。

1,如图,我修改的是小精灵,把马甲基本要具备的技能给加上。


2,修改好了后,按ctrl+d,将界面转为代码形式。记住小精灵的代码,‘ewsp’。


3,然后我们来创建唯一的一个全局变量‘gamecache’,就是一个游戏缓存啦。



4,再后,将缓存创建之,看图。



5,再将代码拷贝进自定义代码区。




6,然后,最后,也是最关键的一步,我们要写个触发来测试前面的步骤是否对了。




这个是中心中的中心,代码文件。 mymap.rar (2.19 KB)


图我就不发上来了,大家照前面的步骤做就ok了。
sure,this means nothing.

TOP

楼主难的啊~~~自己在编写JASS教程.我看了楼主编写的JASS教程!触发是看懂;但JASS方面的一点也看不懂啊!?怎么办?楼主!我只是一名刚接触JASS的菜鸟~~连新手水平都没有!我该从何学起呢?(我现在的心情就像是----蛇咬乌龟-无从入手!)
团结就是力量

TOP

我就是在为怎么样尽量写得简单点伤脑筋
sure,this means nothing.

TOP

加油。。。偶看好你哦~~

TOP

要好好理下思路,不然写太乱了。
sure,this means nothing.

TOP

高亮好了   你把代码的缩进调整下

我相信只要大家努力    一定能把JASS推广开来
“风的精灵啊
  请转告泰兰德
  说我很好地遵守了承诺
  然后长眠于此”

像尤迪安一样无法得到族人认同,无法得到所期待的爱情,但我更要像他那样勇敢、坚韧、能够为爱付出一切,勇往直前的战斗下去……

TOP

...恩..恩   
和期待...
孤独的天才,寂寞的守望.
何时才是终点.

在每个漫漫深夜,我都在努力着.
我要成为最强!

TOP

我眼都花了

TOP

 38 123
发新话题