找回密码
 点一下
查看: 926|回复: 8

请教关于同步的问题

[复制链接]
发表于 2009-12-28 19:33:24 | 显示全部楼层 |阅读模式
如果有一个触发器中用到了触发玩家是否为LocalPlayer的判断,如果为真的话创建单位组,会不会造成不同步?


没有找到jass高亮的方法……将就发了

    local player Owner = GetTriggerPlayer()  
    local group G   
    if  Owner = GetLocalPlayer() then
        set G = CreateGroup()
        call GroupEnumUnitsSelected(G,Owner,null)
        loop
            //判断G中的单位类型,不更改
        endloop
        call DestroyGroup(G)
    endif

如果把CreateGroup()放在外面会不会好一点?
发表于 2009-12-28 19:42:37 | 显示全部楼层
引用楼主liangilu于2009-12-28 19:33发表的 请教关于同步的问题 :
如果有一个触发器中用到了触发玩家是否为LocalPlayer的判断,如果为真的话创建单位组,会不会造成不同步?
如果是在LocalPlayer的判断内部的,会掉线,而如果在外部则不会。
当然,把具体的触发或者代码发上来是最好的。
那样才能知道会不会掉线。
回复

使用道具 举报

 楼主| 发表于 2009-12-28 20:28:17 | 显示全部楼层
引用第1楼血戮魔动冰于2009-12-28 19:42发表的  :

如果是在LocalPlayer的判断内部的,会掉线,而如果在外部则不会。
当然,把具体的触发或者代码发上来是最好的。
那样才能知道会不会掉线。
请见更改
回复

使用道具 举报

发表于 2009-12-29 00:13:01 | 显示全部楼层
当然会不同步... 另~~~ 这段用本地玩家貌似没啥意义啊~~~
回复

使用道具 举报

发表于 2009-12-29 06:30:39 | 显示全部楼层
[jass]    local player Owner = GetTriggerPlayer()
    local group G   
    if  Owner = GetLocalPlayer() then
        set G = CreateGroup()
        call GroupEnumUnitsSelected(G,Owner,null)
        loop
            //判断G中的单位类型,不更改
        endloop
        call DestroyGroup(G)
    endif[/jass]
这样是一定会不同步的只要是agent派生出来的子类就要同步(估计是……)
而group就是agent的子类。
if p == GetLocalPlayer() then
的意思是说:
每台电脑上都运行这样的一串代码,玩家1电脑的GetLocalPlayer返回的是玩家1,玩家2电脑的GetLocalPlayer返回的是玩家2……
于是当你限定GetLocalPlayer() == Player(0)的时候(打个比方),那么只有玩家1的电脑会执行if内的代码,其他玩家条件判定不过,if内的代码就不执行。
而这样造成不同步的原因举个例子,就是你在if内的代码中有对单位发布移动命令,这样,除了限定的那个玩家以外,其他的玩家的那个单位都不动。而在限定的玩家电脑上,那个单位却移动了,于是后果可想而知…………
你的jass代码的意思是说,当GetTriggerPlayer() == GetLocalPlayer()的时候,做某些必须要同步的动作。
于是就不同步了。
如果你的代码中的注释是正确的。
那么改成这样应该就可以了:
[jass]    local player Owner = GetTriggerPlayer()
    local group G = CreateGroup()
    call GroupEnumUnitsSelected(G,Owner,null)
    if  Owner = GetLocalPlayer() then
        loop
            //判断G中的单位类型,不更改
        endloop
    endif
    call DestroyGroup(G)
[/jass]
回复

使用道具 举报

发表于 2009-12-29 07:41:14 | 显示全部楼层
这里用本地玩家没意义啊
回复

使用道具 举报

 楼主| 发表于 2009-12-29 12:00:18 | 显示全部楼层
引用第3楼Conflux于2009-12-29 00:13发表的  :
当然会不同步... 另~~~ 这段用本地玩家貌似没啥意义啊~~~
确实可以不用的……原意是想要节省一下内存,因为if下的内容是为本地玩家SelectUnit(),另外也确实不太了解什么样的不同步会导致崩溃……
回复

使用道具 举报

 楼主| 发表于 2009-12-29 12:01:27 | 显示全部楼层
Thank you very much~

我记着“agent派生出来的子类就要同步”了
回复

使用道具 举报

发表于 2009-12-29 14:13:03 | 显示全部楼层
发现4楼修正后的写法也有问题
不用ForGroup来枚举单位组,想必就是应该就是FirstOfGroup+GroupRemoveUnit来枚举了,GroupRemoveUnit只在本地执行估计也会掉线
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-22 08:25 , Processed in 0.034604 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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