找回密码
 点一下
查看: 1006|回复: 12

本人写的第一个J,求助

[复制链接]
发表于 2012-1-4 12:31:44 | 显示全部楼层 |阅读模式
在学习了一段时间J后,昨天第一次尝试用J来写,
大致目的是,山丘放战争践踏,就会在他周围召唤5层,每层6-9个小精灵,
在经过一番报错修改,报错修改之后,终于不报错了,可以运行的时候缺没有效果。
请朋友帮忙看一下,因为这是自己写的第一个J,很想知道原因和解决方法。
地图在此
3Q
魔兽是1.20的
123.w3x (21 KB, 下载次数: 9)

[jass]
globals
    unit u1=null
    location loc1=null
    group g1=null
endglobals

function loc takes integer a,integer b,integer c returns location
    local location l
    set l = PolarProjectionBJ(GetUnitLoc(u1),200+50*I2R(a),I2R(b)*360/I2R(c))
    return l
endfunction

function leo1_ff takes nothing returns nothing
    local integer k = 1
    local integer n = 0
    local integer r
    set r = GetRandomInt(6,9)
    if(k<=5)then
        loop
        exitwhen(n>r)
        call CreateUnitAtLoc(GetOwningPlayer(u1),'e000',loc(k,n,r),AngleBetweenPoints(loc1,loc(k,n,r)))
        call GroupAddUnit(g1,GetLastCreatedUnit())
        set n = n+1
        endloop
        set k = k+1
    else
        call DisableTrigger(GetTriggeringTrigger())
    endif
endfunction

function leo1_c takes nothing returns boolean
    if(GetSpellAbilityId()=='A000')then
        return true
    endif
        return false
endfunction        

function leo1_f takes nothing returns nothing
    local timer t = CreateTimer()
    set u1 = GetTriggerUnit()
    set loc1 = GetUnitLoc(u1)
    call TimerStart(t,0.5,true,function leo1_ff)
endfunction   

function leo1 takes nothing returns nothing
    call TriggerRegisterAnyUnitEventBJ(GetTriggeringTrigger(),EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(GetTriggeringTrigger(),Condition(function leo1_c))
    call TriggerAddAction(GetTriggeringTrigger(),function leo1_f)
endfunction[/jass]
发表于 2012-1-4 17:13:24 | 显示全部楼层
你u1没有赋值
回复

使用道具 举报

 楼主| 发表于 2012-1-4 18:27:04 | 显示全部楼层

回 1楼(杀戮机器) 的帖子

杀戮机器:你u1没有赋值&#160;(2012-01-04 17:13)&#160;
确实忘了,定义上了,还是不行呐
回复

使用道具 举报

发表于 2012-1-4 18:42:35 | 显示全部楼层
你需要两个LOOP语句,你的k = k + 1在循环外,导致只会创建一层吧
...你可以使用BJDeBug函数来进行输出,检查你自己的触发
  在触发器动作函数最开始加上
[jass]
call BJDeBug(“Triggeing”)
[/jass]
在loop语句下加上

[jass]call BJDeBug( I2R(n))
[/jass]
在loop语句后加上

[jass]
call BJDeBug( I2R(k))
[/jass]
你可以使用这种方法来检查是哪里出了问题...war3就这么一个人Debug函数,孩子,首先要学会使用Debug,这样才能自己找自己毛病...
回复

使用道具 举报

发表于 2012-1-4 21:32:51 | 显示全部楼层
贴代码的话可以在前后加上[ jass]和[ /jass]
空格去掉~
回复

使用道具 举报

 楼主| 发表于 2012-1-6 10:57:25 | 显示全部楼层

回 4楼(chyj4747) 的帖子

chyj4747:贴代码的话可以在前后加上[ jass]和[ /jass]
空格去掉~&#160;(2012-01-04 21:32)&#160;
我试了好多遍,终于找到原因了,是不是主function必须为全局触发,然后在InitCustomTriggers里调用它?
回复

使用道具 举报

发表于 2012-1-6 11:05:53 | 显示全部楼层
教授坐飞机:我试了好多遍,终于找到原因了,是不是主function必须为全局触发,然后在InitCustomTriggers里调用它? (2012-01-06 10:57)
[jass]function leo1 takes nothing returns nothing
    call TriggerRegisterAnyUnitEventBJ(GetTriggeringTrigger(),EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(GetTriggeringTrigger(),Condition(function leo1_c))
    call TriggerAddAction(GetTriggeringTrigger(),function leo1_f)
endfunction
[/jass]
LZ这段好奇怪……这个函数是由别的触发器触发而作用的函数?
不是的话为什么触发器是GetTriggeringTrigger?
而且如果是的话那么你的之前调用此函数的触发器就只能触发一次,因为在这里改掉了事件条件动作。。。
  

你先告诉我你这段函数是不是在一个新建触发里?


另外表示全局变量不用赋值。。创建全局的时候自动赋值的
回复

使用道具 举报

 楼主| 发表于 2012-1-7 10:26:53 | 显示全部楼层

回 6楼(chyj4747) 的帖子

chyj4747:[jass]function leo1 takes nothing returns nothing
&#160;&#160;&#160;&#160;call TriggerRegisterAnyUnitEventBJ(GetTriggeringTrigger(),EVENT_PLAYER_UNIT_SPELL_EFFECT)
&#160;&#160;&#160;&#160;call TriggerAddCondition(GetTriggeringTrigger(),Condition(function leo1 ..&#160;(2012-01-06 11:05)&#160;
其实这段我一开始是这样写的
[jass]
function leo1 takes nothing returns nothing
    local trigger a=CreateTrigger()
&#160; &#160; call TriggerRegisterAnyUnitEventBJ(a,EVENT_PLAYER_UNIT_SPELL_EFFECT)
&#160; &#160; call TriggerAddCondition(a,Condition(function leo1_c))
&#160; &#160; call TriggerAddAction(a,function leo1_f)
    set a=null
endfunction
[/jass]
发现没有效果
后来改成了
[jass]
function leo1 takes nothing returns nothing
    set gg_trg_leo1=CreateTrigger()
&#160; &#160; call TriggerRegisterAnyUnitEventBJ(gg_trg_leo1,EVENT_PLAYER_UNIT_SPELL_EFFECT)
&#160; &#160; call TriggerAddCondition(gg_trg_leo1,Condition(function leo1_c))
&#160; &#160; call TriggerAddAction(gg_trg_leo1,function leo1_f)
endfunction
[/jass]
gg_trg_leo1为我在globals里定义的触发变量
然后就可以运行了


到后来,我发现
[jass]
call CreateUnitAtLoc()    //无效

call CreateNUnitsAtLoc()     //这个可以用
[/jass]
回复

使用道具 举报

发表于 2012-1-7 11:23:04 | 显示全部楼层
(1)我打开你那个图是空的,木有触发……LZ是不是优化过了?还是说我的UI版本不够……
(2)局部变量创建触发器肯定有效,不需要全局,LZ肯定哪里弄错了……所以之前我才让你截个WE的图过来,包括触发的名字,就是左边列表里的触发名
(3)
[jass]

function loc takes integer a,integer b,integer c returns location
    local location l
    set l = PolarProjectionBJ(GetUnitLoc(u1),200+50*I2R(a),I2R(b)*360/I2R(c))
    return l
endfunction[/jass]
这段不要这么写,这样写每次都会泄露一个局部点变量
直接写下面这样不就好了……

[jass]
function loc takes integer a,integer b,integer c returns location   
       return PolarProjectionBJ(GetUnitLoc(u1),200+50*I2R(a),I2R(b)*360/I2R(c))
endfunction[/jass]
(4)CreateUnitAtLoc不可能无效,并且我刚刚也测过了,所以说肯定是哪里写的有问题
回复

使用道具 举报

发表于 2012-1-7 11:29:53 | 显示全部楼层
或者LZ换成原版或红狼WE,然后复制黏贴触发保存后再传一次~
回复

使用道具 举报

 楼主| 发表于 2012-1-7 14:48:54 | 显示全部楼层

回 9楼(chyj4747) 的帖子

chyj4747:或者LZ换成原版或红狼WE,然后复制黏贴触发保存后再传一次~ &#160;(2012-01-07 11:29)&#160;
没有写触发,直接用J写的。我回去再试试你说的那几点
回复

使用道具 举报

发表于 2012-1-7 22:31:45 | 显示全部楼层
教授坐飞机:没有写触发,直接用J写的。我回去再试试你说的那几点 (2012-01-07 14:48)
。。。你别误解了触发和T啊
只要你新建了触发器并通过其响应来做动作那么就是个触发……
T是指GUI的那些事件条件动作

我说的没触发就是里面连J的东西都没有,脚本里是空的,只有一个“初始化”文件夹,文件夹里也什么都没有
回复

使用道具 举报

发表于 2012-1-8 12:53:05 | 显示全部楼层

回 11楼(chyj4747) 的帖子

chyj4747:。。。你别误解了触发和T啊
只要你新建了触发器并通过其响应来做动作那么就是个触发……
T是指GUI的那些事件条件动作

.......&#160;(2012-01-07 22:31)&#160;
..很果断...
  楼主的事件都没被注册
   有效果,就鬼了
  所以他要用全局变量.....
  .....
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 13:21 , Processed in 0.094985 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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