请选择 进入手机版 | 继续访问电脑版

GA地精研究院

 找回密码
 立即注册
查看: 16228|回复: 39

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

[复制链接]
发表于 2008-7-12 15:25:57 | 显示全部楼层 |阅读模式
本人第一次做教程,加上接触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中可以在任意区域申明,其实最后还是会把所有的申明调到最前面去)全局变量,听这个名字就知道,全局变量的作用范围是整个程序,你可以在任何时候调用。
申明方法如下
[jass]globals  
integer a=123456//此为有初始值的全局变量
real b //此为是没有初始值的全局变量

real array c//此为数组全局变量的申明方式
endglobals [/jass]

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

local real b //此为是没有初始值的局部变量
local real array c//此为局部变量数组的申明方式 [/jass]

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

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

评分

参与人数 1威望 +60 收起 理由
喀尔硫司之瞳 + 60 优秀教程

查看全部评分

 楼主| 发表于 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作为关键字..
基本格式是:
[jass]function 函数名字 takes 参数类型|参数名字 returns 返回值类型
endfunction[/jass]
当然,参数和返回值并不是必须的。如果这个函数并不学要参数和返回值,可以写nothing

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

这里return的作用是返回值...需要注意的是return跟的表达式的类型 必须和函数申明里的一样..
比如这里需要的返回值是real,你就不能返回一个unit.
return还有一个作用就是结束函数.函数运行到这里..将直接退出..所以return一般是要写在函数的结束处..
  
然后既然函数写好了...那么我们以后就可以直接调用它了,不必每次这些东西了..这个就是函数的优点
就以这个为例子
调用这个函数的时候,你需要给它2个参数,他便会返回这两个参数的和..
调用函数用call作为关键字...
格式如下:
[jass]call 函数名字(参数)[/jass]

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

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

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

以下是一个例子:我们来做一个计算2个数的和并显示到屏幕的函数(这么又是计算2个数的和啊....不要不耐烦...基础很重要)
[jass]function ADD2 takes real a,real b returns nothing
local real c = a+b
call DisplayTextToPlayer( Player(0), 0, 0, R2S(c))  
endfunction[/jass]
这个函数中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 语句
格式如下:
[jass] if (布尔表达式)then
//A
elseif(布尔表达式)then 或者 else
//B
endif[/jass]
这个的意思是...
如果 if中的表达式成立..
则运行A
否则如果else中的表达式成立
运行B
如果是直接用else的话
就是
否则直接运行B
中间关键字有 if ,endif ,else,elseif

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

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

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

写这个函数的目的是,说明return会结束函数..这个其实之前就说过了...这里温习一下  
  
其实if语句就这么简单..但是功能强大

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

使用道具 举报

 楼主| 发表于 2008-7-12 19:10:02 | 显示全部楼层
第二章  JASS 函数篇
第三节.loop语句和timerstart初探


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

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

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

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

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

[jass]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[/jass]


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

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

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

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

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

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

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

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

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

例子:
[jass]function B takes nothing  returns nothing
endfunction

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

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

使用道具 举报

 楼主| 发表于 2008-7-12 20:30:05 | 显示全部楼层
第三章 综合篇
第一节.Returnbug

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

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

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

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

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

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

如果你这么写这个函数.....
[jass]function H2I takes handle h returns integer
    return h
endfunction[/jass]
在保存的时候肯定不能通过...因为之前我说过.....你返回的值得类型必须和你定义函数的时候一致....
但是程序就是程序....很傻....
你这么写通不过...
你就在后面加个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.实数(击退的速度)

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

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

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

突然有事请出去下.....回来再写吧......!!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-12 22:09:15 | 显示全部楼层
嘿...LS......你过分了哦.......
回复 支持 反对

使用道具 举报

发表于 2008-7-13 18:57:16 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 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 | 显示全部楼层
…………继续支持
回复 支持 反对

使用道具 举报

发表于 2008-7-19 18:13:22 | 显示全部楼层
希望继续发啊.看了你的演讲.理解了不小.
回复 支持 反对

使用道具 举报

发表于 2008-7-19 19:54:29 | 显示全部楼层
话说这么好的帖子竟然不加分
回复 支持 反对

使用道具 举报

发表于 2008-7-19 19:55:52 | 显示全部楼层
不错!支持鼓励!
回复 支持 反对

使用道具 举报

发表于 2008-7-24 16:05:05 | 显示全部楼层
好 支持  地下室~
回复 支持 反对

使用道具 举报

发表于 2008-7-25 19:48:00 | 显示全部楼层
看了那么多JASS教程,只有这个能看懂~~~~~
好~~~~~~~~~~


支持~~~
回复 支持 反对

使用道具 举报

发表于 2008-7-26 01:36:13 | 显示全部楼层
加油~~~期待着补完~~~
回复 支持 反对

使用道具 举报

发表于 2008-7-28 18:52:37 | 显示全部楼层
支持下。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2019-10-21 10:08 , Processed in 0.351192 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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