请选择 进入手机版 | 继续访问电脑版

GA地精研究院

 找回密码
 立即注册
查看: 3076|回复: 13

[讨论] 1.24,我们失去的不只是Return Bug

[复制链接]
发表于 2010-1-24 20:09:29 | 显示全部楼层 |阅读模式
还有弱类型转换,类似这样的
[jass]
function h2u takes handle h returns unit
return h
endfunction
[/jass]
这种和Return Bug无关的代码(Return Bug是语法检查只检查最后一个return的数据类型)在1.24之前可以很好的工作,连BJ函数GetDyingDestructable()也是这种写法,可惜1.24通通被砍掉了,GetDyingDestructable()变成了native函数。
为了缅怀这个失去的功能,发一下我写的DataSystem,主要目的是为了实现1.20和1.24通用,因此无法获得handle值(1.20下没有GetHandleId,1.24下没有H2I)
[jass]
globals
    integer indexTop = 1
    integer array indexFront
    integer array indexNext
    handle array indexHandle
endglobals

function Error takes nothing returns nothing
    call BJDebugMsg(“Error!”)
endfunction

function new takes handle h returns integer
    if(indexTop > JASS_MAX_ARRAY_SIZE)then
        call Error()
        return 0
    endif
    set indexNext[indexFront[0]] = indexTop
    set indexFront[indexTop] = indexFront[0]
    set indexFront[0] = indexTop
    if(indexNext[indexTop] == 0)then
        set indexTop = indexTop + 1
    else
        set indexTop = indexNext[indexTop]
        set indexNext[indexFront[0]] = 0
    endif
    set indexHandle[indexFront[0]] = h
    return indexFront[0]
endfunction

function delete takes integer i returns nothing
    if(i > 0)then
        set indexNext[indexFront] = indexNext
        set indexFront[indexNext] = indexFront
        set indexNext = indexTop
        set indexHandle = null
        set indexTop = i
    endif
endfunction

function getIndex takes handle h returns integer
    local integer i = 0
    if(h != null)then
    loop
        set i = indexNext
        exitwhen i == 0 or indexHandle == h
    endloop
    endif
    return i
endfunction
[/jass]
(修正一个bug)
为了效率,函数没有进行安全检测机制,所以使用时请谨慎

最后来个简单的使用方法,一个比较平滑的(就是不受地形高低影响)抛物线跳跃演示

WorldEditTestMap.w3x

25 KB, 下载次数: 44

评分

参与人数 1威望 +2 收起 理由
血戮魔动冰 + 2 ~

查看全部评分

发表于 2010-1-24 20:17:13 | 显示全部楼层
…………整个一链表……
效率好低……
帮你把第一段代码的一个小小的失误改了一下。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-24 20:19:23 | 显示全部楼层
不用链表能用什么
其实效率也不会多低,只会检索正在使用的handle,一般来说是绑定计时器或者触发,而需要绑定并且同时运行的不会超过300个吧
回复 支持 反对

使用道具 举报

发表于 2010-1-24 21:04:02 | 显示全部楼层
比Hashtable要慢不少……
回复 支持 反对

使用道具 举报

发表于 2010-1-24 21:44:53 | 显示全部楼层
[codes=jass]function h2u takes handle h returns unit
    local integer i = GetHandleId(h)
    local hashtable ht = InitHashtable()
    local unit result = null
    local fogstate fs = ConvertFogState(i)
    call SaveFogStateHandle(ht, 0, 0, fs)
    set result = LoadUnitHandle(ht, 0, 0)
    call FlushParentHashtable(ht)
    set ht = null
    set fs = null
    return result
endfunction[/codes]

可以用这样的方法实现……

来源:n个月前在wc3c看到的,当时没想到这个的用途,或许lz的问题属于一个吧

这个在1.24c下测试没问题,刚发现1.24d is alive,不晓得是否依然有效

点评

你是说 这些save是通的吗 save XXX hanlde Load YYY hanlde 可以 实现 转换?  详情 回复 发表于 2017-2-26 10:15
回复 支持 反对

使用道具 举报

发表于 2010-1-24 22:30:30 | 显示全部楼层
又想起一个问题,这样的写法不是1.24砍掉的,以前就通不过,但是bj那个GetDyingDestructable的确是这么写的……我还为此纠结了一段时间= =
额,居然不是编辑状态,思路不清了……

点评

它是 bj 自定义函数啊 function GetDyingDestructable takes nothing returns destructable return GetTriggerDestructable() endfunction  详情 回复 发表于 2017-2-26 10:16
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-24 22:54:09 | 显示全部楼层
以前能通过的,你可以试试
回复 支持 反对

使用道具 举报

发表于 2010-1-25 20:40:03 | 显示全部楼层
call SaveFogStateHandle(ht, 0, 0, fs)
    set result = LoadUnitHandle(ht, 0, 0)

这两行怎么ppass的。。ht类型检查的bug?
回复 支持 反对

使用道具 举报

发表于 2010-1-25 23:07:07 | 显示全部楼层
这个……请问玻璃渣= =
回复 支持 反对

使用道具 举报

发表于 2010-1-29 10:24:27 | 显示全部楼层
居然素链表。。。
回复 支持 反对

使用道具 举报

发表于 2010-2-26 03:39:52 | 显示全部楼层

回 5楼(zhuzeitou) 的帖子

啊~ 那~~~ 把它塞进地图的BJ里会不会混过去呢?
回复 支持 反对

使用道具 举报

发表于 2010-2-26 09:20:05 | 显示全部楼层
额……你可以试试看= =
这帖感觉似乎很远古的样子= =
回复 支持 反对

使用道具 举报

发表于 2017-2-26 10:15:25 | 显示全部楼层
zhuzeitou 发表于 2010-1-24 21:44
[codes=jass]function h2u takes handle h returns unit
    local integer i = GetHandleId(h)
    local  ...

你是说 这些save是通的吗

save XXX hanlde
Load YYY hanlde
可以 实现 转换?
回复 支持 反对

使用道具 举报

发表于 2017-2-26 10:16:20 | 显示全部楼层
zhuzeitou 发表于 2010-1-24 22:30
又想起一个问题,这样的写法不是1.24砍掉的,以前就通不过,但是bj那个GetDyingDestructable的确是这么写的 ...

它是 bj 自定义函数啊
function GetDyingDestructable takes nothing returns destructable
    return GetTriggerDestructable()
endfunction
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2018-8-16 02:15 , Processed in 0.049270 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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