找回密码
 点一下
查看: 1149|回复: 11

JASS_loop读取单位多了1次?

[复制链接]
发表于 2008-12-19 22:37:42 | 显示全部楼层 |阅读模式
[jass]①function Trig_A01J_Actions takes nothing returns nothing
XXXXXXXXXXXXXXXXXXXXXX........
    local integer i = 1
    loop
        exitwhen i > 8
        set ua = CreateUnit(GetOwningPlayer(u),'n001',ux+100*Cos(45*i*3.14159/180),uy+100*Sin(45*i*3.14159/180),0.00)
        call UnitApplyTimedLife(ua,'BTLF',55)
        call SetUnitVertexColor(ua,255,255,255,102)
        call StoreInteger(GameCache(),I2S(H2I(t)),"UNIT"+I2S(i),H2I(ua))
        set i = i+1
        set ua = null
    endloop
    loop
        exitwhen i > 8
        set ua = I2U(GetStoredInteger(GameCache(),I2S(H2I(t)),"UNIT"+I2S(i)))
        call RemoveUnit(ua)
        set i = i+1
        set ua = null
    endloop
endfunction

②function Trig_A01J_Bctions takes nothing returns nothing
    local unit array ua
    local integer i = 1
    loop
        exitwhen i > 9
        set ua = I2U(GetStoredInteger(GameCache(),I2S(H2I(GetExpiredTimer())),"UNIT"+I2S(i)))
        call RemoveUnit(ua)
        set i = i+1
        set ua = null
endfunction[/jass]为什么触发1调用缓存单位1-8能够调用得到,而触发2却要1-9才能取完全部单位.这是怎么回事?
发表于 2008-12-19 22:55:45 | 显示全部楼层
明显你第一个函数写的有问题,下面一个循环等于什么都没干
回复

使用道具 举报

 楼主| 发表于 2008-12-19 23:04:14 | 显示全部楼层
[jass]哎呀,我还是发全部出来好了.这是模仿的 群魔践踏
下面的set i = R2I(GetRandomReal(1.00,9.00))将9改为8,就取不了最后那个...

function Trig_A01J_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A01J'
endfunction

function Trig_A01J_Bctions takes nothing returns nothing
    local unit array ua
    local integer r = 1
    local integer i
    loop
        exitwhen r > 9
        set i = R2I(GetRandomReal(1.00,9.00))
        set ua = I2U(GetStoredInteger(GameCache(),I2S(H2I(GetExpiredTimer())),"UNIT"+I2S(i)))
        if GetRandomInt(1,2) == 1 then
            call SetUnitAnimation(ua,"attack slam")
        else
            call SetUnitAnimation(ua,"spell")
        endif
        set r = r+1
        set ua = null
    endloop
endfunction

function Trig_A01J_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local unit ut = GetSpellTargetUnit()
    local unit array ua
    local timer t = CreateTimer()
    local real ux = GetUnitX(ut)
    local real uy = GetUnitY(ut)
    local integer i = 1
    local string s
    call UnitAddType(ut,UNIT_TYPE_GIANT)
    call PauseUnit(ut,true)
    call SetUnitInvulnerable(ut,true)
    call TriggerSleepAction(1.00)
    loop
        exitwhen i > 8
        call DestroyEffect(AddSpecialEffect("Abilities\\\\Spells\\\\Undead\\\\AnimateDead\\\\AnimateDeadTarget.mdl",ux+100*Cos(45*i*3.14159/180),uy+100*Sin(45*i*3.14159/180)))
        set i = i+1
    endloop
    set i = 1
    call TriggerSleepAction(0.50)
    loop
        exitwhen i > 8
        set ua = CreateUnit(GetOwningPlayer(u),'n001',ux+100*Cos(45*i*3.14159/180),uy+100*Sin(45*i*3.14159/180),45*i+180)
        call UnitApplyTimedLife(ua,'BTLF',55)
        call SetUnitVertexColor(ua,255,255,255,102)
        call StoreInteger(GameCache(),I2S(H2I(t)),"UNIT"+I2S(i),H2I(ua))
        set i = i+1
        set ua = null
    endloop
    set i = 1
    call TriggerSleepAction(0.10)
    loop
        exitwhen i > 8
        set ua = I2U(GetStoredInteger(GameCache(),I2S(H2I(t)),"UNIT"+I2S(i)))
        call IssueImmediateOrderById(ua,852127)
        call SetUnitAnimation(ua,"spell")
        set i = i+1
        set ua = null
    endloop
    call SetUnitAnimation(ut,"death")
    set i = 1
    call TriggerSleepAction(1.5)
    loop
        exitwhen i > 8
        set ua = I2U(GetStoredInteger(GameCache(),I2S(H2I(t)),"UNIT"+I2S(i)))
        if GetRandomInt(1,2) == 1 then
            call SetUnitAnimation(ua,"attack slam")
        else
            call SetUnitAnimation(ua,"spell")
        endif
        set i = i+1
        set ua = null
        call TriggerSleepAction(0.10)
    endloop
    set i = 1
    call TriggerSleepAction(1.0)
    call TimerStart(t,0.5,true,function Trig_A01J_Bctions)
    call TriggerSleepAction(12.5)
    call PauseTimer(t)
    call DestroyTimer(t)
    call TriggerSleepAction(1.5)
    if GetRandomInt(1,2) == 1 then
        set s = "attack slam"
    else
        set s = "spell"
    endif
    loop
        exitwhen i > 8
        set ua = I2U(GetStoredInteger(GameCache(),I2S(H2I(t)),"UNIT"+I2S(i)))
        call SetUnitAnimation(ua,s)
        set i = i+1
        set ua = null
    endloop
    set i = 1
    call TriggerSleepAction(2.10)
    call UnitRemoveType(ut,UNIT_TYPE_GIANT)
    call PauseUnit(ut,false)
    call SetUnitInvulnerable(ut,false)
    call UnitDamageTarget(u,ut,8888.00,true,false,ATTACK_TYPE_HERO,DAMAGE_TYPE_UNKNOWN,WEAPON_TYPE_WHOKNOWS)
    loop
        exitwhen i > 8
        set ua = I2U(GetStoredInteger(GameCache(),I2S(H2I(t)),"UNIT"+I2S(i)))
        call RemoveUnit(ua)
        call DestroyEffect(AddSpecialEffect("Abilities\\\\Spells\\\\Undead\\\\AnimateDead\\\\AnimateDeadTarget.mdl",ux+100*Cos(45*i*3.14159/180),uy+100*Sin(45*i*3.14159/180)))
        set i = i+1
        set ua = null
    endloop
    call SetSoundPosition(gg_snd_DuneWormDeath1,ux,uy,0.00)
    call FlushStoredMission(GameCache(),I2S(H2I(t)))
    set u = null
    set ut = null
    set t = null
endfunction

//===========================================================================
function InitTrig_A01J takes nothing returns nothing
    set gg_trg_A01J = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(gg_trg_A01J,EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(gg_trg_A01J,Condition(function Trig_A01J_Conditions))
    call TriggerAddAction(gg_trg_A01J,function Trig_A01J_Actions)
endfunction[/jass]
回复

使用道具 举报

发表于 2008-12-19 23:16:19 | 显示全部楼层
先对lz的函数名深感无奈:Action是动作,Bction是什么意思…………………………………………

那个Bction(看着就想笑)里的循环次数跟有没有取完似乎毫无关系,你取的项是随机整数i作下标的,也就是说你取的项是不定的,说不定已经被置空了,循环整数r似乎只是摆设而已
回复

使用道具 举报

 楼主| 发表于 2008-12-19 23:23:05 | 显示全部楼层
即是什么意思?你不是说函数名无关系的么?还有我向缓存里存了1-8个的单位.我写成随机1-8,总有机会1-8都会出现的吧?啊~~
r循环9次,是为了让每个单位都有机会出现动作而已....
回复

使用道具 举报

发表于 2008-12-19 23:26:15 | 显示全部楼层
函数名是没有关系,但一般的函数名都是贴近于函数功能的,不过你喜欢也无所谓,只不过代码风格差点而已

8次随机1-8就会出现1-8的随机排列了么?lz好天真啊,难道没考虑过出现11111111这种情况么?不说这种极端情况,随便出了两次相同的就不行了
回复

使用道具 举报

 楼主| 发表于 2008-12-19 23:35:38 | 显示全部楼层
引用第5楼zhuzeitou于2008-12-19 23:26发表的  :
函数名是没有关系,但一般的函数名都是贴近于函数功能的,不过你喜欢也无所谓,只不过代码风格差点而已

8次随机1-8就会出现1-8的随机排列了么?lz好天真啊,难道没考虑过出现11111111这种情况么?不说这种极端情况,随便出了两次相同的就不行了



随机会出现1-8的现象,不信你试下我的代码做成技能就知道了.25次的循环不会出现1111111.总不会1个单位都不动.若把我刚才说的,将下面的set i = R2I(GetRandomReal(1.00,9.00))将9改为8,就会出现1个单位永远不动的情况,相反改为9,全部都会动.
回复

使用道具 举报

发表于 2008-12-19 23:43:01 | 显示全部楼层
其实是 A ction 和B ction 也就是动作A 动作B的意思。。。哈哈
那个9么。。要问原作者啦。估计这个J不是LZ自己写的。。
我发个回帖要发10分钟。。。。晕死
可能你的固定随机种子打开了。把那个勾掉试一试
回复

使用道具 举报

 楼主| 发表于 2008-12-19 23:46:17 | 显示全部楼层
引用第7楼hydralisk于2008-12-19 23:43发表的  :
其实是 A ction 和B ction 也就是动作A 动作B的意思。。。哈哈
那个9么。。要问原作者啦。估计这个J不是LZ自己写的。。
我发个回帖要发10分钟。。。。晕死
可能你的固定随机种子打开了。把那个勾掉试一试



这全部就是我自己写的

(固定随机种子打开了)?是什么意思?
回复

使用道具 举报

发表于 2008-12-19 23:49:23 | 显示全部楼层
那可能只是偶然而已,如果每次都是同样的情况,请检查你是否改随机种子,或者就是你rp太好了

固定随机种子没去掉的话,每次随机的结果是一样的,在菜单-文件-参数设置的地图测试选项卡里,自己找吧
回复

使用道具 举报

 楼主| 发表于 2008-12-19 23:53:13 | 显示全部楼层
改为8,我放了15分钟技能...我不知道是假还是真了.
回复

使用道具 举报

发表于 2008-12-19 23:57:40 | 显示全部楼层
而且感觉你的技能完全没必要用随机下标,一个一个挨下来按随机数播放下标不就好了,反正每个播放的都是这两个选一个,要随机下标不是自己找麻烦么

随机下标顺序不是那么容易的事情,随机之后最好判断选中的那项是不是为空,如果为空那么继续随机,直到不为空,进行接下去的动作,这样需要在嵌套一个loop的
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-21 12:20 , Processed in 0.039019 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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