请选择 进入手机版 | 继续访问电脑版

GA地精研究院

 找回密码
 立即注册
查看: 1979|回复: 32

[求助] 有没有在条件中等待之类的函数?

[复制链接]
发表于 2013-8-5 00:10:42 | 显示全部楼层 |阅读模式
例如我要在触发条件中写一个有等待的动作 TriggerSleepAction(),当然这个函数只能用在触发动作中,有没有在条件中也能用等待之类的函数?


未命名.jpg


像上图的循环中有等待,是用jass写在触发条件中,不能 TriggerSleepAction()函数


怎么办,有没有解决的方法?求各位大神帮帮忙,非常感谢!!!
未命名.jpg
发表于 2013-8-5 01:04:03 | 显示全部楼层
triggercondition中不能等待,遇到等待会直接跳过剩余动作,就算是Jass也不行
你可以把条件写到动作的IF语句当中

点评

你好,我想问一下,jass能编写 物体管理器 技能 物品 单位 等属性吗?如何编写? 自定义技能等  详情 回复 发表于 2013-8-7 02:33

评分

参与人数 1互助 +3 收起 理由
疯人¢衰人 + 3

查看全部评分

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2013-8-5 03:37:38 | 显示全部楼层
哦,这样啊!我听说triggercondition中执行比较高所以才写在里面去了!结果出问题了!呵呵!再次感谢你!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-7 02:33:21 | 显示全部楼层
希瓦 发表于 2013-8-5 01:04
triggercondition中不能等待,遇到等待会直接跳过剩余动作,就算是Jass也不行
你可以把条件写到动作的IF语 ...

你好,我想问一下,jass能编写 物体管理器 技能 物品 单位 等属性吗?如何编写? 自定义技能等
回复 支持 反对

使用道具 举报

发表于 2013-8-7 21:43:23 | 显示全部楼层
frank630520 发表于 2013-8-7 02:33
你好,我想问一下,jass能编写 物体管理器 技能 物品 单位 等属性吗?如何编写? 自定义技能等

jass不能在游戏运行时动态修改单位类型数据,技能数据,物品数据;
动态创建自定义技能就更不可能了

newgen或ydwe中使用lua可以在编译时(保存地图)对物体编辑器进行修改
功能强大,但是只能在编译时进行

ydwe的新功能,japi函数可以在一定程度上实现动态修改物编的功能
但是使用了这个功能之后,你的地图就只能在11平台上运行了
或者你需要每次都使用YDWE测试地图来打开魔兽

总之来说,jass还没那么强大,可以想想其它的办法

点评

作图的时候用jass也不行吗?那么jass只能写脚本吗?  详情 回复 发表于 2013-8-7 23:08
回复 支持 反对

使用道具 举报

发表于 2013-8-7 22:33:28 | 显示全部楼层
可以换sc2开发地图
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-7 23:08:47 | 显示全部楼层
希瓦 发表于 2013-8-7 21:43
jass不能在游戏运行时动态修改单位类型数据,技能数据,物品数据;
动态创建自定义技能就更不可能了

作图的时候用jass也不行吗?那么jass只能写脚本吗?

点评

纯jass不包含预处理功能,不能改物编。 要是你想改一下英雄属性,设置技能等级,为单位添加技能这样的当然可以。 但是如果你想使用jass来创建新的自定义技能,或者创建新的单位类型,那就不行了。 jass只是一个  详情 回复 发表于 2013-8-7 23:38
回复 支持 反对

使用道具 举报

发表于 2013-8-7 23:38:40 | 显示全部楼层
frank630520 发表于 2013-8-7 23:08
作图的时候用jass也不行吗?那么jass只能写脚本吗?

纯jass不包含预处理功能,不能改物编。
要是你想改一下英雄属性,设置技能等级,为单位添加技能这样的当然可以。
但是如果你想使用jass来创建新的自定义技能,或者创建新的单位类型,那就不行了。

jass只是一个脚本语言而已
要是感兴趣,你可以看一下lua的相关资料,批量修改物编什么的,还是不错的

点评

原来如此,we的物体管理能填写的数据貌似很小不满足呢!  详情 回复 发表于 2013-8-7 23:46
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2013-8-7 23:46:55 | 显示全部楼层
美味豆沙包 发表于 2013-8-7 23:38
纯jass不包含预处理功能,不能改物编。
要是你想改一下英雄属性,设置技能等级,为单位添加技能这样的当 ...

原来如此,we的物体管理能填写的数据貌似很小不满足呢!
回复 支持 反对

使用道具 举报

发表于 2013-8-8 00:04:25 | 显示全部楼层
frank630520 发表于 2013-8-7 23:46
原来如此,we的物体管理能填写的数据貌似很小不满足呢!

很小?还是说很少?
按住shift可以修改为任意大小,要是你觉得“少”,那就没有办法了

点评

呵呵,  详情 回复 发表于 2013-8-8 00:15
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-8 00:11:38 | 显示全部楼层
本帖最后由 frank630520 于 2013-8-8 01:23 编辑

function Trig_frankqgzs4546_Func004Func009A takes nothing returns nothing
    local unit frankunt = GetEnumUnit()
    local unit frankatt = GetAttacker()
    local boolean frankbl = IsUnitType(frankunt , UNIT_TYPE_ETHEREAL)
    local unit frankhero = udg_frankhero[GetConvertedPlayerId(GetOwningPlayer(frankatt))]
    local real frankre =  ( I2R(GetHeroStr(frankhero , true)) + I2R(GetHeroInt(frankhero, true)) + I2R(GetHeroAgi(frankhero , true))) * I2R( 30 * udg_frankInt[FRANK_CONS_GROUP]) //伤害等于三围*30*单位组单位的数量(全局变量),也这是说,人数越多伤害越高
    local effect frankefft
    set frankefft =  AddSpecialEffectTargetUnitBJ( "overhead", frankunt , "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl" )
    if ( frankbl ) then
        call UnitDamageTarget( frankatt, frankunt, frankre , true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS )
    else
        call UnitDamageTarget( frankatt, frankunt, frankre , true, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS )
    endif
    call DestroyEffect( frankefft )
    set frankunt = null
    set frankatt = null
    set frankefft = null
    set frankhero = null
endfunction
if ( Trig_frankqgzs4546_Func004C(frankrandom) ) then
        set franktion = GetUnitLoc(frankunitatt)
            set frankgroup = GetRandomSubGroup(100, GetUnitsInRangeOfLocMatching(I2R(1000), franktion , Condition(function Trig_frankqgzs4546_Func004Func009001002003)))
            set udg_frankInt[FRANK_CONS_GROUP] = CountUnitsInGroup(frankgroup)        //udg_frankInt[FRANK_CONS_GROUP] 用全局变量,索引是常数。存储了frankgroup单位组的单位数量
        call ForGroupBJ( frankgroup , function Trig_frankqgzs4546_Func004Func009A )
        call RemoveLocation( franktion )
        call DestroyGroup( frankgroup )
        set frankeff =  AddSpecialEffectTargetUnitBJ( "overhead", frankunitatt , "Abilities\\Spells\\Undead\\DarkRitual\\DarkRitualTarget.mdl" )
        call DestroyEffect( frankeff )
        return
    endif
这是段残缺的代码,主要单位组里的单位受伤害,我想在Trig_frankqgzs4546_Func004Func009A函数中获取frankgroup单位组,不用全局变量,想用函数获取单位组
call ForGroupBJ( frankgroup , function Trig_frankqgzs4546_Func004Func009A )不能往里传参数吧?实际传了单位,用选取单位可获取单位,那么有没有传单位组,我想获取单位组的单位数量,上面残缺的代码是用全局变量得到了,但我想知道有没有像
call TimerStart(time,9.00,ture,function Dying_loc) 这样可以在Dying_loc 函数 local timer time = GetExpiredTimer()//获取到期的计时器  中得到计时器
call TriggerAddAction( gg_trg_franksum, function Trig_frankwpqishu_Actions ) 得到 GetTriggerUnit() 触发单位等等,我不太会描述希望各位大神知道我在说什么?
这是说有没有函数 获取单位组 像 Getgroup (是不存在的) 之类的?

点评

ForGroup里面没有GetGroup这样的函数  发表于 2013-8-8 00:43
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-8 00:15:58 | 显示全部楼层
希瓦 发表于 2013-8-8 00:04
很小?还是说很少?
按住shift可以修改为任意大小,要是你觉得“少”,那就没有办法了

呵呵,
回复 支持 反对

使用道具 举报

发表于 2013-8-8 00:42:42 | 显示全部楼层
呵呵是什么意思...

一般Jass都使用哈希表来绑定数据(1.20之前用缓存)

比如,在ForGroup之前:
local integer i = GetHandleId(GetTriggeringTrigger())
call SaveGroupHandle(udg_hashtable,i,StringHash("Group"),udg_group)
//udg_hashtable为创建的哈希表
//udg_group为你要储存的单位组

在ForGroup执行的函数中
local integer i = GetHandleId(GetTriggeringTrigger())
local group g = LoadGroupHandle(udg_hashtable,i,StringHash("Group"))
//g为读取出来的单位组

哈希表相比于全局变量来说更加方便
同时因为可以把数据绑定到某个对象上,所以减少了冲突,还可以实现为单位增加“属性”的效果

计时器也是一样的
使用哈希表可以很方便的把数据绑到计时器上,通过获得GetExpiredTimer(),就能获得相应的数据

不知道这些是不是你想知道的

点评

用触发器的话 GetHandleId(GetTriggeringTrigger()),貌似有点问题,因为它是全局变量吧? GetHandleId是一样的吧?如果短时间内作几个动作的话不就混乱了,GetHandleId(局部变量),例如: local timer time = Crea  详情 回复 发表于 2013-8-8 01:08
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2013-8-8 01:08:41 | 显示全部楼层
本帖最后由 frank630520 于 2013-8-8 01:16 编辑
希瓦 发表于 2013-8-8 00:42
呵呵是什么意思...

一般Jass都使用哈希表来绑定数据(1.20之前用缓存)

用触发器的话 GetHandleId(GetTriggeringTrigger()),貌似有点问题,因为它是全局变量吧? GetHandleId是一样的吧?如果短时间内作几个动作的话不就混乱了,GetHandleId(局部变量),例如:
local timer time = CreateTimer()
local integer i = GetHandleId(time)
call TimerStart(time,9.00,ture,function Dying_loc)
SaveUnitHandle(udg_hand,i,0,attack_unit)

---------------------------------------------
function Dying_loc takes nothing returns nothing
local timer time = GetExpiredTimer()//获取到期的计时器~
local integer i = GetHandleId(time)    //和上面的GetHandleId(time) 相等
local unit u = LoadUnitHandle(udg_hand,i,0)

因为是局部变量,每次触发HandleId都不一样,不会混乱

但除了计时器好像没有其他可以用这种方法
所有我想问一下有没有捕获单位组的函数,如果有的话就可以用这种方法吧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-8 01:29:48 | 显示全部楼层
whimsyduke 发表于 2013-8-7 22:33
可以换sc2开发地图

点评

正解  发表于 2013-8-8 11:37
回复 支持 反对

使用道具 举报

发表于 2013-8-8 11:27:41 | 显示全部楼层
本帖最后由 希瓦 于 2013-8-8 11:36 编辑

没有“捕获单位组”的函数

GetTriggeringTrigger不是“全局变量”,它获得的是“当前触发”
在不同的触发器内调用这个函数永远都会返回它所在的触发器,即使这个触发器不是最后触发的触发器

只有当一个触发递归的同时运行多次时才可能出现冲突
但是如果你准备递归的运行一个触发的时候,使用运行次数作为区分也能够避免这种冲突

如:
//存
local integer s = GetTriggerExecCount(GetTriggeringTrigger())//获得触发运行次数
local integer i = GetHandleId(GetTriggeringTrigger())
call SaveGroupHandle(udg_hashtable,i,s,udg_group)
call SaveInteger(udg_hashtable,i,StringHash("RunStep"),s)//储存触发运行次数,每次跳转之前都需要储存一下
call ForGroup(udg_group,function whichfunc)
call RemoveSavedHandle(udg_hashtable,i,s)

//取
local integer i = GetHandleId(GetTriggeringTrigger())
local integer s = LoadInteger(udg_hashtable,i,StringHash("RunStep"))//获得“当前触发运行次数”
local group g = LoadGroupHandle(udg_hashtable,i,s)

当然,也不是必须把数据绑定到GetTriggeringTrigger()上
根据实际情况,你可以把数据绑定到其他相关数据中
这里只是举个例子

点评

call RemoveSavedHandle(udg_hashtable,i,s) 这句话是删除什么吗?存储的单位组吗? 那么下面取不了吧? local group g = LoadGroupHandle(udg_hashtable,i,s) ???  详情 回复 发表于 2013-8-8 20:12
恩,谢谢!call AddSpecialEffectTargetUnitBJ( "overhead", GetTriggerUnit(),"Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl" ) “overhead”只能邦定在单位头顶?没有其他位置吗?比如小JJ之类(开个玩笑!  详情 回复 发表于 2013-8-8 19:53
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-8 19:53:09 | 显示全部楼层
希瓦 发表于 2013-8-8 11:27
没有“捕获单位组”的函数

GetTriggeringTrigger不是“全局变量”,它获得的是“当前触发”

恩,谢谢!call AddSpecialEffectTargetUnitBJ( "overhead", GetTriggerUnit(),"Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl" )
“overhead”只能邦定在单位头顶?没有其他位置吗?比如小JJ之类(开个玩笑!)
施放技能的那么些会动的特效是在脚本编写的吗?一般用什么函数?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-8 20:12:29 | 显示全部楼层
希瓦 发表于 2013-8-8 11:27
没有“捕获单位组”的函数

GetTriggeringTrigger不是“全局变量”,它获得的是“当前触发”

call RemoveSavedHandle(udg_hashtable,i,s)
这句话是删除什么吗?存储的单位组吗?
那么下面取不了吧?
local group g = LoadGroupHandle(udg_hashtable,i,s)
???
回复 支持 反对

使用道具 举报

发表于 2013-8-8 23:52:18 | 显示全部楼层
frank630520 发表于 2013-8-8 19:53
恩,谢谢!call AddSpecialEffectTargetUnitBJ( "overhead", GetTriggerUnit(),"Abilities\\Spells\\Othe ...

overhead是单位模型附加点,你可以把特效创建到模型的任意附加点上
模型的附加点可以有很多,到底有哪些是由模型作者自己决定的
比如他想给用户开一个玩笑,那么他也许会给模型加一个名叫“小丁丁”的附加点
当然,你自己也可以使用工具修改

常用附加点包括:
original 底部
head 头部
hand 手部
feet 脚
chest 胸
weapon 武器

具体你可以在论坛里面搜索一下附加点列表
回复 支持 反对

使用道具 举报

发表于 2013-8-8 23:57:59 | 显示全部楼层
frank630520 发表于 2013-8-8 19:53
恩,谢谢!call AddSpecialEffectTargetUnitBJ( "overhead", GetTriggerUnit(),"Abilities\\Spells\\Othe ...

技能可以指定模型动作
有的施法特效是模型自带的特效,属于模型自身的动画

如果你对模型本身的特效不满意,你也可以自己用触发来创建施法效果
可以创建特效绑定到单位身上,很简单,缺点是特效会被一直绑定在模型附加点上不能自定位置

还可以使用“马甲单位”来制作技能特效
所谓“马甲单位”,就是有“蝗虫”技能的特效单位,使用技能特效作为模型
然后你可以通过触发修改这个单位的“大小”“颜色”“位置”等等

一般的触发技能都是用马甲单位制作的,用的函数也就是那些单位相关的函数了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2020-2-23 06:36 , Processed in 0.188692 second(s), 28 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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