永发信息网

跪求JASS教程

答案:1  悬赏:80  手机版
解决时间 2021-03-29 17:44
  • 提问者网友:别再叽里呱啦
  • 2021-03-29 06:27
跪求JASS教程
最佳答案
  • 五星知识达人网友:逃夭
  • 2021-03-29 07:29
只要你已经玩熟T,保证你学会JASS

首先JASS入门。 许多人对JASS望而生畏,看见一大堆的英文代码,
心生胆怯。所以觉得JASS很难学会。

总结了一下产生这种情绪的原因有以下几点:

1 . JASS可以说相当简单(跟其他程序语言相比几乎可以用小白来形容了);不过之前有个朋友要我比较下C++和JASS,他说JASS比C++还难,因为JASS的函数是那样多。天,谁叫你去记那些函数,我倒~
笔者从来不去背函数,需要用函数时,常常把T转换成J查看;或者使用JASS工具的查询功能(说到这我想可能某些新人连JASSSHOP和JassCraft这样的工具都没有吧,没有就赶快去下载)。其实JASS的函数名差不多已经告诉你它是干嘛的了,去死记硬背完全是多此一举。

还有一种办法就是查UI 里面的 一个叫 “TriggerStrings”的TXT文件 ( 不要告诉我你不知道UI在哪。)一打开你就能看懂了,里面全是中英文对照的。
2 现在的教程做的都太高估初学者了。许多教程在最开始的时候把最基础的东西讲得太少了(可能是作者认为这些东西太简单容易理解)导致初学者还没把最基础的掌握了(没入门),就去看比较难的,当然会学的云里雾里的,最后就会失去学JASS的信心。
(这是我的亲身体会)
所以我首先给大家推荐来自GA 冰块的教程(很遗憾他没有写完) 用来入门 因为他基础写的很细,而且易懂。
我在学JASS的时候,也是看遍了大江南北的JASS教程,没一个看得懂 呵呵,但就是因为看了冰块的这个JASS教程,让我重新认识了JASS(我入门了),所以我觉得第一步 入门很重要。一旦你入门了,后面你只要认真看教程,不出一星期,你就能学会。

好了 ! 不多说了~~转上教程

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

第一章 JASS 变量篇 (这章是重点,要认真学哦)
变量就顾名思义就是指可以在程序运行过程中能够改变的量。
首先我们了解下JASS为我们提供的变量类型:
WE中变量名 JASS中变量名 中文变量名
Boolean boolean 布尔型
Integer Integer 整数型
Real real 实数型
String string 字符串型
Timer timer 计时器
Timer Window timerdialog 计时器窗口
Unit unit 单位
Unit Group group 单位组
Point location 点
Player player 玩家
Player Group force 玩家组
Item item 物品
Special Effect effect 特效
Dialog dialog 对话
Dialog Button button 按钮
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.数组:数组其实是一组有序的相同类型的变量,通过数组索引,也就是[N]中的数字来确定指定某一个元素。在WE中数组的下限是从0开始的,也就是说数组中的元素数量是N+1个。
申明方法:在变量类型后加上array就可以申明一个数组变量了。
数组元素赋值方法:
function A takes nothing returns nothing
local integer array a
set a[0]=1//这样是正确的
set a=0//这样是错误的
set a[1]=a[2]//正确
endfunction

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

//====================危城强大的分割线==================================

w7272043872008-10-07 01:11 第二章 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难多少....

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

//======================强大的威城分割线=======================

w7272043872008-10-07 01:12 第二章 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...

//===================强大的威城分割线==============================
w7272043872008-10-07 01:17 第二章 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 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

这个就是 每0.01秒 运行B函数...

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


w7272043872008-10-07 01:50
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯