找回密码
 点一下
查看: 2892|回复: 15

由浅入深学Jass - 函数

[复制链接]
发表于 2008-4-9 11:24:37 | 显示全部楼层 |阅读模式
函数的定义:

我们在小学时就已经懂得下面这个公式:

x+1=y

小学时管它叫方程,到了高中管它叫函数,那么,如果把这个函数放在Jass中表达,就应该是:
[codes=jass]function sample takes integer x returns integer
    local integer y = x + 1
    return y
endfunction[/codes]

无论是哪种写法,他们的作用都是一样的,只是计算一下x+1的值。可能有人很快就发现,y在这里是完全没必要存在的,因为一旦x的值确定,y也就确定了,因此我们可以把写法变换一下:

f(x) = x+1

这是高中时函数的惯用写法,同样地,在Jass里可以写成:

[codes=jass]function sample takes integer x returns integer
    return x + 1
endfunction[/codes]

这就是Jass函数的基本概念,可见它和我们平常所用的数学函数并没有本质的区别,是一系列运算的集合。现在我们测试一下:

[codes=jass]call BJDebugMsg( I2S( sample(1)*sample(1)))[/codes]

这里我们使用了3个函数,sample(1)的工作是计算1+1,sample(1)*sample(1)自然=4,然后I2S()函数把整数4转换成字符串"4",最后BJDebugMsg()函数把"4"在屏幕中打印出来。

于是函数运行的结果是在屏幕中出现一个白色的 4,因此可以说在Jass中,各种运算是以函数为基础的,使用Jass的过程,便是不断调用函数的过程。

更妙的是,Blizzard公司已经为我们准备好了很多基础函数,这样我们可以很容易地调用游戏中的各种资源。

下面我们看一个函数在技能中的应用,这个技能是我们很熟悉的“野蛮冲撞”,它能使施法单位在一定时间内迅速冲向前方。
[codes=jass]
//******************************************
globals
    timer udg_unitrushtimer = CreateTimer()
    unit udg_caster
    integer udg_bounces = R2I( 1000.0/30.0 )
    real udg_angle
endglobals
//******************************************
//核心函数部分:
function UnitRush_Effects takes nothing returns nothing
    local real dx = GetUnitX(udg_caster) + 30.0*Cos(udg_angle)
    local real dy = GetUnitY(udg_caster) + 30.0*Sin(udg_angle)
    if udg_bounces == 0 Or GetUnitState( udg_caster, UNIT_STATE_LIFE ) == 0.0 then
        call PauseTimer( udg_unitrushtimer )
        set udg_caster = null
    else
        call SetUnitPosition( udg_caster, dx, dy )
    endif
endfunction

function UnitRush takes unit caster returns nothing
    set udg_caster = caster
    set udg_angle = GetUnitFacing( caster ) * bj_DEGTORAD
    call TimerStart( udg_unitrushtimer, 0.05, true, function UnitRush_Effects )
endfunction
[/codes]
你会惊叹,一个貌似复杂的技能,它的核心部分函数是那么的简单,的确,这就是Jass的强项 -- 简化工作,你仅需要使用以下语句:

[codes=jass]call UnitRush( GetTriggerUnit())[/codes]

就可以使一个触发单位勇猛向前冲,无论在任何时候。它的原理也同样简单明了:

每 0.05 秒,把 udg_caster 向着其面对的方向移动 30.0 的距离。当移动距离大于 1000.0 或单位死亡的时候,停下计时器。这就是上面函数所表达的全部意思。如果你有一定英语基础,应该不会费多大力气就能明白,当然,如果英语不好,可以查查字典。

如果你能看懂上面全部内容,那么你可以很大声地和任何人说,你已经学会Jass了,Jass并不是高深莫测的东西。但你可能不禁会问,既然我已经懂得了Jass,为何还是不会做技能呢?这是因为,Jass只是一个死的工具,就象一支铅笔,无论你对铅笔有多熟悉,不是画家的你依然画不出精彩的图画。要学会画画,你唯一可以做的是拿起笔拼命地画,制作技能也是同样道理,你只有不停地实践,才能很好地掌握技能制作的技巧。
261001126 该用户已被删除
发表于 2008-4-9 11:31:43 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2008-4-9 11:56:42 | 显示全部楼层
呃。我覺得。在講函數應該先簡單講下變量。
回复

使用道具 举报

发表于 2008-4-9 12:06:42 | 显示全部楼层
的确不错
学习中
回复

使用道具 举报

发表于 2008-4-9 15:12:29 | 显示全部楼层
严重支持了
回复

使用道具 举报

发表于 2008-4-11 12:37:32 | 显示全部楼层
引用第2楼白银の式神于2008-04-09 11:56发表的  :
呃。我覺得。在講函數應該先簡單講下變量。
呃,我覺得在講變量應該先簡單講下數據類型.
回复

使用道具 举报

traxex 该用户已被删除
发表于 2008-4-11 14:24:29 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2008-4-11 15:56:16 | 显示全部楼层
你们觉得来觉得去我倒觉得你们在存心灌水~~
回复

使用道具 举报

发表于 2008-4-11 19:12:35 | 显示全部楼层
请解通俗,但有些不够地道。有时候Jass所表现的往往是似而非,从数学角度出发,有些容易产生些误导。一般情况下,个人觉得应该从函数的作用与结构来分析函数,就算听不懂,但多写几次函数就熟悉了。
回复

使用道具 举报

发表于 2008-4-12 15:55:29 | 显示全部楼层
有点难!!我是一个高一生!!但我对数学中的函数不是很懂!!!!!郁闷吧!!!!!
回复

使用道具 举报

发表于 2008-4-13 10:47:08 | 显示全部楼层
我也是高一的 听不懂呐
有没专门的书什么的额
回复

使用道具 举报

发表于 2008-4-13 11:05:41 | 显示全部楼层
数学中的函数是一个映射关系吧,这里其实也差不太多………………
所有的程序设计教材都会讲到变量和函数的………………
回复

使用道具 举报

 楼主| 发表于 2008-4-14 11:27:31 | 显示全部楼层
其实函数就是所谓的方程, 或者叫算式, 只是叫法不一样.
回复

使用道具 举报

发表于 2008-4-17 14:56:38 | 显示全部楼层
原来如此,
回复

使用道具 举报

发表于 2008-5-10 22:21:47 | 显示全部楼层
检测到有新教程 放入TXT放入学习机了 然后  》顶《
回复

使用道具 举报

发表于 2008-7-2 19:04:17 | 显示全部楼层
顶拉!好东西!!继续发!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

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

GMT+8, 2024-11-24 07:16 , Processed in 0.077146 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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