找回密码
 点一下
查看: 2929|回复: 16

请问同一个变量用在不同的触发里会不会相互影响?

[复制链接]
发表于 2006-4-6 15:58:59 | 显示全部楼层 |阅读模式
不知道魔兽3里处理不同触发是不是多线程的。

用T的话似乎没有局部变量(循环除外),我设一个整数变量n ,在几个触发器里都做了n=××,然后在用n来做计算。如果这几个触发同时执行,那n的值会不会发生变化。触发一中计算n时,n的值变成了在触发二里赋的值?
发表于 2006-4-6 16:44:38 | 显示全部楼层
有冲突
的啊  不知道怎么办才好
回复

使用道具 举报

发表于 2006-4-6 17:36:04 | 显示全部楼层
可以这样设置1个变量n(数组=1),然后就是n(1)=?n(2)=?n(3)=?.
回复

使用道具 举报

发表于 2006-4-6 17:59:03 | 显示全部楼层
循环里的integerA 和 B 是全局变量(bj_forLoopAIndex)~ 只不过翻译为 jass后 每次用都要重新赋值 所以好像是局域的一样
  1.     set bj_forLoopAIndex = 1
  2.     set bj_forLoopAIndexEnd = 10
  3.     loop
  4.         exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
  5.         set udg_unit_temp[bj_forLoopAIndex] = XXX
  6.         set bj_forLoopAIndex = bj_forLoopAIndex + 1
  7.     endloop
复制代码



触发器是排队执行的 同时触发的就一个个顺序执行 在ctrl+B里设置的变量均为全局变量 他在一个触发里改变也会改变他在其他触发里的值 你可以用jass在触发开始定义一个和ctrl+B里名字一样的居部变量 然后就可以在后面方便的引用此局部变量而不影响其他触发了 例子:
[trigger]Events:
    A unit dies
Conditions:
Actions:
        Custom Script: local texttag udg_diesmessage
        Floating Text - Create floating text at ((position of (Triggering Unit)) with the message ((A+(name of (Triggering Unit))) + \"dies\") with size 20 , red 100, green 100, blue 0, alpha 100.
        Set diesmessage = (last created floating text)
        Wait 5.00 seconds
        Destroy (diesmessage)[/trigger]

[ 本帖最后由 illlusion 于 2006-4-6 18:01 编辑 ]
回复

使用道具 举报

发表于 2006-4-6 18:04:13 | 显示全部楼层
触发器是纤程(Fiber)

纤程可看成是线程的细分
一个线程可以有多个纤程,但只有一个纤程处于执行状态

当使用Wait语句时,会发生纤程切换,这时才执行其他触发器

但要注意,某些事件是立即执行的(如受到伤害),而不是作为纤程调度
回复

使用道具 举报

发表于 2006-4-6 18:09:54 | 显示全部楼层
所以循环里最好不要用等待 不然容易出问题 除非你知道你在做什么
回复

使用道具 举报

 楼主| 发表于 2006-4-7 09:36:53 | 显示全部楼层
原帖由 illlusion 于 2006-4-6 17:59 发表
循环里的integerA 和 B 是全局变量(bj_forLoopAIndex)~ 只不过翻译为 jass后 每次用都要重新赋值 所以好像是局域的一样
[code]    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = 10
    loop
   ...


我试试看。
谢谢!
回复

使用道具 举报

 楼主| 发表于 2006-4-7 09:55:43 | 显示全部楼层
刚试了一下,局部变量果然和全局变量互不影响.

再问一下,如果我大量使用局部变量,会不会有不利影响,象整数,实数等类型要不要释放?
回复

使用道具 举报

发表于 2006-4-7 17:14:11 | 显示全部楼层
局部变量在很多编程的语言会自动释放资源。
在魔兽里。嗯。我还真不知道会不会。

整数之类的。应该不用。而且。你也不知道怎么释放。所以就不需要释放了。
不过地图的点和其它的什么。应该需要。

此部分由5#讲解。
回复

使用道具 举报

发表于 2006-4-7 17:46:15 | 显示全部楼层
基本数据类型都是自动释放的:
boolean
integer
real
real
code


其实所有的局部变量都是自动释放的
注意释放的是变量,而不是对象

对于handle(及其子类型,如location??Point??点)
它实际上专门用来存储 对象引用 的integer

当函数返回时
局部变量中的所有变量都释放了,包括handle
但是你创建的对象没有释放

所以一般情况下,释放是指释放对象

如释放点用 RemoveLocation
回复

使用道具 举报

发表于 2006-4-7 17:54:53 | 显示全部楼层
http://www.ourga.com/ga/memoryleak.html
[转载][台湾 Danny]记忆体漏失(Memory Leak)
回复

使用道具 举报

发表于 2006-4-20 19:17:45 | 显示全部楼层
原帖由 illlusion 于 2006-4-6 17:59 发表
循环里的integerA 和 B 是全局变量(bj_forLoopAIndex)~ 只不过翻译为 jass后 每次用都要重新赋值 所以好像是局域的一样
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = 10
    loop
         ...




第一次弄懂了,原来用T的时候,给局域变量赋值可以借一个全局变量的“壳”,谢谢赐教。
回复

使用道具 举报

发表于 2006-4-20 19:26:27 | 显示全部楼层
可以。不过。使用一个以上的变量在同一个T中使用此方法。有可能会出错。
回复

使用道具 举报

发表于 2006-4-21 13:38:08 | 显示全部楼层
同一个触发器会在游戏中多次打开。比如事件是:Unit enters region
动作中有wait 20s
可能就是一个触发多次打开了。
此时局域变量的赋值会不会出故障??我是说,同一触发器的几个实例之间会有干扰现象吗?貌似这个问题是比较基本的程序语言问题,关于局域变量的性质的,偶不是很清楚。
回复

使用道具 举报

发表于 2006-4-21 13:49:32 | 显示全部楼层
局部变量不会被干扰的
只有全局变量才会被干扰
回复

使用道具 举报

发表于 2006-4-21 14:00:35 | 显示全部楼层
全局的会 局部的不会
局部变量只属于函数内部 而不是触发器内部
回复

使用道具 举报

发表于 2006-4-21 15:38:30 | 显示全部楼层
原帖由 illlusion 于 2006-4-21 14:00 发表
全局的会 局部的不会
局部变量只属于函数内部 |c0000ff00而不是触发器内部|r


谢谢了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-12 04:59 , Processed in 0.055545 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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