|
ÎÒÊÇ´«Ææ °æÖ÷
  
ÎÒ²»ÖªµÀ×Ô¼ºÔÚ×öʲô... - UID
- 124365
- Ìû×Ó
- 2411
- Á¦Á¿
- 6613
- Ãô½Ý
- 6875
- ÖÇÁ¦
- 3499
- ÉúÃü
- 3267
- ħ·¨
- 1158
- ×¢²áʱ¼ä
- 2007-7-26
|
ɳ·¢
´ó ÖÐ
С ·¢±íÓÚ 2007-8-18 09:18 Ö»¿´¸Ã×÷Õß
ÓÉÉϱí¿ÉÒÔ¿´³ö, ³ýÁËinteger, realµÄ¿ÕֵΪ 0 ºÍ boolean µÄ¿ÕֵΪfalseÒÔÍâ, ÆäËûÊý¾ÝÀàÐ͵ĿÕÖµ¶¼ÊÇnull. ÔÒòºÜ¼òµ¥: ³ýÁËinteger, real, booleanÍâ, ÆäËûÊý¾ÝÀàÐͶ¼ÊÇhandle(¾ä±ú)µÄ×ÓÀàÐÍ, handleÀàÐ͵ĿÕֵΪnull, ËüµÄ¶ù×ÓÃÇÒ²¸ú×Ånullµ½µ×ÁË.
2) ʲôÊÇcommon.j, Blizzard.j, common.ai?
Õâ3¸öÎļþ¶¼ÊÇÖ§³ÖWar3 JassµÄ¹«¹²¿âÎļþ, ÎļþÀïÃæ°üº¬ºÍÉùÃ÷ÁËËùÓÐ(¼¸ºõÊÇËùÓÐ)Jass¿ÉÒÔµ÷Óõĺ¯ÊýºÍÈ«¾Ö±äÁ¿.
common.j ÊÇ×î»ù´¡µÄAPI¿âÎļþ, ÔÚTrigger JassºÍAI JassÖж¼¿ÉÒÔµ÷ÓÃ.
Blizzard.j °üº¬Ê¹ÓÃTrigger EditorʱÉú³ÉµÄTrigger JassÖо³£µ÷ÓõĿ⺯Êý/È«¾Ö±äÁ¿, ʵ¼ÊÉÏÊÇ»ùÓÚcommon.jдµÄ×Óº¯Êý. Blizzard.jÖ»ÄÜÔÚTrigger JassÖе÷ÓÃ.
common.ai Ö»ÄÜÔÚAI JassÖе÷ÓÃ, ËüÓÐAIÖÐÐèҪʹÓõĺ¯ÊýºÍÈ«¾Ö±äÁ¿.
×¢Òâ: ÔÚTrigger JassÖÐ, ²»Äܵ÷ÓÃcommon.aiÖеĺ¯ÊýºÍÈ«¾Ö±äÁ¿; ͬÑùµØ, ÔÚAI JassÖÐ, Ò²²»ÄÜʹÓÃBlizzard.jµÄº¯ÊýºÍÈ«¾Ö±äÁ¿.
3) ÈçºÎ»ñµÃ×îеÄcommon.j, Blizzard.j, common.ai?
ÔÚwar3.mpq/war3x.mpq/war3patch.mpq¶¼ÓÐcommon.j/Blizzard.j/common.ai, Òª»ñµÃ×îа汾µÄÎļþ, ¿ÉÒÔÓÃWINMPQ´ò¿ªwar3patch.mpq, ÔÚWINMPQÓÒÉÏ·½µÄÊäÈë¿òÖÐÊäÈë: scripts\* ,Èç¹ûÄãµÄwar3patch.mpqûÓÐ"¼ÓÃÜ"¹ý, ÄÇô¿ÉÒÔÕÒµ½Õâ3¸öÎļþ. Èç¹ûÊÇ"¼ÓÃÜ"¹ýµÄ, ÔòÐèÒª°Ñwar3patch.mpqµÄÎļþÈ«²¿½âѹµ½ÁÙʱĿ¼, È»ºóÓÃUltra-EditÖеÄÔÚÎļþÖÐËÑË÷×Ö·ûµÄ¹¦ÄÜѰÕÒÕâ3¸öÎļþ.
4) ¿ÉÒÔÔÚ×Ô¼ºµÄµØÍ¼ÖÐʹÓÃ×Ô¶¨ÒåµÄcommon.j, Blizzard.j, common.aiÂð?
¿ÉÒÔ. ÓÃÊäÈë¹ÜÀíÆ÷ÊäÈë×Ô¶¨ÒåµÄcommon.j, Blizzard.j, common.ai, ÊäÈëĿ¼ӦΪ\scripts\. ÕâÑù, ÔËÐеØÍ¼ÖеĽű¾Ê±, War3¾Í²»»áµ½war3patch.mpqѰÕÒÕâ3¸öÎļþÁ˶øÖ±½Ó´ÓµØÍ¼ÖеÄ\scripts\Ŀ¼µ÷ÓÃ. ÕâÑù×öµÄºÃ´¦¾ÍÊÇ¿ÉÒÔʹ¿âÎļþµÄͬ²½Ò»ÖÂ. ͨ³£, °æ±¾ÏàͬµÄWAR3, Æä¿âÎļþÒ²Ïàͬ, ËùÒÔ¶àÊýʱºò²»ÐèÒªÔÚµØÍ¼ÖÐÊäÈëÕâ3¸öÎļþ. µ«Èç¹ûÄã¸ü¸ÄÁËÕâ3¸ö»ù±¾ÎļþÀ´Ö§³ÖÄãµÄJass, »òÕßÈ·±£ÎªÁË¿âÎļþµÄÒ»ÖÂÐÔ, ±ã¿ÉÒÔÔÚµØÍ¼ÖÐÊäÈë»ù´¡¿âÎļþ.
5) Ôõô½â¶Á¹«¹²¿âÎļþ(common.j, Blizzard.j, common.ai)µÄº¯Êý/È«¾Ö±äÁ¿?
Blizzard¶Ôº¯Êý/È«¾Ö±äÁ¿µÄÃüÃûÊÇÏ൱¹æ·¶¼òÃ÷Ò×¶®µÄ(µ±È»ÐèÒªÒ»¶¨µÄÓ¢ÎÄ»ù´¡), Ëü¶¨ÒåµÄº¯Êý/È«¾Ö±äÁ¿µÄÃû»ù±¾ÉÏÊÇÓ¢ÓïÓï¾ä. ÎÒ¾ÙЩÀý×Ó:
native CreateUnit takes player id, integer unitid, real x, real y, real face returns unit
±¾µØº¯ÊýCreateUnit() ¼´ÊÇCreate Unit, Òâ˼Ϊ´´½¨µ¥Î», ´Ó²ÎÊý±í(takes ºÍ returnsÖ®¼äµÄÉùÃ÷)À´¿´, Õâ¸öº¯ÊýÐèÒªÊäÈëÍæ¼Ò, µ¥Î»±àÂë, ×ø±êx, ×ø±êy, ·½Ïò½Ç¶È, ·µ»ØÖµÊǵ¥Î»ÀàÐͱäÁ¿.
´Óº¯ÊýµÄÃû×ֺͲÎÊý±í, ¿ÉÒԲ²â/È·ÈÏCreateUnit()ÊÇÓÃÀ´ÔÚµØÍ¼µÄx/y×ø±êÖÐΪָ¶¨Íæ¼Ò´´½¨Ö¸¶¨µ¥Î», ²¢ÇÒʹ´´½¨µ¥Î»ÃæÏòËù¶¨ÒåµÄ½Ç¶È, ·µ»ØÖµÊÇ´´½¨µ¥Î».
ÔÚµØÍ¼Èë¿Úº¯Êýmain()ÖÐ, CreateUnit()±»´óÁ¿µ÷ÓÃ, ÓÃÀ´ÖØÏÖµØÍ¼Éè¼ÆÊ±ÓÃWORLD EDITOR(GUI)·ÅÖõĵ¥Î».
×¢Òâ: ¾ÍÈçÇ°ÃæËù˵¹ý, integer¿ÉÒÔÓõ¥ÒýºÅÀ¨Æð4¸öÓ¢ÎÄ×Öĸ/Êý×ÖÀ´±íʾ. ËùÒÔCreateUnit()ÖÐinteger unitid²ÎÊý¿ÉÒÔÓà 'Xxxx'À´±íʾ. Èç:
set u = CreateUnit( Player(5), 'ndgt', -2944.0, -3136.0, 270.000 )
ÉϾäÒâ˼ÊÇÎªÍæ¼Ò5ÔÚµØÍ¼×ø±ê(-2944.0, -3136.0)Öд´½¨±àÂëΪ'ndgt'µÄµ¥Î», ²¢Ê¹´´½¨µ¥Î»ÃæÏò½Ç¶ÈΪ270¶È, È»ºó°Ñ´´½¨µ¥Î»±£´æÔÚ±äÁ¿uÖÐ.
×ܽáÏÂBlizzardº¯ÊýÃû/È«¾Ö±äÁ¿ÃûµÄ¹æÂÉ:
a) ǰ׹Get È¡µÃijÊôÐÔ, ´ËÀຯÊýÒ»°ãÓзµ»ØÖµ
b) ǰ׺Set ÉèÖÃijÊôÐÔ
c) ǰ׺Is ÊÇ·ñÅжÏ, ´ËÀຯÊý·µ»ØÀàÐͶ¼ÊÇboolean, ·µ»Øtrue»òfalse
d) ÖмäÓÐ2 Êý¾ÝÀàÐÍת»¯º¯Êý, ÈçS2I(), I2R, I2S()µÈ
e) ÓÐItem/Unit/... ¿Ï¶¨ÊÇÓëÎïÆ·/µ¥Î»/...Ïà¹ØµÄº¯Êý
f) ºó׺BJ ´Ëº¯Êý¿Ï¶¨ÊÇÔÚBlizzard.jÖж¨ÒåµÄ, ²»ÄÜÔÚAIÖÐʹÓÃ.
g) ǰ׺bj_ ÔÚBlizzard.jÖж¨ÒåÉùÃ÷µÄÈ«¾Ö³£Á¿(³£Á¿ÊÇÖ¸¶¨Òå²¢¸³Öµºó²»ÄÜÔٸıäµÄÖµ)
h) ǰ׺Create ´´½¨
i) ǰ׺Remove ÒÆ³ý
k) È«²¿´óд ÔÚcommon.jÖж¨ÒåÉùÃ÷µÄÈ«¾Ö³£Á¿
6) ʵÓÃÎÊÌâ: ÈçºÎ´´½¨Íâ¹ÛËæ»ú¿É±äµÄµØÍ¼?
ÉÏÃæËµ¹ý, main()ÊǵØÍ¼Èë¿Úº¯Êý, ÔÚmain()µ÷ÓÃÁËһЩÔÙÏÖµØÍ¼Éè¼ÆÊ±ÔòµÄ×Óº¯ÊýÈçCreateAllUnits(). Òò´Ë, ÎÒÃÇ¿ÉÒÔÔÚCreateAllUnits()ÖмÓÈëËæ»úº¯ÊýGetRandomInt()À´¿ØÖƵ¥Î»/ÎïÆ·/¿ÉÆÆ»µÎïµÈ³õʼ»¯¹ý³Ì.
ÎÒÃÇ¿ÉÒÔÓÃWINMPQ´ò¿ªÒªÐ޸ĵĵØÍ¼, ÌáÈ¡war3map.jÀ´ÐÞ¸Ämain()º¯Êý¼°ÆäÏà¹Øº¯Êý. ÐÞ¸ÄÍêwar3map.jºó, ÔÙÓÃWINMPQµ¼ÈëÐ޸ĺóµÄwar3map.j.
a) º¯ÊýÐÞ¸Ä/Ôö¼Ó·½·¨:
ÕâÊÇ3CµØÍ¼ÖеÄCreateAllUnits()º¯Êý
function CreateAllUnits takes nothing returns nothing
call CreateNeutralPassiveBuildings() //Óû§×Ô¶¨Ò庯Êý
call CreatePlayerBuildings() //Óû§×Ô¶¨Ò庯Êý
call CreateNeutralHostile() //Óû§×Ô¶¨Ò庯Êý
call CreateNeutralPassive() //Óû§×Ô¶¨Ò庯Êý
call CreatePlayerUnits() //Óû§×Ô¶¨Ò庯Êý
endfunction
×¢Òâ: CreateAllUnits()Ò²²»Êǿ⺯Êý, ÊÇÓû§×Ô¶¨Ò庯Êý):
ÎÒÃÇ¿ÉÒÔ¸ù¾ÝCreateAllUnits()´´½¨ÁíÒ»¸öº¯Êý:
function CreateAllUnitsRandom takes nothing returns nothing
// randomint ÊÇ 1,2,3ÖеÄËæ»úÊý
local integer randomint = GetRandomInt(1, 3)
call CreateNeutralPassiveBuildingsRandom(randomint)
call CreatePlayerBuildingsRandom(randomint)
call CreateNeutralHostileRandom(randomint)
call CreateNeutralPassiveRandom(randomint)
call CreatePlayerUnitsRandom(randomint)
endfunction
ÒòΪÔÀ´µ÷Óõĺ¯Êý¶¼ÊÇÎÞ²ÎÊýº¯Êý, ËùÒÔÏàÓ¦µÄº¯ÊýÓ¦¸Ã×öЩÐÞ¸Ä, Èç:
//´´½¨Íæ¼Òµ¥Î», ÒÔCreatePlayerUnits()ΪÀ¶±¾Ôö¼Óк¯Êý
function CreatePlayerUnitsRandom takes integer randomint returns nothing
//´Ëº¯ÊýÒÔCreateUnitsForPlayer0ΪÀ¶±¾Ôö¼Óк¯Êý
call CreateUnitsForPlayer0Random(randomint)
......
endfunction
//´´½¨ÖÐÁ¢µÐ¶Ôµ¥Î»
//´Ëº¯ÊýÒÔCreateNeutralHostileΪÀ¶±¾Ôö¼Óк¯Êý
function CreateNeutralHostileRandom integer randomint returns nothing
local player p = Player(PLAYER_NEUTRAL_AGGRESSIVE)
local unit u
local integer unitID
local trigger t
local real life
//¼ÓÈëÌõ¼þ¿ØÖÆ, ¸ù¾ÝËæ»úÊý´´½¨²»Í¬µ¥Î»×éºÏ.
if randomint == 1 then
//¿Éµô±¦ÎïµÄµ¥Î»
set u = CreateUnit( p, 'nC26', -6533.2, 445.1, 220.680 )
set t = CreateTrigger( )
call TriggerRegisterUnitEvent( t, u, EVENT_UNIT_DEATH )
call TriggerRegisterUnitEvent( t, u, EVENT_UNIT_CHANGE_OWNER )
call TriggerAddAction( t, function Unit000012_DropItems )
//²»µô±¦Îﵥλ
set u = CreateUnit( p, 'nelb', -373.5, 3533.4, 44.518 )
set u = CreateUnit( p, 'nomg', -233.6, 3436.2, 140.871 )
elseif randomint == 2 then
//²»µô±¦Îﵥλ
set u = CreateUnit( p, 'a001', -373.5, 3533.4, 44.518 )
set u = CreateUnit( p, 'a002', -233.6, 3436.2, 140.871 )
else
......
endif
endfunction
±ðÍüÁËÐÞ¸Ämain()
function main takes nothing returns nothing
........
//call CreateAllUnits() //Ô°æµÄµ¥Î»³õʼ»¯º¯Êý, ²»ÔÙʹÓÃ
call CreateAllUnitsRandom() //ʹÓÃеĵ¥Î»³õʼ»¯º¯Êý
........
endfunction
b) ³õʼÉèÖø´ÖÆ·½·¨:
ÎÊÌâµÄ¹Ø¼ü¾ÍÊÇ, Õâô¶à³õʼµ¥Î», ÔõôÑùÐÞ¸ÄÆðÀ´²»ÀÛÈË?
ÕâÀï½éÉÜÒ»ÖÖ·½·¨:
1. ÏȰÑÒªÐ޸ĵĵØÍ¼¸´ÖÆ
2. Ð޸ĸ´ÖƵØÍ¼³õʼµ¥Î»µÄÀàÐÍ/λÖÃ/±¦ÎïµÈ, ɾ³ýËùÓÐTRIGGER, ²¢±£´æ
3. ÓÃWINMPQ´ò¿ª¸´ÖƵØÍ¼, ÌáÈ¡war3map.j
4. ¸´ÖÆwar3map.jÖжÔÓ¦º¯ÊýÖд´½¨µ¥Î»µÄÓï¾ä
5. °Ñ¸´ÖƵÄÓï¾äÕ³ÌùÔÚÔµØÍ¼ÖÐÏàÓ¦º¯ÊýµÄÊʵ±Î»ÖÃ
6. ÖØ¸´1-5, ¸´ÖƸü¶àµÄËæ»ú³õʼ»¯ÉèÖÃ
×¢Òâ: Èç¹ûÓÃWorld EditorÔÙ´ÎÐ޸IJ¢±£´æ, main()½«Ê¹ÓÃGUIĬÈÏÉú³ÉµÄcall CreateAllUnits(), ¶ø²»ÊÇcall CreateAllUnitsRandom(). ´Ëʱ»¹ÐèÒª´ò¿ªwar3map.jÐÞ¸Ämain()º¯Êý.
ͬÑù, ʹ¿ÉÆÆ»µÎïµÈ³õʼÉèÖÃÓÐËæ»ú±ä»¯Ò²¿ÉÒÔÓô˷½·¨.Jass»ù´¡½Ì³Ì µÚËÄÕ ¿âº¯Êý ¡¡
ÕâÕÂÊÇJass»ù´¡½Ì³ÌÖÐ×îÄѵIJ¿·Ö, Ò²ÊÇ×îʵÓõIJ¿·Ö.
JassµÄ¹Ø¼ü×ÖÓÐ26¸ö, ¸úÓ¢ÎÄ×ÖĸһÑù¶à. ÎÒÃÇÀ´»Ø¹ËÒ»ÏÂ:
and, array, call, constant, else, elseif, endfunction, endglobals, endif, endloop, exitwhen, extends, function, globals, if, local, loop, native, not, or, return, returns, set, takes, type, then
ÒÔ´Ë¿´À´, JassÊÇÓï·¨½á¹¹×î¼òµ¥µÄÒ»ÖÖ×¼¼ÆËã»úÓïÑÔ. JassʵÏÖ¹¦ÄÜ»ù±¾ÒÀ¿¿µ÷ÓÃcommon.j, blizzad.j, common.aiÖеĿ⺯Êý.
±¾ÕÂËùÊöÄÚÈݲ»ÊôÓÚJassÓï·¨²¿·Ö, ×îÖ÷Òª½²Êö:
´¥·¢Æ÷(Triggers)
¿ç½Å±¾Í¨Ñ¶(Inter-Script Communication)
¶ÓÁÐ(Enumerations)
¶ÓÁйýÂËÆ÷(Filters)
Ïß³Ì(Threads)
1) ´¥·¢Æ÷(Triggers)
´¥·¢Æ÷ÓÃÓÚµØÍ¼´¥·¢Æ÷½Å±¾(Trigger Jass), ÓÃÓÚÏìÓ¦ÌØ¶¨Ê¼þ. ËüÊÇÖÖÏìÓ¦ÐźÅ(callback), ´¥·¢Æ÷²»ÄÜÓ¦ÓÃÓÚAI, ¼´ÊÇ˵AI JassÖв»ÄÜÓд¥·¢Æ÷µÄÓï¾ä.
´¥·¢Æ÷°üº¬´´½¨´¥·¢Æ÷, ÉèÖô¥·¢Ìõ¼þ, ÉèÖö¯×÷.
a)´´½¨´¥·¢Æ÷
´¥·¢Æ÷µÄÊý¾ÝÀàÐÍΪtrigger(´¥·¢Æ÷), ÊÇhandle(¾ä±ú)µÄ×ÓÀàÐÍ.
´´½¨´¥·¢Æ÷µÄº¯ÊýÔÚcommon.jÖеÄÉùÃ÷:
native CreateTrigger takes nothing returns trigger
²ÎÊý:
nothing //ÎÞ²ÎÊý
·µ»Ø:
trigger //·µ»Ø´´½¨µÄ´¥·¢Æ÷
ʹÓøñʽ: set ±í´ïʽ = CreateTrigger()
ÆäÖбí´ïʽÊÇtriggerÀàÐ͵ıäÁ¿
ÐÂÊý¾ÝÀàÐÍ:
triggerÀàÐÍ: ÊÇhandleµÄ×ÓÀàÐÍ, ÓÃÓÚµ÷Óúʹ¦Àí´¥·¢Æ÷
b)´¥·¢Ê¼þ
´¥·¢Ê¼þµÄÊý¾ÝÀàÐÍΪevent(ʼþ). ¿ÉÒÔÒýÆð´¥·¢ÏìÓ¦µÄ´¥·¢Æ÷±ØÐëÏÈÔÚÓÎÏ·ÖÐ×¢²á´¥·¢Ê¼þ, ÓÃÓÚ¼àÊÓÓÎϷʼþ·¢Éú.
×¢²á´¥·¢Ê¼þµÄº¯ÊýÔÚcommon.jÖеÄÉùÃ÷:
native TriggerRegister*Event takes
trigger whichTrigger, ... returns event
º¯ÊýÃû:
¸ù¾Ýʼþ¶ÔÏóµÄ²»Í¬, Óв»Í¬µÄʼþÏìÓ¦. TriggerRegister*EventÖÐµÄ * ºÅΪ¶ÔÏóÃû, Èç: TriggerRegisterUnitEvent, TriggerRegisterEnterRegion µÈ, ×¢²á²»Í¬¶ÔÏóµÄʼþÒªÇó´«µÝÏàÓ¦Ö¸¶¨¶ÔÏó×÷Ϊ²ÎÊý, ÓÐЩʼþ×¢²áÒªÇó´«µÝÏÂÃæËù˵µÄ¹ýÂËÆ÷(Filters)
²ÎÊý:
trigger whichTrigger //´¥·¢Æ÷±äÁ¿
... //ÏàÓ¦Ö¸¶¨¶ÔÏóµÄ±äÁ¿
·µ»Ø:
event //·µ»Ø¸Ãʼþ
ʹÓ÷½·¨(¾Ù×¢²áµ¥Î»Ê¼þµÄÀý×Ó):
call TriggerRegisterUnitEvent(Äĸö´¥·¢Æ÷, Äĸöµ¥Î», ÄÄÖÖÀàÐ͵ĵ¥Î»Ê¼þ)
ÐÂÊý¾ÝÀàÐÍ:
event //ʼþ
c)´¥·¢Ìõ¼þ
´¥·¢Ìõ¼þÊÇÒ»×é²¼¶û±í´ïʽ(boolexpr)Êý¾Ý, ËüµÄÊý¾ÝÀàÐÍΪÌõ¼þº¯Êý(conditionfunc), ÊDz¼¶û±í´ïʽ(boolexpr)ÀàÐ͵Ä×ÓÀàÐÍ.
½¨Á¢´¥·¢Ìõ¼þµÄº¯ÊýÔÚcommon.jÖеÄÉùÃ÷:
native Condition takes code func returns conditionfunc
²ÎÊý:
code func //º¯Êý´úÂë×÷Ϊ²ÎÊý
·µ»Ø:
conditionfunc //·µ»Ø½¨Á¢µÄÌõ¼þ
ÆäÖÐtakes code funcÊÇÖ¸ÐèÒªº¯Êý´úÂëfunc×÷Ϊ²ÎÊý, ²ÎÊýº¯Êý func ±ØÐëµÄÉùÃ÷¸ñʽ±ØÐëÊÇ: takes nothing returns boolean. ¼´ÊÇ˵, ÓÃ×÷²ÎÊýµÄº¯Êý±¾ÉíÓ¦¸ÃÊÇÎÞ²ÎÊýÇÒ·µ»ØÖµÎª²¼¶ûÐÍ(boolean).
ʹÓøñʽ: set ±í´ïʽ = Condition(function ²¼¶ûÐͺ¯ÊýÃû)
ÆäÖбí´ïʽÊÇÌõ¼þº¯Êý(conditionfunc)
ÐÂÊý¾ÝÀàÐÍ:
boolexpr ²¼¶û±í´ïʽ
conditionfunc Ìõ¼þº¯Êý, ÊDz¼¶û±í´ïʽµÄ×ÓÀàÐÍ
±ÈÈç:
function Girl1 takes nothing returns boolean
...
return true
endfunction
function Girl2 takes integer i returns boolean
...
return true
endfunction
function Girl3 takes nothing returns nothing
...
return
endfunction
// ¼ÙÉè c ΪconditionfuncÀàÐͱäÁ¿
set c = Condition(function Girl1) //(A)
set c = Condition(function Girl2) //(B) ±¾ÉíÒªÇó²ÎÊý
set c = Condition(function Girl3) //(C) ·µ»ØÖµ²»ÊÇbooleanÀàÐÍ
½âÊÍ: Girl1() ÊÇÎÞ²ÎÊýÇÒ·µ»ØÎªbooleanµÄº¯Êý, ¿ÉÒÔÓÃ×÷ Condiction() ÖеIJÎÊýº¯Êýcode func. ¶øGirl2() - ±¾ÉíÒªÇó²ÎÊý, Girl3() - ·µ»ØÖµ²»ÊÇbooleanÀàÐÍ, ËùÒÔ(B)(C)º¯Êý²»¿É×÷ΪCondiction()µÄ²ÎÊý.
ÔÚµÚÒ»Õ±äÁ¿ÆªÖÐÎÒûÓÐÏêϸ˵Ã÷codeÀàÐ͵ÄÊý¾Ý, ÒòΪŶÁÕß²»ÄÜÀí½â. ÏÖÔÚÎÒ˵Ã÷ÏÂcodeÀàÐÍÊý¾Ý. ÎÒÃÇÓÃÀý×Ó˵Ã÷, ±ÈÈç:
call myfuction1(IsGirl()) //(A)
call myfuction2(function IsGirl()) //(B)
(A)ºÍ(B)Ö®¼äÓÐʲô²»Í¬ÄØ? °´ÎÒµÄÀí½â: (A)(B)¶¼°ÑIsGirl()ÔËÐзµ»ØºóµÄÖµµ±×÷myfunction1()/myfunction2()µÄ²ÎÊý. IsGirl()ÔÚ(A)ÖÐÊÇÒ»´ÎÐԵĴ¦Àí¹ý³Ì. ¶ø(B)ÊÇ´´½¨ÁËÒ»¸öÔËÐÐIsGirl()Âß¼µÄ¼àÊÓÏß³Ì, Ö»ÒªÏß³Ìû¸øÇå³ý/ÖÕÖ¹, IsGirl()½«Ò»Ö±¼àÊӱ仯. ×¢ÒâÕâÀïËù˵µÄÏ̸߳úÏÂÃæÒªËµµÄAIÏß³ÌÊÇÁ½ÂëÊÂ.
d) Ôö¼Ó´¥·¢Ìõ¼þ:
´¥·¢Ìõ¼þ¿ÉÒÔÓÃTriggerAddCondition()Ôö¼Ó
Ôö¼Ó´¥·¢Ìõ¼þµÄº¯ÊýÔÚcommon.jÖеÄÉùÃ÷:
native TriggerAddCondition takes trigger whichTrigger,
boolexpr condition returns triggercondition
²ÎÊý:
trigger whichTrigger //´¥·¢Æ÷±äÁ¿
boolexpr condition //´¥·¢Ìõ¼þ±äÁ¿
·µ»Ø:
triggercondition //·µ»Ø¸Ã´¥·¢Ìõ¼þµÄhandle(¾ä±ú)
ʹÓøñʽ:
set tc = TriggerAddCondition(´¥·¢Æ÷, ´¥·¢Ìõ¼þ)
ÆäÖÐ tc ΪtriggerconditionÀàÐͱäÁ¿
ÐÂÊý¾ÝÀàÐÍ:
triggercondition ´¥·¢Ìõ¼þ¾ä±ú
(×¢Òâ: ´¥·¢Ìõ¼þºÍÉÏÃæÒªËµµÄ´¥·¢Ê¼þÊDz»Ò»ÑùµÄ!!!)
Àý:
ÕâÊÇÔö¼Ó/ÒÆ³ý/¸Ä±ä´¥·¢Ìõ¼þµÄÀý×Ó
//ÎļþÍ·ÉùÃ÷¸öÈ«¾Ö±äÁ¿tc
globals
...
triggercondition tc = null
trigger mytrigger = null
...
endglobals
function Girl takes nothing returns boolean
...
return true
endfunction
function notGirl takes nothing returns boolean
...
return false
endfunction
//Ϊ mytrigger Ôö¼Ó´¥·¢Ìõ¼þ
function addcondition takes nothing returns nothing
...
set mytrigger = CreateTrigger()
set tc = TriggerAddCondition(mytrigger, Condition(function Girl))
...
endfunction
//ÒòΪtcÊÇmytrigger´¥·¢Ìõ¼þµÄ¾ä±ú, °ÑtcÇå¿Õ±ãÇå³ýÁËÖ¸ÏòµÄ´¥·¢Ìõ¼þ.
function removecondition takes nothing returns nothing
...
set tc = null
..
endfunction
//¸Ä±ä mytrigger µÄ´¥·¢Ìõ¼þ
function modifycondition takes nothing returns nothing
...
set tc = null //ÏȰÑÔÀ´µÄ´¥·¢Ìõ¼þÒÆµô
set tc = TriggerAddCondition(mytrigger, Condition(function noGirl))
...
endfunction
e)´¥·¢Æ÷¶¯×÷
´¥·¢Æ÷¶¯×÷Êǵ±Ö¸¶¨Ê¼þ·¢Éú²¢·ûºÏ´¥·¢Ìõ¼þµÄÖ´ÐеÄÓï¾ä.
Ôö¼Ó´¥·¢Æ÷¶¯×÷µÄº¯ÊýÔÚcommon.jÖеÄÉùÃ÷:
native TriggerAddAction takes trigger whichTrigger,
code actionFunc returns triggeraction
²ÎÊý:
trigger whichTrigger //´¥·¢Æ÷±äÁ¿
code actionFunc //Ö´Ðк¯Êý
×¢Òâ: Ö´Ðк¯Êý±ØÐëÊÇÎÞ²ÎÊýÎÞ·µ»ØÖµ(takes nothing returns nothing)µÄº¯Êý
·µ»Ø:
triggeraction //´¥·¢¶¯×÷
ÐÂÊý¾ÝÀàÐÍ:
triggeraction //´¥·¢¶¯×÷, handle×ÖÀà
°ÑÓйش¥·¢Æ÷Ö÷Òªº¯ÊýôÛºÏÔÚÒ»Æð, ÎÒÃÇÀ´¿´¸öÀý×Ó, Ñо¿Ï´¥·¢Æ÷ÊÇÔõô´´½¨µÄ:
//ÎļþÍ·ÉùÃ÷È«¾Ö±äÁ¿mytrigger
//¼ÙÉèmytriggerÊǼàÊÓµ¥Î»ËÀÍöʼþµÄ´¥·¢Æ÷
globals
...
trigger mytrigger = null
...
endglobals
//ÅжÏÊÇ·ñµôÎïÆ·
function isDrop takes nothing returns boolean
local boolean conditcion
...
if conditcion = true then
return true
else
return false
endif
endfunction
//µôÎïÆ·
function DropItems takes nothing returns nothing
//»ñµÃ´¥·¢µ¥Î»
local unit trigUnit = GetTriggerUnit()
....
call UnitDropItem( trigUnit, 'IC21' )
...
endfunction
function ThisIsMyTrigger takes nothing returns nothing
local unit u
//ÔÚ-5630.5, -4723.1×ø±êÎªÍæ¼Ò5´´½¨µ¥Î»'n00I', ÃæÏò90.260¶È
set u = CreateUnit(Player(5), 'n00I', -5630.5, -4723.1, 90.260 )
//´´½¨´¥·¢Æ÷(Ï൱ÓÚmytriggerµÄ³õʼ»¯)
set mytrigger = CreateTrigger()
//Ϊmytrigger×¢²á´¥·¢Æ÷ʼþ, ÈÃÓÎϷϵͳ¼àÊÓËù´´½¨µ¥Î»uµÄËÀÍöʼþ
//EVENT_UNIT_DEATHÊÇcommon.jÖж¨ÒåµÄ³£Á¿
call TriggerRegisterUnitEvent( mytrigger, u, EVENT_UNIT_DEATH )
//ΪmytriggerÔö¼Ó´¥·¢Ìõ¼þ
//isDropÊÇÎÞ²ÎÊý·µ»ØÎª²¼¶ûÖµµÄº¯Êý
set tc = TriggerAddCondition(mytrigger, Condition(function isDrop))
//ΪmytriggerÔö¼Ó´¥·¢Æ÷¶¯×÷ - µô±¦Îï
//DropItemsÊÇÎÞ²ÎÊýÎÞ·µ»ØÖµµÄº¯Êý
call TriggerAddAction(mytrigger, function DropItems )
...
endfunction
¿ÉÒÔ¿´³ö, ´´½¨´¥·¢Æ÷˳ÐòÊÇ:
1. ´¥·¢Æ÷³õʼ»¯ - CreateTrigger()
2. ´¥·¢Æ÷ʼþ×¢²á - TriggerRegister*Event()
3. ¶¨Òå´¥·¢Ìõ¼þ(¿ÉÑ¡) - TriggerAddCondition()
4. ´¥·¢Æ÷¶¯×÷ - TriggerAddAction()
×¢Òâ:
1. ´´½¨´¥·¢Æ÷±ØÐëÏÈÓÃCreateTrigger()³õʼ»¯.
2. ûÓÐ×¢²áʼþµÄ´¥·¢Æ÷Ö»ÊǸö´¦Àí¹ý³Ì, ²»»áÏìӦʼþÖ´ÐгÌÐò
3. ´¥·¢Æ÷¿ÉÒÔ²»¼Ó´¥·¢Ìõ¼þ, ÒòΪ¿ÉÒÔÓô¥·¢¶¯×÷µ÷Óõĺ¯ÊýÀ´¿ØÖÆÂß¼.
2)Ïß³Ì(Threads)
(Õⲿ·ÖÊôÓÚAI²¿·Ö, ×÷ΪÈëÃÅÕß×öÒ»°ãÐÔÁ˽â¾ÍÐÐÁË, ÒòΪAI¶¼ÊÇ´¿JASSдµÄ, ҲûÓÐÕæÕýºÃµÄAI EDITOR. ±¾ÈËÒ²¶Ô´ËÒ»Öª°ë½â, ¹ØÓÚAIµÄÎÄÕÂÒ²²»¶à, ûʲôºÃ²Î¿¼µÄ.)
Ïß³ÌÖ»Ó¦ÓÃÓÚAI½Å±¾(AI JASS), ²»ÄÜÓÃÓÚ´¥·¢Æ÷½Å±¾(Trigger Jass). ͨ³£, µ±AI½Å±¾¿ªÊ¼ÔËÐÐʱֻ´´½¨Ò»¸öÏß³Ì, ´´½¨¸ü¶àµÄÏ߳̿ÉÒÔÓÃcomman.jµÄ±¾µØº¯Êý:
native StartThread takes code func returns nothing
µ÷Óà call StartThread(function myfunc) ½«´´½¨Ò»¸ö´Óº¯Êýmyfunc¿ªÊ¼Ö´ÐеÄÏß³Ì.
ÿ¸öÍæ¼Ò×î¶à¿ÉÒÔÓµÓÐ6¸öÏß³Ì, °üÀ¨Ò»¿ªÊ¼Ö´ÐеÄÖ÷Ïß³Ì. µ±Ò»¸öÍæ¼ÒÓÐ6¸öÏß³ÌÊýʱ, µ÷ÓÃStartThread()µÄÓï¾ä½«±»ºöÂÔ. Ï̲߳»ÄÜ»ØÊÕ, µ±ÄãÎªÄ³Íæ¼Ò´´½¨ÁË5¸ö×Ô¶¨ÒåÏß³Ì, ½«ÎÞ·¨Îª¸ÃÍæ¼Ò´´½¨¸ü¶àµÄÏß³Ì.
µ±ÐÂÏ̴߳´½¨Ê±, Ïß³ÌÁ¢¼´ÉúЧ. µ±Ïß³ÌÈò½Ö´ÐÐʱ, ´´½¨´ËÏ̵߳ĸ¸Ï߳̽«¼ÌÐøÖ´ÐÐ.
ÔÚÍ¬Ò»Íæ¼ÒÖеÄËùÓÐÏ̶߳¼¹²ÏíÈ«¾Ö״̬(°üÀ¨±äÁ¿). ¼´ÊÇÐÞ¸Äij¸öÈ«¾Ö±äÁ¿, Ð޸ĺóµÄÖµÔÚ´ËÍæ¼ÒµÄËùÓÐÏß³ÌÖж¼ÊǿɼûµÄ.
Ïß³ÌÔÚÒÔϵÄÇé¿öÈò½Ö´ÐÐ, ·µ»Ø¸¸Ïß³Ì
a) µ±Ïß³ÌÖеIJÙ×÷Âë(opcode)³¬³öÏÞÖÆ, Ï̻߳á×Ô¶¯ÐÝÃß 1 Ãë
b) µ±Ïß³ÌÖÐÓÃʹÓà Sleep(n), Ï߳̽«ÐÝÃß n Ãë, È»ºó¼ÌÐøÖ´ÐÐ.
Ïß³ÌÔÚÒÔÏÂÇé¿ö»áÖÐÖ¹, ·µ»Ø¸¸Ïß³Ì
a) Èç¹û call StartThread(null)ÖÐ, Ïß³ÌÖÐÖ¹
b) µ±Ï̵߳ÄÖ÷º¯Êý·µ»Ø, Ïß³ÌÖÐÖ¹.
(StartThread()ÖÐÖ®¼äµ÷Óõĺ¯Êý¾ÍÊÇÖ÷º¯Êý.)
c) µ±Ïß³ÌÖÐʹÓÃûÓÐÉùÃ÷µÄ±äÁ¿, Ïß³ÌÖÐÖ¹. ÔÚʹÓÃ֮ǰ, ±äÁ¿±ØÐëÉùÃ÷.
d) µ±Ïß³ÌÖгöÏÖÁãΪ±»³ýÊýʱ, Ïß³ÌÖÐÖ¹
e) Ïß³ÌÖ÷º¯Êý³öÏÖÓï·¨´íÎó.
×¢Òâ: ËäÈ»AI½Å±¾¿ÉÒÔʹÓô󲿷Öcommon.jµÄ¿âº¯Êý, µ«ÓÐЩÀàÐ͵ĺ¯ÊýÔÚAI²»ÄÜÕý³£¹¤×÷, Èç:
a) ·µ»Ø×Ö·û´®ÀàÐÍ(string)µÄ±¾µØº¯Êý, ÈçI2S(), SubString()µÈ
b) ÐèÒªÒÔcode, trigger, boolexpr µÈÀàÐÍÊý¾ÝΪ²ÎÊýµÄ±¾µØº¯Êý, Èç´¥·¢Æ÷º¯Êý, ¶ÓÁк¯Êý(ForGroup, µÈ)
×¢Òâ: AIÖв»¿ÉÒÔʹÓÃBlizzard.jµÄº¯Êý, ´¥·¢Æ÷ÖÐÒ²²»¿ÉÒÔʹÓÃcommon.aiµÄº¯Êý, AIºÍ´¥·¢Æ÷¶¼¿ÉÒÔʹÓÃcommon.jµÄº¯Êý(µ±È», ¶ÔÓÚAI, »¹ÊÜÉÏÃæËù˵µÄÏÞÖÆ)
common.aiºÍcommon.jÊÇдAIʱ¿ÉÒÔµ÷ÓúͲο¼¿âÎļþ, ÒªÑо¿AI, ÏÈÈ¥¶ÁÕâ2¸öÎļþ.
3) ¿ç½Å±¾Í¨Ñ¶(Inter-Script Communication)
ÔÚÓÎÏ·ÖÐ, ¿ÉÄÜ»áÓжà¸ö¶ÀÁ¢µÄJass½Å±¾ÎļþͬʱÔËÐÐ. ±ÈÈçÔÚ¶ÔÕ½µØÍ¼ÖеÄÓÎÏ·, ÔËÐд¥·¢Æ÷½Å±¾ÎļþµÄͬʱ, Ò²¿ÉÄÜÔËÐÐÁËÿ¸öµçÄÔÍæ¼ÒµÄAI½Å±¾Îļþ. ÿ¸ö½Å±¾ÎļþÖ®¼äµÄÈ«¾Ö±äÁ¿²»Êǹ²ÏíµÄ. ËùÒÔ, Ò»¸öµçÄÔÍæ¼ÒµÄAI½Å±¾ÖÐÉèÖõÄÈ«¾Ö±äÁ¿²»»áÓ°ÏìÁíÒ»¸öµçÄÔÍæ¼ÒµÄAI½Å±¾µÄÖ´ÐÐ.
´¥·¢Æ÷½Å±¾Ò²²»¿ÉÒÔºÍAI½Å±¾¹²ÏíÈ«¾Ö±äÁ¿. µ«¿ÉÒÔÓô«µÝÃüÁîµÄ·½·¨½øÐнű¾Ö®¼äµÄÊý¾Ý½»»». ÃüÁîÓÉÒ»¶ÔÊýÖµÐÍÊý¾Ý(integer)×é³É: ÃüÁîÖµ(command value)ºÍÊý¾ÝÖµ(data value).
´Ó´¥·¢Æ÷½Å±¾ÏòAI½Å±¾·¢³öͨѶÃüÁî, ¿ÉÒÔʹÓÃcommon.jÖж¨ÒåµÄÒÔϱ¾µØº¯Êý:
native CommandAI takes player num,
integer command, integer data returns nothing
²ÎÊý:
player num //Íæ¼Ò
integer command //ÃüÁî
integer data //ÃüÁîÊý¾Ý
ÒÔÏÂÊÇAIÖÐʹÓõÄcommon.jº¯Êý, ×¢Òâ: ÿ¸öµçÄÔÍæ¼Ò¶¼»áÓжÀÁ¢µÄAI½Å±¾, ËùÒÔ, ÒÔϺ¯Êý¶¼Ã»ÓÐÒªÇóÍæ¼Ò×÷Ϊº¯Êý²ÎÊý.
ÿ¸öµçÄÔÍæ¼Ò¶¼ÓÐÃüÁî¶ÑÀ´¶Ñ·Å½ÓÊܵ½µÄÃüÁî. ÏëÖªµÀÓжàÊý¸öÃüÁî¶Ñ·ÅÔÚÃüÁî¶Ñ, ¿ÉÒÔÓÃÏÂÃæµÄº¯Êý:
native CommandsWaiting takes nothing returns integer
²ÎÊý: ÎÞ
·µ»Ø: ÃüÁî¶ÑµÄÃüÁîÊý(integer)
»ñµÃ´æ·ÅÔÚÃüÁî¶ÑÖÐ×î¶¥¶ËµÄÃüÁî():
//·µ»ØÃüÁî
native GetLastCommand takes nothing returns integer
//·µ»ØÃüÁîÊý¾Ý
native GetLastData takes nothing returns integer
ÉÏÃæ2¸öº¯Êý¶¼²»»áÒÆ³ýÃüÁî¶ÑÖеÄÃüÁî, ÒªÒÆ³ý¶ÑÖеÄÃüÁî, ¿ÉÒÔÓÃ:
native PopLastCommand takes nothing returns nothing
4) ¶ÓÁÐ(Enumerations)
ËäÈ»JASS²»ÄÜ×Ô¶¨ÒåÊý¾Ý½á¹¹(ÒòΪJASSȱÉÙÖ¸Õë²Ù×÷·û), µ«API¿âÖÐÌṩÁËһЩʵÏÖ¶ÓÁвÙ×÷µÄº¯Êý. ÈçÒ»×鵥λΪµ¥Î»×é(group), Ò»×éÍæ¼ÒÎªÊÆÁ¦(force), ËäȻһ×é¿ÉÆÆ»µÎïûÓÐÃ÷È·¶¨ÒåËüµÄÊý¾ÝÀàÐÍ, µ«Ò²¿ÉÒÔÓÃAPIº¯ÊýÀ´²Ù×÷.
µ¥Î»×éºÍÊÆÁ¦µÄ²Ù×÷º¯ÊýºÜÀàËÆ.
µ¥Î»×é´¦Àíº¯Êý
// ³õʼ»¯µ¥Î»×é
native CreateGroup takes nothing returns group
// ÔÚÖ¸¶¨µ¥Î»×éÖÐÔö¼ÓÖ¸¶¨µ¥Î»
native GroupAddUnit takes group whichGroup, unit whichUnit returns nothing
// ÔÚÖ¸¶¨µ¥Î»×éÖÐÒÆ³ýÖ¸¶¨µ¥Î»
native GroupRemoveUnit takes group whichGroup, unit whichUnit returns nothing
ÊÆÁ¦´¦Àíº¯Êý
// ³õʼ»¯ÊÆÁ¦
native CreateForce takes nothing returns force
// ÔÚÖ¸¶¨ÊÆÁ¦ÖÐÔö¼ÓÖ¸¶¨Íæ¼Ò
native ForceAddPlayer takes force whichForce, player whichPlayer returns nothing
// ÔÚÖ¸¶¨ÊÆÁ¦ÖÐÒÆ³ýÖ¸¶¨Íæ¼Ò
native ForceRemovePlayer takes force whichForce, player whichPlayer returns nothing
JASS²»ÄÜÖ±½Ó²Ù×÷¶ÓÁÐÀïÃæµÄÔªËØ, ËüÊÇͨ¹ýcallbackÀàÐ͵ĺ¯ÊýÀ´ÊµÏÖ¶Ô¶ÓÁеIJÙ×÷:
// ¶ÔÖ¸¶¨µ¥Î»×éÖеÄÿ¸öµ¥Î»¶¼ÔËÐÐÖ¸¶¨callbackº¯Êýcallback
// (¶ÔÓ¦GUIÓïÑÔµÄFor Each Unit in <Group>)
native ForGroup takes group whichGroup, code callback returns nothing
// ¶ÔÖ¸¶¨ÊÆÁ¦ÖеÄÿ¸öÍæ¼Ò¶¼ÔËÐÐÖ¸¶¨callbackº¯Êýcallback
// (¶ÔÓ¦GUIÓïÑÔµÄFor Each Player in <Force>)
native ForForce takes force whichForce, code callback returns nothing
ÊäÈëÉÏÃæÁ½¸öº¯ÊýµÄcallbackº¯Êý±ØÐëÊÇÎÞ²ÎÊýÎÞ·µ»ØÖµº¯Êý(takes nothing returns nothing)
ͬÑù, ²Ù×÷¿ÉÆÆ»µÎïÒ²¿ÉÒÔÓÃÔÚÇøÓòÄÚµÄ¿ÉÆÆ»µÎï×÷Ϊ¶ÓÁÐ, ¿ÉÒÔÒÔÓÃÀàËÆµÄ·½·¨:
// ÔÚÖ¸¶¨ÇøÓòrÄÚ·ûºÏÖ¸¶¨¹ýÂËÆ÷filterµÄ¶¼ÔËÐÐÖ¸¶¨callbackº¯ÊýactionFunc
// (¹ýÂËÆ÷¼ûϽڵĽ²½â)
native EnumDestructablesInRect takes rect r,
boolexpr filter, code actionFunc returns nothing
ÔÚcallbackº¯Êý, ¿ÉÒÔÓÃÏÂÃæµÄº¯Êý»ñµÃ¶ÓÁÐÖеÄÏÂÒ»¸öÔªËØ:
// »ñµÃµ¥Î»×éÖеÄÏÂÒ»¸öµ¥Î»
// (¶ÔÓ¦GUIÓïÑÔµÄPick Every Unit in <Group>)
constant native GetEnumUnit takes nothing returns unit
// »ñµÃÊÆÁ¦ÖеÄÏÂÒ»¸öÍæ¼Ò
// (¶ÔÓ¦GUIÓïÑÔµÄPick Every Player in <Force>)
constant native GetEnumPlayer takes nothing returns player
// »ñµÃ¿ÉÆÆ»µÎï×éÖеÄÏÂÒ»¸ö¿ÉÆÆ»µÎï
// (¶ÔÓ¦GUIÓïÑÔµÄPick Every Destructables in <Region>)
constant native GetEnumDestructable takes nothing returns destructable
×¢Òâ: AIÖв»Ö§³Ö¶ÓÁк¯ÊýµÄʹÓÃ.
ÕâÊÇɱËÀµ¥Î»×éÖÐËùÓе¥Î»µÄʵÀý:
// ÕâÊÇcallbackº¯Êý, ÎÞ²ÎÊý²¢ÎÞ·µ»ØÖµ
function KillGroupCallback takes nothing returns nothing
// »ñµÃµ¥Î»×éÖеÄÏÂÒ»¸öµ¥Î»
local unit nextUnit = GetEnumUnit()
// ɱËÀ¸Ãµ¥Î»
call KillUnit(nextUnit)
endfunction
// µ÷ÓÃForGroup
// ¶Ôµ¥Î»×égroupToKillÖеÄÿ¸öµ¥Î»¶¼ÔËÐк¯ÊýKillGroupCallback
call ForGroup(groupToKill, function KillGroupCallback)
ÁíÒ»¸ö¾³£ÊÇÓõÄÀý×ÓÊÇÔÚ¶ÓÁÐÖвéÕÒÌØ¶¨Ìõ¼þµÄÔªËØ. ²»ÐÒµÄÊÇ, ÒòΪJASSÖ»Ö§³Öcallbackº¯ÊýÀ´´¦Àí¶ÓÁÐÖеÄÔªËØ, ËùÒÔÖ»ÓÐÓÃÈ«¾Ö±äÁ¿À´±£´æ²»Í¬µ¥Î»µÄÊôÐÔ. ÏÂÃæÊÇÕÒ³öµ¥Î»×éÀïÉúÃü×î¸ßµÄµ¥Î»µÄÀý×Ó:
//¶¨ÒåÈ«¾Ö±äÁ¿
globals
//ÓÃÓÚ´¢´æÁ½µ¥Î»±È½Ïºó½Ï¸ßµÄÉúÃüÖµ, ³õʼ»¯Îª 0
real mostLifeSoFar
//ÓÃÓÚ´¢´æÁ½µ¥Î»±È½ÏºóÓнϸßÉúÃüÖµµÄµ¥Î», ³õʼ»¯Îª null
unit unitWithMostLifeSoFar
endglobals
//±È½Ïµ¥Î»ÉúÃüÖµµÄcallbackº¯Êý
function MostLifeCallback takes nothing returns nothing
//»ñµÃµ¥Î»×éÖеÄÏÂÒ»¸öµ¥Î»
local unit nextUnit = GetEnumUnit()
//»ñµÃµ¥Î»ÊôÐÔ - ÉúÃü
//UNIT_STATE_LIFEÊÇcommon.jÖж¨ÒåµÄ³£Á¿
local real life = GetUnitState(nextUnit, UNIT_STATE_LIFE)
//±È½ÏÉúÃüÖµ
if life > mostLifeSoFar then
//°Ñ½Ï´óµÄÉúÃüÖµ´¢´æ
set mostLifeSoFar = life
//°ÑÓнϴóÉúÃüµÄµ¥Î»´¢´æ
set unitWithMostLifeSoFar = nextUnit
endif
endfunction
...
//³õʼ»¯È«¾Ö±äÁ¿µÄֵΪ¿ÕÖµ
set mostLifeSoFar = 0
set unitWithMostLifeSoFar = null
//µ÷ÓÃForGroup
//¶Ôµ¥Î»×émyGroupÖеÄÿ¸öµ¥Î»¶¼ÔËÐк¯ÊýMostLifeCallback±È½ÏÉúÃü
call ForGroup(myGroup, function MostLifeCallback)
//ÉϾäÔËÐкó, È«¾Öµ¥Î»ÀàÐͱäÁ¿unitWithMostLifeSoFar±ãÖ¸Ïòµ¥Î»×émyGroupÖÐ×î¸ßÉúÃüµÄµ¥Î», »ò:
//Èç¹ûµ¥Î»×émyGroupÊÇ¿Õ×é, ÄÇôunitWithMostLifeSoFar±ãÊÇ¿ÕÖµnull
...
µ±È», ʵÏÖ¶ÓÁвÙ×÷, Ò²¿ÉÒÔÓÃÊý×éµÄ·½·¨À´´¦Àí. µ«, Êý×é²»ÄÜʹÓýô½Ó×ÅҪ˵µÄ¶ÓÁйýÂËÆ÷, Ò²²»Äܶ¨ÒåÊý×éÖаüº¬Êý×é. ÕâЩ¶¼ÊǶÓÁÐËùÓµÓеÄÓÅÊÆ, Èç¿ÉÒÔÓÐÊý×éÐ͵ĵ¥Î»×é(Ï൱ÓÚÊý×éÖаüº¬Êý×é), Ò²¿ÉÒÔÓöÓÁйýÂËÆ÷.
|