|
楼主 |
发表于 2011-7-27 00:38:41
|
显示全部楼层
沙发自己留
好了吹嘘一翻后,我们来看看到底是怎么实现这个动作
1、首先我们要建立自定义动作,这个时候我们必须勾选“循环”因为我们这个就是一个循环,而且没有循环的话不能用break。然后我们要再勾选子函数,只有勾选子函数才能在在在里面再添加函数。
2、定义动作后我们在自定义代码中加入处理的代码,代码的逻辑无非是根据字符里面查找分隔符然后取不同的字符,这里不作详细说明了。现在重点是你们会不会很奇怪那堆有#的奇怪的参数呢。这些在东西即使在Galaxy语法里面也是没的,这究竟是什么呢。。。。。。
别急偶们先来编译一下脚本对比了看。下面我抽取编译的部分和函数的部分来比较
#AUTOVAR(st,string) = #PARAM(strForSplit);
#AUTOVAR(len) = 0;
#AUTOVAR(f) = 0;
while (#AUTOVAR(st) != null) {
    #AUTOVAR(f) = 0;
    #AUTOVAR(f) = StringFind(#AUTOVAR(st),#PARAM(strSplit),true);
    #AUTOVAR(len) = StringLength(#AUTOVAR(st));
    if(#AUTOVAR(f) <= 0){#AUTOVAR(f) = #AUTOVAR(len) + 1;};
    #PARAM(strEach) = StringSub(#AUTOVAR(st),1,#AUTOVAR(f)-1);
    if(#PARAM(strEach) != null){#SUBFUNCS(actions)};
    #AUTOVAR(st) = StringSub(#AUTOVAR(st),#AUTOVAR(f)+1,#AUTOVAR(len));
    if(#AUTOVAR(st) == null){#SMARTBREAK};
}
----------------我是分割线---------------
    auto99773706_st = "7,8,9";
    auto99773706_len = 0;
    auto99773706_f = 0;
    while (auto99773706_st != null) {
        auto99773706_f = 0;
        auto99773706_f = StringFind(auto99773706_st,",",true);
        auto99773706_len = StringLength(auto99773706_st);
        if(auto99773706_f <= 0){auto99773706_f = auto99773706_len + 1;};
        lv_tmpstr = StringSub(auto99773706_st,1,auto99773706_f-1);
        if(lv_tmpstr != null){UIDisplayMessage(PlayerGroupAll(), c_messageAreaChat, StringToText(lv_tmpstr));
        };
        auto99773706_st = StringSub(auto99773706_st,auto99773706_f+1,auto99773706_len);
        if(auto99773706_st == null){break;};
    }
希望看完的人没有眼花,或者就直接来个感觉把,这两段语句结构是不是真他妈的像呢。
看第二句#AUTOVAR(len) = 0;和auto99773706_len = 0;噢发现问题了吗这个编译不就是把#AUTOVAR(len)变成auto99773706_len变量了吗,而且大家都有AUTO又有len字样。于是在看看后面的语句,规律都一样。难道说函数里面的是一个模板在函数编译的时候会用变量来替换吗。对,正解,就是这样。这里就是在编译的函数时候应用模板帮你自动写函数,你增加的动作会在编译时插入到模板你写有#SUBFUNCS(actions)的位置。例如上面的
if(lv_tmpstr != null){UIDisplayMessage(PlayerGroupAll(), c_messageAreaChat, StringToText(lv_tmpstr));
这个语句并会根据这个自动转换变量,其中auto99773706_len那个99773706是系统编译时自动生成的ID以避免变量与其他东西重名。
相不到SE2的编辑器还能自动滚动编译,实在太强大。GOOD
然后那具体这些#号参数代码是代表什么意思呢。(先开个会,回来再续,回来看到老大已经写了就不重复了直接引用)
引用第7楼麦德三世于2011-07-27 15:56发表的  :
#AUTOVAR用来创建随机不重名的变量。第二个参数代表类型,可以忽略。类型可以由别的东西决定,比如函数的参数。
#SUBFUNCS用来代表sub-function里的内容。具体哪一行由关键字决定
#IFHAVESUBFUNCS判断是否有填写sub-function
#CUSTOM用户所输入的自定义代码
#PARAM用来取函数的参数
.......
OK现在函数已经搞好了,引用来试试
做好触发按F5发生事件
选择动作列表,一看OH赫然一个u_ForEachStr出现在动作列表里,原来自定义的函数会在动作列表中直接显示,以后引用可以不写代码了,可以直接拿来用了。实在太方便。哈哈,这又是比WAR3的一大改进。然后想怎么加动作就怎么加。
另外为了增强函数的通用性,附加了一个u_ForEachStrWithIndex的函数,因为考虑到抽取每个字符的INDEX的经常会用到,然后大功告成了。
到最后,大家看懂了吗?什么没有!!!!没关系,你只要把这两个函数COPY到你的地图中,然后直接在动作表里面挑来用就OK了,什么还不会用,那我也没办法了,写了这么多很累,下班走人。
(完) |
|