找回密码
 点一下
查看: 1895|回复: 22

获取当前镜头X,Y轴 如何同步返回的数据

[复制链接]
发表于 2012-9-20 01:41:08 | 显示全部楼层 |阅读模式
对话框下的灰字写明这是个本地函数
我现在希望的是获取每个玩家的镜头属性
该如何才能达到
发表于 2012-9-20 08:39:07 | 显示全部楼层
所有本地函数可以在前面加一个if语句来使用:
自定义函数:if GetOwningPlayer(GetTriggerUnit())==GetLocalPlayer() then //GetTriggerUnit() -> 触发单位,你也可以换成别的,或者直接改GetOwningPlayer为指定玩家
     /* 中间插入你要使用的本地函数操作 */
自定义函数:endif

去试试吧。
回复

使用道具 举报

发表于 2012-9-20 19:40:40 | 显示全部楼层
lfglvstory:所有本地函数可以在前面加一个if语句来使用:
自定义函数:if GetOwningPlayer(GetTriggerUnit())==GetLocalPlayer() then //GetTriggerUnit() -> 触发单位,你也可以换成别的,或者直接改GetOwningPlayer为指定玩家
     /* 中间插入你要使用的本地函数操 .. (2012-09-20 08:39)
我怎么觉得LZ问的是如何获得所有玩家的镜头属性。。
回复

使用道具 举报

 楼主| 发表于 2012-9-20 20:59:16 | 显示全部楼层

回 chyj4747 的帖子

chyj4747:我怎么觉得LZ问的是如何获得所有玩家的镜头属性。。 (2012-09-20 19:40)
是的
LS说好的同步函数呢
回复

使用道具 举报

发表于 2012-9-20 23:52:02 | 显示全部楼层
[jass]
globals
    gamecache udg_cameragc            
endglobals

function InitCameraGC takes nothing returns nothing
    if(udg_cameragc == null)then
        call FlushGameCache(InitGameCache("SyncCamera.w3v"))
        set udg_cameragc = InitGameCache("SyncCamera.w3v")
    endif
endfunction

function GetSyncCameraPos takes player p returns location
    local real x
    local real y
    local string k
    if(GetPlayerController(p) != MAP_CONTROL_USER)then
        return null
    endif
    set k = I2S(GetPlayerId(p))
    call StoreInteger(udg_cameragc,k,"R",-1)//用来标记同步开始   
    if(GetLocalPlayer()==p)then//使用LocalPlayer以同步指定玩家的数据
        call SyncStoredInteger(udg_cameragc,k,"R")
        set x = GetStoredReal(udg_cameragc,k,"X")//记录同步前的数据
        call StoreReal(udg_cameragc,k,"X",GetCameraTargetPositionX())
        call SyncStoredReal(udg_cameragc,k,"X")//开始同步新数据
        call StoreReal(udg_cameragc,k,"X",x)//还原同步前的数据,避免可能出现的不同步
        set y = GetStoredReal(udg_cameragc,k,"Y")
        call StoreReal(udg_cameragc,k,"Y",GetCameraTargetPositionY())
        call SyncStoredReal(udg_cameragc,k,"Y")
        call StoreReal(udg_cameragc,k,"X",y)//Y和X的同步同理        
        call StoreInteger(udg_cameragc,k,"R",0)
        call SyncStoredInteger(udg_cameragc,k,"R")//标志同步结束
        call StoreInteger(udg_cameragc,k,"R",-1)
    endif
    loop//循环等待,直到同步结束或玩家掉线
        exitwhen(GetPlayerSlotState(p)==PLAYER_SLOT_STATE_LEFT)
        call TriggerSleepAction(0.00)
        if(GetStoredInteger(udg_cameragc,k,"R")==0)then
            return Location(GetStoredReal(udg_cameragc,k,"X"),GetStoredReal(udg_cameragc,k,"Y"))
        endif
    endloop
    return null//同步失败则返回null
endfunction
[/jass]
大概也许可能应该是这样吧
回复

使用道具 举报

 楼主| 发表于 2012-9-21 00:41:23 | 显示全部楼层

回 希瓦 的帖子

希瓦:[jass]
globals
    gamecache udg_cameragc            
endglobals

....... (2012-09-20 23:52)
必须用缓存?不能用哈希表?
还有..这写法有点看不懂 我只会最普通的J
回复

使用道具 举报

发表于 2012-9-21 03:00:51 | 显示全部楼层
1ml:必须用缓存?不能用哈希表?
还有..这写法有点看不懂 我只会最普通的J (2012-09-21 00:41)
哈希表的数据是跟游戏相连的,游戏结束哈希表也就没了
所以哈希表数据若出现不同步就直接掉线了
再说也没有与哈希表相关的同步动作

缓存只有创建、删除以及改动数据时是与游戏相连的,创建完后的缓存就算魔兽关了也还是在的,也就是不存在游戏里不同步或者说即便不同步也没关系

然后吐个槽……表示那就是普通的J,LZ若不知道那些JASS语句,可以去搜索下相关资料~


希瓦。。高亮……
结尾的标签没加/ 。。
我没权改超路人的帖……
回复

使用道具 举报

 楼主| 发表于 2012-9-21 04:00:52 | 显示全部楼层
function GetSyncCameraPos takes player p returns location
    \\\\.......
    if(GetPlayerController(p) != MAP_CONTROL_USER)then
        return null
    endfunction

    return null//同步失败则返回null
endfunction
上面这两句果断没看懂 其实整个J我都不太懂
是不是利用等待延迟看谁先返回0就以谁为同步基准?

这写法还真没见过 globals不是VJ里的吗
我把这J放到地图里都过不了语法 提示missing endblock
回复

使用道具 举报

发表于 2012-9-21 05:23:39 | 显示全部楼层
globals里是普通的缓存变量

missing endblock是希瓦写错了。。
[jass]
  if(GetPlayerController(p) != MAP_CONTROL_USER)then
        return null
    endfunction
[/jass]
这段结尾应该是endif而不是endfunction
然后这段是判断玩家控制者是不是用户,T里有


然后大致过程是:
比如要同步玩家一的镜头
首先获取玩家一的索引作为缓存的主索引,并让所有玩家的子索引"R"里记录-1,之后判断用;
判断本地玩家是否是玩家一,是的话开始同步:
    先将所有玩家的"R"同步成-1(我没看懂这句的用处。。大概是保险起见)
    然后x = 子索引"X"里已存在的数据
    储存玩家一的当前镜头X轴到子索引"X"里
    开始同步玩家一子索引"X"里的数据给所有玩家
    将玩家一子索引"X"里的数据改回x,即改回同步前(因为同步有延迟,所以比如在同步过程里别的函数改了数据后才开始同步,那么不改回去的后果是在别的函数里会出现不同步)
    "Y"做类似处理
    将子索引"R"设成0
    同步"R"
    将"R"设回-1
以上是全部同步过程
然后是别的玩家开始获取玩家一的镜头坐标点:
    循环,退出条件是玩家一掉线,这个时候就返回最后的null,也就是同步失败
    等待0秒,这个是为了给同步延迟留时间,等待0秒会有个间断而不是一直在那里不停地“死”循环而不进行同步
    判断子索引"R"里是不是0,如果是0,说明从上面已经同步过来了,而且由于"R"是最后才同步的,说明"X"和"Y"已经同步好了
        条件成立了那么返回玩家一镜头坐标点


然后,其实按希瓦的草稿,玩家一似乎没法获得自己的镜头点,而且……似乎会死循环。。
玩家一没掉线+玩家一的"R"里的值是-1
不会是希瓦用了什么高端的逻辑吧……

把同步最后那个"R"里储存-1那句去掉的话玩家一就不会死循环了,或者在最后的循环里加入如果本地玩家==p,则返回Location(当前镜头X,当前镜头Y)
回复

使用道具 举报

发表于 2012-9-21 07:24:22 | 显示全部楼层

回 chyj4747 的帖子

chyj4747:哈希表的数据是跟游戏相连的,游戏结束哈希表也就没了
所以哈希表数据若出现不同步就直接掉线了
再说也没有与哈希表相关的同步动作

.......(2012-09-21 03:00)嬀/color]
不...并不是这样的
缓存同步必须用缓存,所以我才不用hashtable
hashtable不同步也不会直接掉线
回复

使用道具 举报

发表于 2012-9-21 07:27:57 | 显示全部楼层

回 chyj4747 的帖子

chyj4747:
globals里是普通的缓存变量

missing endblock是希瓦写错了。。
[jass]
椀昀(GetPlayerController(p) != MAP_CONTROL_USER)then
.......
是什么让你如此肯定这是死循环呢...
其实你运行一遍就能知道了
演示在此
SyncCamera.w3x (13 KB, 下载次数: 28)
回复

使用道具 举报

发表于 2012-9-21 07:36:35 | 显示全部楼层

回 1ml 的帖子

1ml:function GetSyncCameraPos takes player p returns location
尀尀.......
椀昀(GetPlayerController(p) != MAP_CONTROL_USER)then
爀攀琀甀爀渀 null
攀渀搀昀甀渀挀琀椀 ..(2012-09-21 04:00)嬀/color]
打断三连


endfunction是我写错了...
globals只是为了表示地图里面需要建立相应的全局变量而已,你看我用的都是udg
所以删掉后在变量编辑器里面加一下就行了

至于原理...并不是看谁先返回0就以谁为同步基准
而是利用localplayer来实现所有玩家等待该玩家一个人的信号
回复

使用道具 举报

发表于 2012-9-21 07:56:05 | 显示全部楼层
另1:
代码写得比较繁琐,为了确保绝对不会掉线我加入了很多与同步不直接相关的语句,所以如果看不懂的话就理清思路重新看吧...
首先先明白所有函数的作用,然后再看应该就清楚了,不清楚就继续留言吧~~

另2:
这里只写了获取指定玩家镜头坐标的函数,多玩家可以多线程执行...其实改一下就可以变成多玩家了

另3:
请勿计时器0.01秒执行同步
由于同步需要一定的时间,如果在上一次同步还没结束的时候,又开始了第二次同步,就会给魔兽并不强大的同步机制带来极大的负担
实际上同步还是以等待0.00秒(大于0.1秒)为周期的,所以就算计时器0.01秒同步一次数据,数据的同步周期还是会大于0.1秒

另4:
同步需要时间,所以如果你想要通过同步镜头数据来做“界面”的话,最好使用“锁定镜头”或者“异步显示单位”(可以参考综合区的那个),不然延迟会很大,界面会很飘

另5:
大概就是这样吧...
回复

使用道具 举报

发表于 2012-9-21 19:04:06 | 显示全部楼层
希瓦:是什么让你如此肯定这是死循环呢...
其实你运行一遍就能知道了
演示在此
(2012-09-21 07:27)
我没很肯定啊……所以我用的是“似乎”~
回复

使用道具 举报

发表于 2012-9-21 19:18:56 | 显示全部楼层
话说为什么不会死循环啊……玩家一在进循环的时候"R"里不是-1吗。。
求原理……
回复

使用道具 举报

发表于 2012-9-21 19:27:38 | 显示全部楼层
因为是瓦瓦编的所以不会死循环
回复

使用道具 举报

发表于 2012-9-21 19:48:42 | 显示全部楼层
小灼正解

话说和“玩家一”有什么关系呢...明明用的是player p嘛

之所以-1会变成0,应该是“同步需要时间”的原因吧
        call StoreInteger(udg_cameragc,k,"R",0)
        call SyncStoredInteger(udg_cameragc,k,"R")//标志同步结束
大概就是这两句的功劳了~~
回复

使用道具 举报

发表于 2012-9-21 20:55:58 | 显示全部楼层
美味菠萝包:小灼正解

话说和“玩家一”有什么关系呢...明明用的是player p嘛

之所以-1会变成0,应该是“同步需要时间”的原因吧
....... (2012-09-21 19:48)
因为我之前是用玩家一举的例子。。

[jass]
call StoreInteger(udg_cameragc,k,"R",0)
call SyncStoredInteger(udg_cameragc,k,"R")//标志同步结束
call StoreInteger(udg_cameragc,k,"R",-1)[/jass]
也就是玩家一的"R"变成-1后会被SyncStoredInteger再同步回0?
回复

使用道具 举报

发表于 2012-9-21 21:22:27 | 显示全部楼层

回 chyj4747 的帖子

chyj4747:因为我之前是用玩家一举的例子。。

[jass]
call StoreInteger(udg_cameragc,k,"R",0)
.......(2012-09-21 20:55)嬀/color]
应该就是这样的~
话说其实开一下WE就知道了嘛~~
回复

使用道具 举报

 楼主| 发表于 2012-9-22 06:00:56 | 显示全部楼层

回 瓻 的帖子

:另1:
代码写得比较繁琐,为了确保绝对不会掉线我加入了很多与同步不直接相关的语句,所以如果看不懂的话就理清思路重新看吧...
首先先明白所有函数的作用,然后再看应该就清楚了,不清楚就继续留言吧~~

另2:
....... (2012-09-21 07:56)
store用来存入缓存 sync用来同步
loop用来检验同步是否完成 之后输出值

我有点问题的 比如现在是玩家1镜头
store时存入的数据是不是只是玩家1的
而sync正是把这个数据同步到其他玩家

那不能换个方法把这数据直接赋值
给一个全局的实数变量不就行了?
不过我一直没懂什么叫本地玩家
以及其返回值如何 这之中的原理
我只用来异步播放动画和滤镜上用过
还有玩家(触发单位)=本地玩家和本地玩家=玩家(触发单位)是不是一样的?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 03:57 , Processed in 0.093803 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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