冰块 发表于 2008-7-12 15:25:57

冰块教你学JASS(好累,休息下..)

本人第一次做教程,加上接触JASS的时间也不长,所以如果教程有误人子弟之嫌.还请论坛的大大们帮助修改.
   首先希望大家可以通过我的教程能够帮助大家快速的掌握JASS.在看教程前,大家也先耐下性子,其实学这个只要坚持一下,很快就能学会.毕竟是很简单的脚本语言.一般在1-2天内能够掌握基础应用不成问题.JASS的重头还是之后的自己在实践中领悟,正所谓:"师傅领进门,修行靠自身么."好了话也不多说了...下面正式开始教程了..

第一章 JASS 变量篇
    变量就顾名思义就是指可以在程序运行过程中能够改变的量。
    首先我们了解下JASS为我们提供的变量类型:
WE中变量名JASS中变量名中文变量名Boolean boolean 布尔型IntegerInteger整数型Realreal实数型String string 字符串型Timertimer计时器Timer Windowtimerdialog计时器窗口Unit unit单位Unit Groupgroup单位组Pointlocation点Playerplayer玩家Player Groupforce玩家组Itemitem物品Special Effect effect特效Dialog dialog对话Dialog Buttonbutton按钮Destructible destructable可破坏物
这个表格里的变量类型不是很全面,本人比较懒。

当然在WE里还有一些变量类型,比如Order(命令)Ability(技能)Unit Type(单位类型)等,其实可以在全局变量声明区发现这些变量都属于integer(整数)变量。

上面的表格中,橙色标注的变量,是基础变量,这些变量在函数使用过程中不需要手动进行清除。除此以外,其他的变量其实都属于handle类型的子类型,这些变量在使用过程中需要对其进行清除。

下面说下变量的申明方法:
1.全局变量:全局变量申明必须在程序的最前端,使用globals,endglobls关键字对其进行申明。(但是在VJ中可以在任意区域申明,其实最后还是会把所有的申明调到最前面去)全局变量,听这个名字就知道,全局变量的作用范围是整个程序,你可以在任何时候调用。
申明方法如下
globals
integer a=123456//此为有初始值的全局变量
real b //此为是没有初始值的全局变量
real array c//此为数组全局变量的申明方式
endglobals

2. 局部变量:局部变量的申明,必须在函数的开始,使用local作为关键字。局部变量的作用范围是函数内部,不同函数中定义的同名局部变量是不会互相影响的。
申明方法如下
local real a=123456//此为有初始值的局部变量
local real b //此为是没有初始值的局部变量
local real array c//此为局部变量数组的申明方式

3.数组:数组其实是一组有序的相同类型的变量,通过数组索引,也就是中的数字来确定指定某一个元素。在WE中数组的下限是从0开始的,也就是说数组中的元素数量是N+1个。
申明方法:在变量类型后加上array就可以申明一个数组变量了。
数组元素赋值方法:
function A takes nothing returns nothing
local integer array a
set a=1//这样是正确的
set a=0//这样是错误的
set a=a//正确
endfunction

这一章就到此结束了。对于变量,其实只要了解一下就可以了,并不是JASS的难点,不用记住太多理论的东西,自己稍微练习一下就可以完全掌握了。

冰块 发表于 2008-7-12 16:43:52

第二章JASS 函数篇
第一节.函数的定义与调用

WE中分CJ函数也就是common.j中提供的函数..
还有BJ函数(blizzard.j) ai函数(common.ai)
不过ai不涉及在本教程当中
还有就是用户自己定义的函数..

CJ函数: 其实是提供了一些API(Application Programming Interface,应用程序编程接口),主要是完成一些不能由自定义函数完成的功能。
BJ函数:Trigger才用的函数..既然学了JASS..我认为就54这个吧...毕竟BJ函数写的很渣..效率低下....

当然学JASS的目的就是写自定义函数..
下面我们先学下 如何定义一个函数
这里用function,endfunction,takes,returns作为关键字..
基本格式是:
function 函数名字 takes 参数类型|参数名字 returns 返回值类型
endfunction
当然,参数和返回值并不是必须的。如果这个函数并不学要参数和返回值,可以写nothing

下面举个基本的函数例子,计算两个数的相加,并返回一个值:
function ADD takes real a,real b returns real
return a+b
endfunction
这个函数中大家看到takes后面跟了2个参数..分别是real型a和b,returns后面跟的是一个变量类型.这里是real

这里return的作用是返回值...需要注意的是return跟的表达式的类型 必须和函数申明里的一样..
比如这里需要的返回值是real,你就不能返回一个unit.
return还有一个作用就是结束函数.函数运行到这里..将直接退出..所以return一般是要写在函数的结束处..

然后既然函数写好了...那么我们以后就可以直接调用它了,不必每次这些东西了..这个就是函数的优点
就以这个为例子
调用这个函数的时候,你需要给它2个参数,他便会返回这两个参数的和..
调用函数用call作为关键字...
格式如下:
call 函数名字(参数)

这里要注意的是 参数 的个数和类型必须和定义的时候匹配

例子:
call ADD(1,2)
这个就是基本的函数调用方式.... 当然这个函数会返回一个实数值....这里会返回3...
这个返回值会随着参数给的不同而不同.

以上应该很好理解吧
接下我们就利用CJ函数写一个简单的函数吧
这里有一个技巧..
就是CJ函数 如果你不能很好的记住的话...(其实不用刻意的去记忆..慢慢熟练以后,自然会记住..BLZ的函数命名是有一定规则的)
你可以用T写出来后,转化为J....(具体操作为在触发窗口下 选择 编辑--转化为自定义脚本)
不过T中大部分都是BJ函数...
不过你可以用一些JASS编辑软件..查看此函数...如果是BJ函数...你基本可以在函数过程中找到同样功能的CJ函数(用某人的话来说就是BJ是阉割后的CJ)..不过要注意参数...
所以不要以英文不好来..给自己找借口了...

以下是一个例子:我们来做一个计算2个数的和并显示到屏幕的函数(这么又是计算2个数的和啊....不要不耐烦...基础很重要)
function ADD2 takes real a,real b returns nothing
local real c = a+b
call DisplayTextToPlayer( Player(0), 0, 0, R2S(c))
endfunction
这个函数中DisplayTextToPlayer便是一个CJ函数... 功能就是向指定玩家,指定屏幕坐标,显示一个字符串...
其实这个函数里还有定义了一个c...(其实不要也可以,目的是为了让大家看清楚)顺便温习一下局部变量的定义....

发现了吧...其实JASS很简单...不比T难多少....


本节就到这里了
下一节中将会介绍..函数中的基本语法....





冰块 发表于 2008-7-12 17:38:09

第二章JASS 函数篇
第二节.函数中的基本语法

这一节中,我们会了解...一下..JASS中的运算符和判断语句..

首先是算数运算符...(其实就和数学里的差不多..)
分别有 + - * / 这个很好理解..
当然一些特殊的运算..比如mod啊..不过这些都是由函数完成...
这个就不需要多做解释了...

然后是逻辑运算符
这些运算符是用来判断的...会返回true或者false
常用的有
<(大于) , <=(大于等于) , ==(等于) ,>(小于) , >=(小于等于) ,!=(不等于)

not(否定判断)比如 not(a<0) 的意思就是如果a不是小于0的话...就返回true,否则返回false
and 用于连接两个布尔表达式,判断是否同时成立 比如 a<0 and b<0 意思是如果a<0同时 b<0 此时返回true否则返回false
or 性质和and差不多..不过是判断有一方成立 就返回true..都不成立 才返回false

这里就涉及到 if 语句
这个语句在JASS中作用很大

接下来就看看如果使用 if 语句
格式如下:
if (布尔表达式)then
//A
elseif(布尔表达式)then 或者 else
//B
endif
这个的意思是...
如果 if中的表达式成立..
则运行A
否则如果else中的表达式成立
运行B
如果是直接用else的话
就是
否则直接运行B
中间关键字有 if ,endif ,else,elseif

接下来看个函数..
function takes real a ,real b returns real
if(a>=b)then
return a-b
else
return b-a
endif
endfunction

这个函数,的功能其实就是一个简单的计算两个数差的绝对值...
这个很简单大家自己体会下,就可以明白了...
我也不多说什么了.....

然后换种方式
function takes real a ,real b returns real
if(a>=b)then
return a-b
endif
return b-a
endfunction

写这个函数的目的是,说明return会结束函数..这个其实之前就说过了...这里温习一下

其实if语句就这么简单..但是功能强大

这一节就到这里了..... 我们下一节是重点...
要说到的是.....循环语句....不过真正的是要初次了解...强大的timer...

冰块 发表于 2008-7-12 19:10:02

第二章JASS 函数篇
第三节.loop语句和timerstart初探

本节要学习的是循环语句..也就是loop语句
还有一个就是timerstart 虽然这个不能算是循环语句 但是在JASS中timerstart的使用比loop要普遍的多...
timerstart的功能也强大的多.

教程开始..我先出个题目..
之前我们不是看到过一个CJ函数么...
DisplayTextToPlayer(玩家,X坐标,Y坐标,字符串)如果忘记了 请回到第二章 第一节去....
不过这个只能对一个玩家显示....如果我要想所有玩家显示...的话....怎么办到呢....
难道是..有多少玩家就写多少句DisplayTextToPlayer么...显然这很麻烦

没错 循环语句的作用就是来代替你做这些繁琐的事情....

好了...接下来我们做这个函数

之后我会解释下原理....

function A takes string s returns nothing
local integer n
loop
set n=n+1
call DisplayTextToPlayer(Player(n-1),0,0,s)
exitwhen (n==12)
endloop
endfunction

这个函数的功能是 向所有玩家...输出一段字符串到屏幕
这个就是一个很简单的....loop循环了
这样使繁琐的事情一下子就简单了不少....
首先参数是一个字符串型的参数...
然后再创建一个n
为何时退出循环的判断提供条件
好了之后就是loop了
进入循环后 就设置n=n+1
然后向(n-1)玩家显示(为什么是n-1呢..Player()函数中 Player(0)代表玩家1)
当n==12的时候
退出loop
这样这个简单的功能就实现了

好了如果你看懂了以上函数的话...

我们再来了解loop的书写格式吧(其实是你估计已经知道了)

loop
//一些语句
exitwhen()
endloop
其实loop并不是这一个固定格式...exitwhen可以在前也可以在后....在前的话就是先判断在做...在后就是先做在判断....这个看你的具体情况了......
好了loop语句就介绍到这里了.....

不过loop并不是一个十分常用的语句...
原因在于....loop循环是瞬间完成的......如果你做一个技能....要一个单位向一个方向移位的话....用loop就做不出来
因为你的单位会在一瞬间完成这个动作....你会看不到移位的效果.....
有人会说 加一个等待呢......

但是这里不得不说到等待这个函数...就是TriggerSleepAction()这个函数...
这个函数的效率..和精度都惨不忍睹.....(原因是据说是TriggerSleepAction()所在的线程和触发并不是一个线程...而且因为要到堆栈里读取数据..所以效率和同步性很差)
也就是说loop+等待并不能完成这个事情....
而且等待这个函数最好不要去用...简直是渣

所以这里就有了TimerStart()这函数,这个函数可以说是JASS中用的最多的函数了.....
所以我准备单独拿出来说....

这一节中先说下他的用法....用它的注意点和难点 放到下一节单独说了

这个函数分4个参数...分别 是 TimerStart(timer(计时器),real(时间),boolean(是否循环),code(函数))
作用是可以按照时间循环或非循环的运行某个函数...

例子:
function B takes nothingreturns nothing
endfunction

function A takes nothingreturns nothing
local timer t = CreateTimer()
TimerStart(t,0.01,true,function B)
set t =null
endfunction
这个就是 每0.01秒 运行B函数...

那么这一章就结束了
具体的使用...
将在第三章中花一章时间概述
第三章还包括伟大的Returnbug和游戏缓存的运用
所以第三章才是最重要的地方..

冰块 发表于 2008-7-12 20:30:05

第三章 综合篇
第一节.Returnbug

鉴于4楼的无理行为 我们不去理会...
教程继续!

大家一定觉得奇怪...上一章结束的时候我说过这一章是学TimerStart的使用和注意点的..怎么突然跳到.Returnbug了
其实这个是就是为了TimerStart做准备的......反正不要管这么多...学就是了.....

首先什么是Returnbug呢......我只能这么说...这是一个伟大的BUG(漏洞).....如果没有这个BUG..的话...JASS几乎和T无异....为什么这么说呢.....学下去就知道了...

首先了解Returnbug的原理
网上其实有很多帖子解释了原理,不过我还是说下吧....
先看一个奇怪的函数

function H2I takes handle h returns integer
    return h
    return 0
endfunction
前面学的用心的,一定知道我说过,return会终止函数..也就是说在return后的语句将不再运行...
但是这个函数很奇怪...竟然有两个return...

接下来 我来描述..原理
第一这个函数的参数是handle也就是句柄型的....
其次..这个函数返回的是一个整数值.....

如果你这么写这个函数.....
function H2I takes handle h returns integer
    return h
endfunction
在保存的时候肯定不能通过...因为之前我说过.....你返回的值得类型必须和你定义函数的时候一致....
但是程序就是程序....很傻....
你这么写通不过...
你就在后面加个return 0
因为这个检查机制...只查你最后一个return
所以你就通过了检查....

所以就不会出错....
但是其实这个函数运行到第一个return后就结束了
所以这样一来 又要他返回整数....
这个时候电脑没办法了...
只能强制把handle转换成integer 然后再返回值了....

所以出来的时候....就是一串数字了....这串数字 可以理解为...一个指针或者说地址一样....指向了那个handle型变量

这个就是一个Returnbug的实际例子..

不过这一节 我并不打算说他的用法....
因为这个放到后面用到的时候讲比较好....

所以本节就讲这些了

冰块 发表于 2008-7-12 21:13:48

第三章 综合篇
第二节.TimerStart

本节开始,学习TimerStart了。可能从这里开始,渐渐的有些比较困难的东西出现了...不过我会仔细的讲解的....反正看我之前的教程的..应该知道...我写的不过是函数还是文字 ...都是最基础的....如果你还是看不懂....那你去看别的教程...估计还要一头雾水....

在学之前...我想问下...大家开始想学....JASS的目的是什么......
我先说下 我学的目的....我那个时候做了很多技能...都是T做的...但是发现那些技能都不能很多人一起用...因为..你会发现...全局变量储存的值...会因为多人一起用了...产生出冲突....所以我决心要学J...
不知道大家是出于什么目的....

但是怎么完成多人用技能呢....
JASS中的方法,就是使用局部变量...
因为我之前说过 ...局部变量只在函数运行过程中....有效...就是说在这个函数外...电脑无法看见这个变量的...这样也就不会出现冲突了..

好了...你现在可能觉得....局部变量很厉害...
但是你之后就会感到...并不是这样....局部变量有优点...缺点也不少.....

说到这里...还是没有说到....TimerStart啊....
不要着急...现在我带大家..一起做一个击退效果...怎么样...
这个函数可能要比较长了...不过正好算是一个大练习.....
如果你能掌握这个....你这章就算没白学......
不过大家放心....我会一步一步做的......
绝对不会让大家看不懂...除非你真的是负数智商了!

那么现在开始吧..
首先...鉴于大家并没有学习如何建立一个触发...所以我暂时不加入触发内容....
我们把这个函数做成一个模块....(模块的意思...就像T里的功能一样...)

不过做之前....先想下...这个函数 需要什么参数呢......
我认为要
1.单位(那个单位要被击退)
2.实数(击退多远)
3.实数(击退的方向)
4.实数(击退的速度)

好了...就这样吧....

我们先写个 定义函数:
function JT takes unit a,real b,real c,real d returns nothing
endfunction


不要学我的样子给变量取名字哦...我这里只是做个示范...虽然我之前没说...但是变量名字还是要自己和别人能够理解.....
比如以英文...去名字..或者拼音也勉强可以....

突然有事请出去下.....回来再写吧......!!!!

冰块 发表于 2008-7-12 22:09:15

嘿...LS......你过分了哦.......

新鲜的可 发表于 2008-7-13 18:57:16

http://rs.phpwind.net/E___5455ZHYXPWFG.gif

奸熊 发表于 2008-7-14 06:32:24

支持下

血戮魔动冰 发表于 2008-7-14 16:25:51

………………………………………………
有VJASS教程吗?

奸熊 发表于 2008-7-14 16:28:17

搜索下论坛不就知道了

冰块 发表于 2008-7-14 20:43:19

话说...
昨天...为了升学的事情没有继续..
今天有去了学校...
刚刚才回来....
这个教程...
等我有了时间在补完吧.....

奸熊 发表于 2008-7-15 06:30:03

…………继续支持

mnbvcxzqwe 发表于 2008-7-19 18:13:22

希望继续发啊.看了你的演讲.理解了不小.

新鲜的可 发表于 2008-7-19 19:54:29

话说这么好的帖子竟然不加分

奸熊 发表于 2008-7-19 19:55:52

不错!支持鼓励!

jongcnvo 发表于 2008-7-24 16:05:05

好 支持地下室~

那方星空 发表于 2008-7-25 19:48:00

看了那么多JASS教程,只有这个能看懂~~~~~
好~~~~~~~~~~


支持~~~

灼眼のsaber 发表于 2008-7-26 01:36:13

加油~~~期待着补完~~~

linzefei 发表于 2008-7-28 18:52:37

支持下。。。
页: [1] 2
查看完整版本: 冰块教你学JASS(好累,休息下..)