找回密码
 点一下
查看: 6872|回复: 2

关于如何让一段触发可以同时运行多次不冲突

  [复制链接]
发表于 2011-1-24 13:32:34 | 显示全部楼层 |阅读模式
       很多新人朋友在写触发时,一旦用上了“等待”和“计时器”或者“多触发”,一般都会遇到变量冲突的问题。 而变量冲突的最普遍的表现,就是这段触发无法同时运行多次。

例如:
       如果这是一个技能的触发,那么就体现为,这个技能无法多单位同时使用(或一个单位无法同时使用多次);如果这是一个与玩家相关的触发,那么就体现为,这段触发无法多玩家同时使用……………………

       那么,知道了触发无法同时运行多次的基本原因是“变量冲突”之后,我们接下来就需要了解:“‘变量冲突’是什么”和“我们怎么解决‘变量冲突’”  

首先,我来举几个例子。

       比如我们想做一个计时器复活英雄的触发,那么一定需要用到变量来储存“需要复活的英雄”“计时器”和“计时器窗口”等几个数据,就像这样:
[trigger]Death
    事件
        单位 - 任意单位 变得可重生
    条件
    动作
        设置 Hero = (触发单位)
        计时器 - 开启 Timer ,计时方式: 一次性 时间设置: 30.00 秒
        计时器 - 为 Timer 创建计时器窗口,使用标题: 英雄复活时间...
        设置 TimerWindow = (最后创建的计时器窗口)
[/trigger]    
[trigger]Revive
    事件
        时间 - Timer 到期
    条件
    动作
        计时器 - 删除 TimerWindow
        英雄 - 立即复活 Hero 在 ((Hero 的所有者) 的游戏开始位置) , 显示 复活动画
[/trigger] 计时器复活英雄(单人版).w3x (10 KB, 下载次数: 106)
       但是如果这样写的话,你会发现如果第一个死亡的英雄还没有复活的时候,又有一个英雄死亡了,那么第一个死亡的英雄将无法复活。
       这是因为,我们使用变量来储存需要复活的单位,而如果在第一个死亡的英雄还没有复活的时候,又有一个英雄死亡了,那么第二个死亡的英雄的数据就会覆盖掉第一个死亡的英雄的数据……因为变量只有一个,所以无法储存两组数据,而两个死亡的英雄需要同时用到同一个变量,那么自然就冲突了,这就是变量冲突。

那么,解决变量冲突的方法,自然就是多组变量来储存多组数据了……
[trigger]Death
    事件
        单位 - 任意单位 变得可重生
    条件
    动作
        设置 Count = (Count + 1)
        设置 Hero[Count] = (触发单位)
        设置 Timer[Count] = (新建的计时器)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;触发器 - 为 Revive <预设> 添加事件: (时间 - Timer[Count] 到期)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;计时器 - 开启 Timer[Count] ,计时方式: 一次性 时间设置: 5.00 秒
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;计时器 - 为 (最后启用的计时器) 创建计时器窗口,使用标题: 英雄复活时间...
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 TimerWindow[Count] = (最后创建的计时器窗口)
[/trigger]
[trigger]Revive
&#160;&#160;&#160;&#160;事件
&#160;&#160;&#160;&#160;条件
&#160;&#160;&#160;&#160;动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;For Integer 从 1 到 Count, 做动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Loop - 动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果所有条件成立则做动作1,否则做动作2
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If - 条件
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;(到期的计时器) 等于 Timer[Integer]
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Then - 动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;计时器 - 删除 TimerWindow[Integer]
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;计时器 - 删除 Timer[Integer]
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;英雄 - 立即复活 Hero[Integer] 在 ((Hero[Integer] 的所有者) 的游戏开始位置) , 显示 复活动画
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Timer[Integer] = Timer[Count]
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Hero[Integer] = Hero[Count]
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 TimerWindow[Integer] = TimerWindow[Count]
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Count = (Count - 1)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;跳过剩余动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Else - 动作
[/trigger]
&#160;&#160;&#160;&#160;&#160;&#160; 我们来看上面这个改进过后(可以多人使用)的演示吧
计时器复活英雄(多人版).w3x (11 KB, 下载次数: 264) &#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160; 在这个演示中,我使用了“变量数组”来代替普通的变量,在每次英雄死亡之后,我都为它分配了一组变量用来储存数据,这样自然就不会出现变量冲突了。
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;同时,在英雄复活完成后,我又将此英雄的数据用第“Count”组数据覆盖,并将“Count”减一。这样,不需要的数据就都被清除掉了(避免已经复活的英雄的数据还占着内存空间)。

&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当然,如果一个玩家只能同时拥有一个英雄的话,我们还可以用玩家索引来作为序列,相比上面的触发要简单且便于理解一些(如果一个玩家可以同时拥有两个英雄则不能使用此方法,否则还是会出现变量冲突,以致先死亡的英雄无法复活),就像这样:
[trigger]Init
    事件
        地图初始化
    条件
    动作
        For Integer 从 1 到 12, 做动作
            Loop - 动作
                触发器 - 为 Revive <预设> 添加事件: (时间 - Timer[Integer] 到期)
[/trigger]
[trigger]Death
    事件
        单位 - 任意单位 变得可重生
    条件
    动作
        设置 Hero[((触发玩家) 的玩家索引号)] = (触发单位)
        计时器 - 开启 Timer[((触发玩家) 的玩家索引号)] ,计时方式: 一次性 时间设置: 5.00 秒
        计时器 - 为 (最后启用的计时器) 创建计时器窗口,使用标题: 英雄复活时间...
        设置 TimerWindow[((触发玩家) 的玩家索引号)] = (最后创建的计时器窗口)
[/trigger]
[trigger]Revive
    事件
    条件
    动作
        For Integer 从 1 到 12, 做动作
            Loop - 动作
                如果所有条件成立则做动作1,否则做动作2
                    If - 条件
                        (到期的计时器) 等于 Timer[Integer]
                    Then - 动作
                        计时器 - 删除 TimerWindow[Integer]
                        英雄 - 立即复活 Hero[Integer] 在 ((Hero[Integer] 的所有者) 的游戏开始位置) , 显示 复活动画
                        跳过剩余动作
                    Else - 动作
[/trigger]
计时器复活英雄(多玩家版).w3x (11 KB, 下载次数: 228)

&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;像这种使用“玩家索引”来作为数组的索引的方法,由于其简单性,经常被用在“多玩家对话框”、“多玩家属性记录”等地方;只要每个玩家都只需要一组变量的时候,都可以使用此方法。

&#160;&#160;&#160;&#160;&#160;&#160;再比如我们要做一个“击退”的技能,对一个单位释放之后,可以将这个单位往后推送一定的距离。 那么我们肯定会想到,用变量来储存需要击退的单位,然后开启计时器来每0.0X秒移动一次该单位。
就像这样:[trigger]TestA
&#160;&#160;&#160;&#160;事件
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;单位 - 任意单位 发动技能效果
&#160;&#160;&#160;&#160;条件
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;(施放技能) 等于 驱散
&#160;&#160;&#160;&#160;动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 LocationA = ((触发单位) 的位置)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 LocationB = ((技能施放目标) 的位置)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Real = (LocationA 到 LocationB 的角度)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;点 - 清除 LocationA
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;点 - 清除 LocationB
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Unit = (技能施放目标)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Integer = 100
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;触发器 - 开启 TestB <预设>
[/trigger][trigger]TestB
&#160;&#160;&#160;&#160;事件
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;时间 - 每 0.03 秒触发事件
&#160;&#160;&#160;&#160;条件
&#160;&#160;&#160;&#160;动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果所有条件成立则做动作1,否则做动作2
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If - 条件
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Integer 大于 0
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Then - 动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 LocationA = (Unit 的位置)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 LocationB = (从 LocationA 开始,距离 15.00 ,方向为 Real 度的位移处)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;单位 - 立即移动 Unit 到 LocationB
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;点 - 清除 LocationA
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;点 - 清除 LocationB
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Integer = (Integer - 1)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Else - 动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;触发器 - 关闭 (当前触发)
[/trigger]
弹射(单人版).w3x (15 KB, 下载次数: 77)
&#160;&#160;&#160;&#160;&#160;&#160; 但是,如果这样写的话,你会发现这个技能并不能同时使用多次。(如果在第一个单位还在推送的时候,你又推送了第二个单位,那么你会发现第一个单位已经停止了移动。)
&#160;&#160;&#160;&#160;&#160;&#160; 这是因为,我们使用变量来储存需要移动的单位,而如果在第一次技能还没有结束的时候,我们又释放了第二次技能,那么第二次释放技能的数据就会将第一次释放技能的数据覆盖……因为变量只有一个,所以无法储存两组数据,而两次技能需要同时用到同一个变量,那么自然就冲突了,这就是变量冲突。

那么,解决变量冲突的方法,自然就是多组变量来储存多组数据了……[trigger]TestA
&#160;&#160;&#160;&#160;事件
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;单位 - 任意单位 发动技能效果
&#160;&#160;&#160;&#160;条件
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;(施放技能) 等于 驱散
&#160;&#160;&#160;&#160;动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Count = (Count + 1)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 LocationA = ((触发单位) 的位置)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 LocationB = ((技能施放目标) 的位置)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Real[Count] = (LocationA 到 LocationB 的角度)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;点 - 清除 LocationA
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;点 - 清除 LocationB
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Unit[Count] = (技能施放目标)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Integer[Count] = 100
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;触发器 - 开启 TestB <预设>
[/trigger][trigger]TestB
&#160;&#160;&#160;&#160;事件
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;时间 - 每 0.03 秒触发事件
&#160;&#160;&#160;&#160;条件
&#160;&#160;&#160;&#160;动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果所有条件成立则做动作1,否则做动作2
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If - 条件
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Count 大于 0
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Then - 动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;For Index 从 1 到 Count, 做动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Loop - 动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果所有条件成立则做动作1,否则做动作2
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If - 条件
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Integer[Index] 大于 0
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Then - 动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 LocationA = (Unit[Index] 的位置)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 LocationB = (从 LocationA 开始,距离 15.00 ,方向为 Real[Index] 度的位移处)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;单位 - 立即移动 Unit[Index] 到 LocationB
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;点 - 清除 LocationA
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;点 - 清除 LocationB
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Integer[Index] = (Integer[Index] - 1)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Else - 动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Real[Index] = Real[Count]
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Unit[Index] = Unit[Count]
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Integer[Index] = Integer[Count]
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Unit[Count] = 没有单位
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Index = (Index - 1)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 Count = (Count - 1)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Else - 动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;触发器 - 关闭 (当前触发)
[/trigger]
弹射(多人版).w3x (15 KB, 下载次数: 196)
&#160;&#160;&#160;&#160;&#160;&#160; 我们来看上面这个改进过后(可以多人使用)的演示吧。
&#160;&#160;&#160;&#160;&#160;&#160; 在这个演示中,我使用了“变量数组”来代替普通的变量,同时使用整型变量“Count”为计数变量,在每次释放技能之时,我都将“Count”加一,然后使用变量数组的第“Count”组变量来储存数据。
&#160;&#160;&#160;&#160;&#160;&#160; 这样,每次释放技能后,我都为它分配了新的一组变量来储存数据,所以自然就不会相互覆盖而引发变量冲突了。(与上个例子的不同,为了使一个玩家能同时多次使用本技能,我没有使用“玩家索引”作为序列)
&#160;&#160;&#160;&#160;&#160;&#160; 然后我使用循环来检查每一组数据,并根据这组数据对相应单位进行移动处理(你会发现其实这部分的动作和单人版完全一样)
&#160;&#160;&#160;&#160;&#160;&#160;而在某一组单位移动结束之后(Integer[Index]==0),我又将此组数据用第“Count”组数据覆盖,并将“Count”减一。这样,不需要的数据就都被清除掉了。

这样,就实现了一个技能的多人化处理

注:
&#160;&#160;&#160;&#160;&#160;&#160; 数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。
&#160;&#160;&#160;&#160;&#160;&#160; 你可以将一个变量数组理解为很多个同类型变量拼在了一起。


&#160;&#160;&#160;&#160;&#160;&#160; 除此之外,你还可以使用“Return Bug(1.20)”“哈希表(1.24)”来为每次技能绑定一组数据。 这里使用的是最简单也最实用的“数组法”,其他的就等你学会JASS后自己研究了。

&#160;&#160;&#160;&#160;&#160;&#160; 继续除此之外,“局部变量”也是让技能可以多人释放的利器,只是局限性较大,而且需要使用“自定义代码”,因此在T里面不常用而已。(如果要学习JASS的话,这是必须学习的基础)
&#160;&#160;&#160;&#160;那么,什么是局部变量呢?
&#160;&#160;&#160;&#160;局部变量就是定义在一个过程当中,只有这个过程能够使用的变量。
&#160;&#160;&#160;&#160;如果在一个技能的触发中定义了一个局部变量,那么第一次释放技能所运行的触发,就只能使用这一次运行触发时定义的变量;第二次使用技能所运行的触发,就只能使用这第二次运行触发时定义的变量,两次触发的运行都不能使用另外一个过程中定义的局部变量……好象很饶口,那么来看演示吧。
&#160;&#160;&#160;&#160;
比如:
这是一个使用后能在5秒后杀死技能释放目标的技能。
[trigger]Kill
&#160;&#160;&#160;&#160;事件
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;单位 - 任意单位 发动技能效果
&#160;&#160;&#160;&#160;条件
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;(施放技能) 等于 驱散
&#160;&#160;&#160;&#160;动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;设置 u = (技能施放目标)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;等待 5.00 秒游戏时间
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;单位 - 杀死 u
[/trigger]
但是有一个问题:
这个技能是使用变量“u”来储存需要杀死的单位的。
而如果在第一次使用技能5秒内再使用一次技能,那么第二次使用技能时为“u”赋的值就会覆盖掉以前“u”的值,于是乎就出现了变量冲突。
最后的结果就是:只有最后一次释放技能的目标被杀死。
那么,修改过后(使用了局部变量)的演示在此:
[trigger]Kill
&#160;&#160;&#160;&#160;事件
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;单位 - 任意单位 发动技能效果
&#160;&#160;&#160;&#160;条件
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;(施放技能) 等于 驱散
&#160;&#160;&#160;&#160;动作
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;自定义代码: local unit u = GetSpellTargetUnit()
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-------- local就是定义局部变量的语句,unit是变量类型“单位”,GetSepllTargetUnit是获得技能目标的函数。 --------
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;等待 5.00 秒游戏时间
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;自定义代码: call KillUnit( u )
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-------- KillUnit就是杀死单位的函数。 --------
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-------- 可见JASS是很简单的,只要认识这些单词就能写出来。 --------
[/trigger]
KillBill.w3x (18 KB, 下载次数: 109)
由于使用了局部变量,所以过程之间不能互相影响,也就不会冲突。
最后的结果就是:所有人都死了


恩,写了这么多,希望能对大家有所帮助吧。

评分

参与人数 1威望 +11 收起 理由
alexries + 11 GJ

查看全部评分

发表于 2011-3-20 17:53:35 | 显示全部楼层
数组MS至多8192吧......
还有最后还是有条等待动作,难道这样也支持多人嘛......

well......还真的是支持多人,我之前一直以为等待是不支持多人的......
不过,新的问题又来了,等待似乎会容易引起掉线?而计时器后一个开启的又会覆盖掉前一个?
回复

使用道具 举报

 楼主| 发表于 2011-3-20 18:38:43 | 显示全部楼层
①教学资料区禁止回复!(如果有问题要问,可以到疑问区单独开个帖子,纯顶就不要了)
②虽然数组最多支持8192……但是难道地图上会有8192个英雄同时复活??或者说地图上会有8192个单位同时被弹射……如果真有这么多,那没等你达到8192,电脑就已经卡死了……
③错了,等待不会引起掉线,只是掉线会引起等待出现误差(所以我们使用“等待游戏时间”来代替等待)
等待也肯定是支持的,只是如果不使用“局部变量”,那么用了“等待”的触发会无法多人使用(使用局部变量的方法见顶楼最后面)
④计时器后一个开启的不会覆盖掉前一个(除非你前后开启的是同一个计时器)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 10:03 , Processed in 0.277736 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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