魔兽地图吧's Archiver

feelerly 发表于 2007-4-15 22:49

【教程】新手入门之"Jass之路"【第二章】

[size=7][color=red]             |Jass教程区|[/color][/size]
[size=5][color=black]********************************************************[/color][/size]
[size=5][color=red]PS:如果你没有在看完 [url=http://bbs.wow8.org/viewthread.php?tid=22047][color=blue]新手入门之”Jass之路(更新中[/color][/url][color=blue])[/color]这篇文章,那么我建议别读这篇文章。如果你看了这后,没有去看完后面所附的[color=blue]附件[/color],那么也别读这篇文章。(这是偶的[color=blue]忠告[/color]!)[/color][/size]


[size=3][color=black]下面我将从一个我们编写触发经常用到的自定义脚本来为你揭开[color=blue]Jass的工作原理[/color]![/color][/size]
**** Hidden Message *****
[size=5]
[/size][size=3]*******************************************************************************[/size]
好了~说得这么多,偶的口水都干了!NO!是手都酸了!花儿都谢了。。。。
*****************************************************************************************
[color=red][size=5] |公共篇|[/size][/color]
[color=red][size=5][/size][/color]
[color=red][size=3][color=black][color=navy]要想学好Jass,有三步要走[/color]:[/color][/size][/color]
[color=red][size=3][color=#000000]第一步:[color=red]先要学会变量[/color],包括全局变量和局部变量,这两种变量的应用是非常重要的(别说你不会用,WE是不能米有变量的,Jass 更不能没有变量)。[/color][/size][/color]
[color=red][size=3][color=#000000]第二步:[color=red]了解Jass的函数[/color],魔兽的库函数(这是重中之中,特别是common.j中的函数) 如果对库函数有了足够的了解,对于Jass的应用也会得心应手,每个初学Jass的人,最弄不懂的就是Jass的语法逻辑,不太明白可以回复看下上面的文章.[b][color=blue]如果还不明白就大胆地问[/color][/b][color=blue]![/color][color=black]偶会尽可能地帮助大家的.[/color][/color][/size][/color]
[color=red][size=3][color=#000000]第三步:[color=red]学会应用缓存[/color],这里就恕我多言了,缓存原理是很简单的,但要学会应用就不是简单地事了.[color=blue]BJ函数[/color]的储存单位,整数,实数之类的是用[color=red]字符做标签[/color][color=black],也[color=red]将存地址做成了字符[/color],最后才将数据存入缓存.其实一个缓存可以用于整个游戏了,只是由于[color=blue]BJ函数[/color]的包装让缓存的应用起了变化.所以在许多高手通过尝试之后,[/color][color=red]return bug[/color][color=black]的应用也产生了.[/color][/color][/size][/color]
[color=red][size=3][color=#000000][/color][/size][/color]
[color=red][size=3][color=#000000][color=magenta]下面我大概地讲下我对于的理解[/color]吧~高手莫笑哦:loveliness: [/color][/size][/color]
[color=red][size=3][color=#000000]经典的表达式: [/color][/size][/color]
[size=3][color=red]function H2I takes handle h returns integer[/color][/size]
[size=3][color=red]   return h[/color][/size]
[size=3][color=red]   return 0[/color][/size]
[size=3][color=red]endfunction[/color][/size]
[color=red][size=3][color=#000000]下面我就来讲解一下这个倒底跟[color=blue]缓存[/color]有什么关系:[/color][/size][/color]
[color=red][size=3][color=#000000]很明显,稍有些Jass基础的朋友已经知道这是把[color=red]句柄转为整数[/color][color=black],什么是[color=blue]句柄(handle[/color])呢?看我的[color=magenta]第一章[/color]你大概就知道了.因为[color=blue]缓存储存的地址是字符,我们还需要把这个函数转化为字符来进行储存[/color].[/color][/color][/size][/color]
[color=red][size=3][color=#000000]比如,在一个函数下:(在此之前,先建立一个[color=magenta]缓存udg_gc[/color])[/color][/size][/color]
[size=3][color=magenta]function testfunc takes nothing returns nothing[/color][/size]
[size=3][color=magenta]    set bj_lastCreatedUnit = CreateUnitAtLoc(GetOwningPlayer(GetTriggerUnit()),'hfoo',GetUnitLoc(GetTriggerUnit()),0.00)[/color][/size]
[size=3][color=magenta]    call StoreInteger(udg_gc,I2S(H2I(bj_lastCreatedUnit)),"CreateUnit", H2I(GetTriggerUnit()))[/color][/size]
[size=3][color=magenta]endfunction[/color][/size]
[size=3][color=#000000]通过以上步骤,我们把[color=blue]bj_lastCreatedUnit 做为一个整数存入缓存udg_gc中[/color],并命名为"[color=red]CreateUnit[/color]",如果我们需要调用,就用取出整数的命令,通过[color=#ff0000]return bug[/color]来实现整数到单位之间的转化.(在此之前,在[color=red]H2I[/color][color=black]的后面再输入一段函数:[/color][/color][/size]
[size=3][color=magenta]function I2U takes integer i returns unit[/color][/size]
[size=3][color=magenta]    return i[/color][/size]
[size=3][color=magenta]    return null[/color][/size]
[size=3][color=magenta]endfunction[/color][/size]
[size=3][color=black]然后我们可以在另一个函数中,把我们[color=blue]所创建的单位[/color]"[color=#ff0000]CreateUnit[/color]"从缓存中读取出来.[/color][/size]
[size=3][color=magenta]function loadunit takes nothing returns nothing[/color][/size]
[size=3][color=magenta]    local location l = Location(0.00, 0.00)[/color][/size]
[color=magenta]     [size=3]local integer a  = GetStoreInteger(udg_gc,I2S(H2I(bj_lastCreatedUnit)),"CreateUnit", H2I(GetTriggerUnit()))[/size][/color]
[size=3][color=magenta]    call IssuePointOrderLoc(I2U(a),"move",l)[/color][/size]
[color=magenta][size=3]endfunction[/size]
[/color][color=#000000]通过这种方式,我们就[color=blue]把储存的整数又变回了单位[/color],但[color=darkred]这不意味着就可以随意地把物品变成单位,把字符变为实数[/color].而且[color=green]这种方法亦只适用于handle型变量[/color].当然,偶的水平有限,想到什么就说什么,如果有什么错误,还请大家能够体谅![/color]
[color=#000000]更多的东西可以去看下高手们的文章.([color=blue]第一章[/color]有[color=red]老狼的缓存教程的连接[/color],大家有兴趣可以去看看![/color]
[color=#000000][/color]
[color=#000000]*****************************************************************************************[/color]
[size=6][color=red]如果对本章有疑问,可以在回复中提出![/color][/size]

[size=5][color=#ff0000][/color][/size]

[[i] 本帖最后由 feelerly 于 2009-1-5 22:47 编辑 [/i]]

feelerly 发表于 2007-4-15 22:49

[color=black][/color]
[size=7][color=red]             |补充区|[/color][/size]
[size=5][color=black]大家有什么疑问可以在回复中提出来![/color][/size]
[size=5][color=black][color=red]提问格式为[/color]:[/color][/size]
[size=5][color=#000000]Q:什么是[color=blue]Jass[/color]?。。。[/color][/size]
[size=5][color=#000000][/color][/size]
[size=5][color=#000000]//[color=red][color=magenta]嘿嘿~本人将在问题发出的[color=seagreen]一周内尽可能地帮助解决[/color]!如果有人[color=blue]帮助回答[/color],回答正解者可以获得[/color][color=blue]大量三围奖励[/color]![/color][/color][/size]
[size=5][color=#ff0000][/color][/size]
[size=5][color=#ff0000]回答格式为[color=black]:[/color][/color][/size]
[size=5][color=#000000]Q:什么是[color=#0000ff]Jass[/color]?[/color][/size]
[size=5][color=#000000]A:[color=blue]Jass[/color]是暴雪公司的魔兽争霸专用编程语言![/color][/size]
[size=5][color=#000000][/color][/size]
[size=5][color=#000000]//[color=seagreen]最后!谢谢大家的支持!偶会继续努力的!你们也一样哦![/color][/color][/size]

[[i] 本帖最后由 feelerly 于 2007-4-16 00:23 编辑 [/i]]

feelerly 发表于 2007-4-16 00:02

[size=7][color=red]             |问题回答区|[/color][/size]
[size=5][color=black]********************************************************[/color][/size]
[size=5][color=#000000]                   本区专用于回答大家所提出的问题[/color][/size]
[size=5][color=#000000]********************************************************[/color][/size]

[[i] 本帖最后由 feelerly 于 2007-4-16 00:24 编辑 [/i]]

残月星痕 发表于 2007-4-16 07:43

支持舞:victory:
这样的帖子太好了:loveliness:
帮助了想学JASS的新手.

残月星痕 发表于 2007-4-16 07:50

JASS比T强大多了.
大家都来学习吧:D

堕落圣童 发表于 2007-4-16 10:05

非常好的东东 =

foolegg 发表于 2007-4-16 10:35

我来瞄一眼

foolegg 发表于 2007-4-16 10:41

不过话说回来,要学jass,去书店随便找本编程入门书看其实是最合适的选择……

程序的思想是相同的,要是有人说他会java但是学不会c++,那他java估计也不是真学会了

专业的编程教材比网上流行的大多数jass教程易读,且包含一些基本的编程原理,看看好处很多的

feelerly 发表于 2007-4-16 11:17

en ~~同意~~

偶认只要掌握了编辑语言的逻辑便可以了解到编辑的方向。
就向学外语一样,只要你有了那个语感,你说的不一定会是错的。

编辑也是语言,只不是机器语言罢了,分类不同但性质一样,只要能掌握逻辑原理,学什么编辑之类的根本不是难事,而最难的是怎么去学那个逻辑~ ~ 相信外面很少有书会专门将语言逻辑进行运用吧。。

kk3310 发表于 2007-4-16 12:31

这样的帖子太好了

Red_Wolf 发表于 2007-4-17 14:19

假死中~~

feelerly 发表于 2007-4-17 16:39

~ ~ 偶只是初学者。WE的学历三个月多一点。。。水平太有限了:'(

387960950 发表于 2007-4-17 20:24

```````````````````````````````````

387960950 发表于 2007-4-17 20:24

```````````````````````````````````

feelerly 发表于 2007-4-20 09:14

本章已经更新,添加了一些比较实用的内容希望对大家有所帮助!谢谢大家支持!

龙小天 发表于 2007-4-20 09:18

越来越详细了,不错

残月星痕 发表于 2007-4-20 11:26

越来越强大了,不错

半只猫 发表于 2007-4-20 20:12

好东西哈

cpcfchina 发表于 2007-4-22 21:07

怎样将JASS用到T中呢?

feelerly 发表于 2007-4-23 11:41

回复cpcfchina 的问题

Q:怎样将JASS用到T中呢?
A:可以在动作中定自定义脚本代码,这是一个非常不错的功能。
具体怎么使用,就看作者的能力与喜好了!

cpcfchina 发表于 2007-4-23 19:56

Q:是Custom script:   这个吗?函数代码这些怎么写进去呢?

war3_tl 发表于 2007-4-23 20:40

来尝试看下....

cpcfchina 发表于 2007-4-23 21:58

哦,终于明白怎么写进去了,不过要学习的地方还很多哟

cpcfchina 发表于 2007-4-24 18:12

Q:如何设置一函数,可以在所有的T中都能调用呢?

feelerly 发表于 2007-4-24 18:29

Q:如何设置一函数,可以在所有的T中都能调用呢?
A:比如: call RemoveLocation(udg_temploc)
RemoveLocation就是一个函数。具体说来,这是一个库函数。这个库函数的表达式为:
[code]native RemoveLocation takes location whichLocation returns nothing[/code]

其中whichLocation是参数
[code]call RemoveLocation(udg_temploc)[/code]
在这里,udg_temploc是一个函数代入的参数,在函数中就相当于whichLocation。
库函数可以在T就调用,但有限制,只能用common.j blizzad.j中的库函数。
当然我们也可以自定函数,但首先我们得先学会Jass!:)

cpcfchina 发表于 2007-4-24 19:45

我就是问自定义函数

cpcfchina 发表于 2007-4-24 20:04

哦,原来直接call 就行了,我晕,我开始还以为非要用ExecuteFunc

cpcfchina 发表于 2007-4-24 20:34

Q:
建立的公共过程为:

function Test takes nothing returns nothing

//  Just a Test

endfunction

//===========================================================================
function InitTrig_PublicFunction takes nothing returns nothing
    set gg_trg_PublicFunction = CreateTrigger(  )
endfunction

然后在另一个触发器里调用
function Trig_TestUpSkill1_Actions takes nothing returns nothing

  call Test()

endfunction

//===========================================================================
function InitTrig_TestUpSkill1 takes nothing returns nothing
    set gg_trg_TestUpSkill1 = CreateTrigger(  )
    call TriggerRegisterPlayerChatEvent( gg_trg_TestUpSkill1, Player(0), "uplv1", true )
    call TriggerAddAction( gg_trg_TestUpSkill1, function Trig_TestUpSkill1_Actions )
endfunction

居然不行,为什么?

cpcfchina 发表于 2007-4-24 20:35

就是那个call Test()居然通不过语法检查,真是太奇怪了

feelerly 发表于 2007-4-24 21:07

[quote]原帖由 [i]cpcfchina[/i] 于 2007-4-24 20:34 发表 [url=http://bbs.wow8.org/redirect.php?goto=findpost&pid=278708&ptid=24749][img]http://bbs.wow8.org/images/common/back.gif[/img][/url]
Q:
建立的公共过程为:

function Test takes nothing returns nothing

//  Just a Test

endfunction

//===========================================================================
function ... [/quote]

A:call Test()
语法结构是没有什么问题。

cpcfchina 发表于 2007-4-25 21:07

Q:
call ForGroupBJ( udg_Group_JJJ_WillKill, function Trig_Func004A )中后面这个函数为code类型,一般是没有入参和出参的,如果Trig_Func004A是有入参或出参的函数,这个该怎么写呢?

比如
call ForGroupBJ( GetUnitsInRectAll(RectFromCenterSizeBJ(GetSpellTargetLoc(), 500, 500), function Trig_Func002A )
而调用函数如果是
function Trig__Func002A takes nothing returns nothing
     call GroupAddUnitSimple( GetEnumUnit(), udg_Group_JJJ_WillKill )
endfunction
这样是没有问题的,但如果想不用全局变量udg_Group_JJJ_WillKill改成

function Trig__Func002A takes group gWhichGroup returns group

     call GroupAddUnitSimple( GetEnumUnit(), gWhichGroup )
     return gWhichGroup

endfunction

那ForForGroupBJ该怎样写呢?

feelerly 发表于 2007-4-25 21:51

A:ForGroupBJ
不是call 之类的语法,无法调用参数函数。而且格式都是不一样的。一个是call
一个是function。前个是函数调用。后者是code功能。

cpcfchina 发表于 2007-4-26 08:08

Q:
那 单位组- Pick every unit in (Units in (Region centered at TemPoint1 with size (500,500))) and do (Actions)
    Loop -  单位组- Add (Picked unit) to Group_WillKill
这个T用JASS怎么写呢?
如果直接转换的话,就是开始的ForGroupBJ了,而这里的Group_WillKill是全局变量,而我只想用
局部变量,方便释放嘛。LS的方法是group里已有了单位,而把某区域的单位加到局部变量g里面该怎么写呢?

feelerly 发表于 2007-4-26 08:47

A:
[code]native ForGroup takes group whichGroup, code callback returns nothing[/code]
[code]native GroupEnumUnitsInRangeOfLoc takes group whichGroup, location whichLocation, real radius, boolexpr filter returns nothing[/code]
这是选取单位以点whichLocation为圆心,真傎radius为半径, 满足布尔条件filter ,的单位组whichGroup。这个单位组要在函数里面声明local group g = CreateGroup()之后方能正确表达,这也是局部单位组变量正确的使用方法。然后只要用ForGroup这个函数进行动作就可以了。单位组经过这样才可以完美地进行释放。

31839986 发表于 2007-4-26 11:12

dsfdszdfasfddf

iceatao 发表于 2007-4-26 20:35

支持!!!

雨云 发表于 2007-4-28 09:34

Q:问一个一直让我很郁闷的问题。。。
怎么打开JAss?
你们光说怎么用。。。
我想知道在哪找。。。

雨云 发表于 2007-4-28 09:34

Q:问一个一直让我很郁闷的问题。。。
怎么打开JAss?
你们光说怎么用。。。
我想知道在哪找。。。

feelerly 发表于 2007-4-28 15:51

Q:问一个一直让我很郁闷的问题。。。
A:WE的原形就是Jass。你可以在触发编辑器下——编辑——转化触发为自定义文本。
通过这个方式可以查看WE触发所写的Jass脚本。

asd7586 发表于 2007-5-13 21:25

看了这么久还是感觉自己学不会

页: [1] 2 3

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.