找回密码
 点一下
楼主: flylicat

如何根据变量调用触发器

[复制链接]
 楼主| 发表于 2014-6-13 01:23:25 | 显示全部楼层
现在只能用Switch了,这是勤能补拙的底线了。

实际情况是这样的,如果有其他方法能实现也行:
现有:
数组[K],1<K<5000,K只是用来编号的(有编号规则,如2开头代表什么,5结尾代表什么等),不具有运算意义。目前规划有意义的编号大概有500左右(即 数组[K]==某个整数,其他 数组[K]==0),以后会根据编号规则不断往里面添加新内容(就是更新)。如果  数组[K]!=0  则具有对应的自定义动作(内容都不一样,结果也不一样)(为方便对应命名为动作:“K”),每当K触发效果时,就运行对应的 动作K。
动作K:需要N个参数运行, 数组[K]的值为参数之一(触发器为啥不能传参数呢),在动作K中有可能(偏大)产生K2(通过一个中断遍历所有K值进行判断(判断方式也各不相同)),然后又临时插入运行 动作K2(全局变量一棍打死啊)(K2也可能触发其他K值的效果)。(类似数据编辑器里面效果和行为互相调用,搞基)
ps,本来我还想把中断遍历判断K值的方法也独立出来做自定义动作的,这样调用更灵活,也能实现更多效果,后来发现要写两遍Switch,想想就算了。

所以:做出勤能补拙是个艰难的决定,特别是以后更改或更新时,想想都头疼。

大概就这个意思吧,不知道能说清楚没,如果能优化算法那就更好了。立马奉上32个赞。

回复

使用道具 举报

发表于 2014-6-13 13:05:12 | 显示全部楼层
楼上为啥不加个QQ让我瞧瞧呢
回复

使用道具 举报

发表于 2014-6-13 17:52:08 | 显示全部楼层
1000条分支的Switch,楼上赞。
回复

使用道具 举报

发表于 2014-6-14 20:41:20 | 显示全部楼层
不要做梦。你以为switch在galaxy里是真实存在的结构吗?

触发器里的switch实际上就是if包装出来的而已。1000个分支的switch只会比1000个if更浪费效率。

方法我在9楼不是已经说了么。触发器虽然不能接受参数,但可以获取全局变量。你弄几个全局变量,在调用触发器前把值设置好就行了。

点评

本来用了全局变量代替参数终于能达成要求了,用发送常规事件来触发,然后马上在局部变量里面读取相应的全局变量。 但是今天又整个人都不好了 测试的时候没事,这两天做效果了,发现用常规事件来触发是创建线程的,  详情 回复 发表于 2014-6-18 22:36
玻璃渣太坑爹了,拿个假的Switch来忽悠我们  详情 回复 发表于 2014-6-14 23:13
回复

使用道具 举报

发表于 2014-6-14 23:13:24 | 显示全部楼层
麦德三世 发表于 2014-6-14 20:41
不要做梦。你以为switch在galaxy里是真实存在的结构吗?

触发器里的switch实际上就是if包装出来的而已。 ...

玻璃渣太坑爹了,拿个假的Switch来忽悠我们
回复

使用道具 举报

 楼主| 发表于 2014-6-18 22:36:48 | 显示全部楼层
麦德三世 发表于 2014-6-14 20:41
不要做梦。你以为switch在galaxy里是真实存在的结构吗?

触发器里的switch实际上就是if包装出来的而已。 ...

本来用了全局变量代替参数终于能达成要求了,用发送常规事件来触发,然后马上在局部变量里面读取相应的全局变量。
但是今天又整个人都不好了
测试的时候没事,这两天做效果了,发现用常规事件来触发是创建线程的,弄得用来做参数的全局变量都乱了。

然后我想到了头目开始讲的脚本
trigger A=TriggerCreate("函数名");
TriggerExecute(A, true, false);
TriggerDestroy(A);

trigger A=TriggerCreate("函数名");
问题是无论我“函数名”填啥(包括字符串变量/字符串/触发器名(gt__10011(我查脚步看的))),debug都是找不到函数啊

TriggerExecute(A, true, true);
A只有trigger变量 和 触发器名 能填,填字符串就来个无法隐性转换(难道在暗示有转换的可能?)

现有的触发器是10011、10021、10031 …………
se里查到的是gt__10011  gt__10021 …………
有字符串st=“10011” 或“10021”或“10031”…………(这个是通过计算然后转化来的)
头目,是不是我打开的方式不对,脚本用错了?
这是我觉得最接近答案的方式,要怎么改才行?
    string lv_st_effect;
    trigger lv_tr_effect;
lv_st_effect=("gt__10011");
lv_tr_effect=TriggerCreate(lv_st_effect);
TriggerExecute(lv_tr_effect,true,true);
TriggerDestroy(lv_tr_effect);
回复

使用道具 举报

 楼主| 发表于 2014-6-19 12:33:46 | 显示全部楼层
不纠结脚本,今天发现了一个完美解决问题的方法。

先是设定常规事件
ab200
    事件
        触发器 -名为"ab200"的常规事件

调用是发送常规事件,然后用等待触发器
触发器 -发送名为"ab200"的常规触发器事件
触发器 -等待ab200开始执行,并在其完成之前等待

这样跟正常运行触发器的不同只在于没有核对条件的参数,可这真不重要。最重要的在结束前等待有了。
常规事件的名称是标准的字符串变量,这样就可以用字符串来控制触发器了。最后需要的参数用临时的全局变量来暂存,目标触发器里再优先获取就可以了。

完美达到效果:变量控制触发器的运行,有参数可以使用,可以中断运行(虽然还是创建了独立线程)
唯一的弊端就是不能重复调用同一个触发器,因为等待触发器会同时起效。
回复

使用道具 举报

 楼主| 发表于 2014-6-19 12:52:12 | 显示全部楼层
看来我太天真了

触发器 -等待ab200开始执行,并在其完成之前等待

这玩意用不了字符串
今天又整个人都不好了
回复

使用道具 举报

发表于 2014-6-19 22:25:18 | 显示全部楼层
触发器对应函数的内部名通常是

gt_触发器名_Func

比如gt_10011_Func

点评

用的脚本 lv_tr=TriggerCreate(lv_st); 错误在此行 TriggerExecute(lv_tr,true,true); TriggerDestroy(lv_tr); 错误 00:00:16.50 Scri: 'gt_10031_Func'出现触发器错误:无法找到函数 Near line 402 in gf  详情 回复 发表于 2014-6-19 23:02
回复

使用道具 举报

 楼主| 发表于 2014-6-19 23:02:10 | 显示全部楼层
麦德三世 发表于 2014-6-19 22:25
触发器对应函数的内部名通常是

gt_触发器名_Func

用的脚本
lv_tr=TriggerCreate(lv_st); 错误在此行
TriggerExecute(lv_tr,true,true);
TriggerDestroy(lv_tr);

错误
00:00:16.50 Scri: 'gt_10031_Func'出现触发器错误:无法找到函数    Near line 402 in gf_EE689A7E8A18CE69588E69E9C() in MapScript.galaxy

此时
局部::string  lv_st = gt_10031_Func
局部::trigger lv_tr = 空

本来是用这个暂用的,没有问题
        常规 -If (条件) then do (动作) else do (动作)
            If
                E==10031
            Then
                触发器 -运行10031(核对条件,在其结束之前等待)
            否则
回复

使用道具 举报

发表于 2014-6-20 00:30:12 | 显示全部楼层
对了,如果触发器名称是数字开头的,那么内部名还要再多一个_

这是为了保证触发器的实际名字不是以数字开头的。

gt__10031_Func
回复

使用道具 举报

 楼主| 发表于 2014-6-20 00:56:05 | 显示全部楼层
还真是,感谢头目
已经实测了,完美运行
今晚不玩了,老实睡觉
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 10:27 , Processed in 0.118223 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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