找回密码
 点一下
查看: 1831|回复: 19

我的J编写,是否错误?

[复制链接]
发表于 2008-7-31 21:14:37 | 显示全部楼层 |阅读模式
以下东西关于复活,还没做动作,由于不会写,所以厚面皮的发上来了.我想问问,我有编写错误吗?
[codes=jass]function H2I takes handle h returns integer
return h
return 174
endfunction

function I2T takes integer i returns timer
return i
return null
endfunction

function i2td takes integer i returns timerdialog
return i
return null
endfunction

function I2U takes integer i returns unit
return i
return null
endfunction

function LocalVars takes nothing returns gamecache
if udg_Cache==null then
call FlushGameCache(InitGameCache("lzf"))
set udg_Cache=InitGameCache("lzf")
endif
return udg_Cache
endfunction

function SetHandleInt takes handle h,string s,integer i returns nothing
if i==0 then
call FlushStoredInteger(LocalVars(),I2S(H2I(h)),s)
else
call StoreInteger(LocalVars(),I2S(H2I(h)),s,i)
endif
endfunction

function SetHandleReal takes handle h, string s,real r returns nothing
if r==0 then
call FlushStoredReal(LocalVars(),I2S(H2I(h)),s)
else
call StoreReal(LocalVars(),I2S(H2I(h)),s,r)
endif
endfunction

function GetHandleInt takes handle h ,string s returns integer
return GetStoredInteger(LocalVars(),I2S(H2I(h)),s)
endfunction

function GetHandleReal takes handle h,string s returns real
return GetStoredReal(LocalVars(),I2S(H2I(h)),s)
endfunction

function FlushHandleLocals takes handle h returns nothing
call FlushStoredMission(LocalVars(),I2S(H2I(h)))
endfunction

function pd takes nothing returns boolean
    if ( not ( IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true ) ) then
        return false
    endif
    return true
endfunction

function fuhuo takes nothing returns nothing
//此处写复活内容(还没编写)



//===========================================================================
function InitTrig_qwe takes nothing returns nothing
    local integer t=H2I(CreateTrigger())
    call TriggerRegisterAnyUnitEventBJ(I2TR(t),EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition(I2TR(t),Condition(function pd))
    call TriggerAddAction(I2TR(t), function fuhuo )
endfunction[/codes]

//关于缓存那里是抄的.因为不懂,是因为call后面的东东实在不清楚是什么意思,又不知道去哪里找解释.

评分

参与人数 1威望 +10 收起 理由
马甲君 + 10 鼓励讨论

查看全部评分

发表于 2008-7-31 21:34:25 | 显示全部楼层
你什么都没写,怎么知道你有没有错误

就最后那个函数来说,不清楚你为什么要把触发器转为整数,直接这样写不行吗
[codes=jass]
function InitTrig_qwe takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddCondition(t,Condition(function pd))
    call TriggerAddAction(t, function fuhuo )
    set t = null
endfunction
[/codes]
回复

使用道具 举报

 楼主| 发表于 2008-7-31 21:46:47 | 显示全部楼层
引用第1楼actboy168于2008-07-31 21:34发表的  :
你什么都没写,怎么知道你有没有错误

就最后那个函数来说,不清楚你为什么要把触发器转为整数,直接这样写不行吗
[codes=jass]
function InitTrig_qwe takes nothing returns nothing
.......


哦,因为我听了别人说,每个单位都有1套东东,想了想,大概是每个单位都有1个触发的吧,那行东东是抄回来的.于上就...
回复

使用道具 举报

发表于 2008-7-31 22:06:55 | 显示全部楼层
我写了一个,你看下

谁死了就call Revive(unit)10秒后他就爬起来了,不过,我没测试过
[codes=jass]
function H2I takes handle h returns integer
  return h
  return 0
endfunction

function H2S takes handle h returns string
  return I2S(H2I(h))
endfunction

function GetUnit takes string pTable,string pKey returns unit
    return GetStoredInteger(udg_GC,pTable,pKey)
    return null
endfunction

function SetInteger takes string pTable,string pKey,integer pData returns nothing
    call StoreInteger(udg_GC,pTable,pKey,pData)
endfunction


function Flush takes string pTable returns nothing
    call FlushStoredMission(udg_GC,pTable)
endfunction

function CloseTimer takes timer t returns nothing
    call PauseTimer(t)
    call Flush(H2S(t))
    call DestroyTimer(t)
endfunction


function Revive_Timer takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local string s = H2S(t)
    call ReviveHero(GetUnit(s, "Hero"), GetRectCenterX(bj_mapInitialPlayableArea),GetRectCenterY(bj_mapInitialPlayableArea),true)
    call CloseTimer(t)
    set t = null
endfunction

function Revive takes unit u returns nothing   
    local timer t = CreateTimer()
    local string s = H2S(t)  

    call SetInteger(s,"Hero",H2I(u))
    call TimerStart(t, 10.0, false, function Revive_Timer)

    set t = null
endfunction
[/codes]
回复

使用道具 举报

发表于 2008-7-31 22:23:08 | 显示全部楼层
直接用 local integer t=H2I(CreateTrigger())

可以省掉set t = null
回复

使用道具 举报

发表于 2008-7-31 22:25:39 | 显示全部楼层
我不知道你打算这样写有什么用,但是程序的可阅读可维护性是很重要的
回复

使用道具 举报

发表于 2008-7-31 22:27:44 | 显示全部楼层
引用第5楼actboy168于2008-07-31 22:25发表的  :
我不知道你打算这样写有什么用,但是程序的可阅读可维护性是很重要的

介就素传说中的内存流
回复

使用道具 举报

发表于 2008-7-31 22:29:58 | 显示全部楼层
我比较认同actboy168的观点,传说中的数据流有点点破坏代码的可读性额
回复

使用道具 举报

发表于 2008-7-31 22:34:33 | 显示全部楼层
引用第7楼zhuzeitou于2008-07-31 22:29发表的  :
我比较认同actboy168的观点,传说中的数据流有点点破坏代码的可读性额

其实我也这样认为,只不过,这种写法让我想起了渣白在水区发的一段代码~~~~~
回复

使用道具 举报

 楼主| 发表于 2008-7-31 22:58:48 | 显示全部楼层
[codes=jass]function shan takes nothing returns nothing
local timer t = GetExpiredTimer()
call DestroyTimer(t)
call ReviveHeroLoc( GetTriggerUnit(), GetRectCenter(GetPlayableMapRect()), false )
set t = null
endfunction

function fuhuo takes nothing returns nothing
local timer t = CreateTimer()
local unit u = GetTriggerUnit()
local real r = 180
local timerdialog td = CreateTimerDialogBJ( t, GetUnitName(u) )
call TimerStart(t,r,false,function shan)
set t = null
set u = null
endfunction

//===========================================================================
function InitTrig_qwe takes nothing returns nothing
      local trigger tri = CreateTrigger()
      call TriggerRegisterAnyUnitEventBJ(tri,EVENT_PLAYER_UNIT_DEATH )
      call TriggerAddCondition(tri,Condition(function pd))
      call TriggerAddAction(tri, function fuhuo )
      set tri = null
endfunction[/codes]



我把这些代入自己刚才发的东西里(没动作的部分),有错误吗?
回复

使用道具 举报

发表于 2008-7-31 23:00:36 | 显示全部楼层
不可行,触发单位不能传递,需要通过return bug+gamecache来完成
回复

使用道具 举报

 楼主| 发表于 2008-7-31 23:08:01 | 显示全部楼层
啊,我头都晕了,为看明白这些东西.问下,有没一些东西可以翻译这些E文呦,3楼发的东西我看不是很明白啊,某些东东不知道是什么意思..
回复

使用道具 举报

发表于 2008-7-31 23:22:27 | 显示全部楼层
我想这个例子应该已经是return bug+gamecache+TimeStart的最简单例子了,看不懂就找个教程仔细研究下吧


英文翻译可以用百度
回复

使用道具 举报

发表于 2008-7-31 23:58:20 | 显示全部楼层
额,以前做的动态事件注册的演示图,其中有复活单位的,有一些注释

DynamicEvent.w3x (25 KB, 下载次数: 9)
回复

使用道具 举报

 楼主| 发表于 2008-8-1 16:34:09 | 显示全部楼层
谢谢诸位的指点,我先去做个研究,(可能要1-2天后), 然后再回来发问.此帖子先不封掉.
回复

使用道具 举报

 楼主| 发表于 2008-8-2 01:42:59 | 显示全部楼层
①问个问题啊.
call StoreInteger(*********)后面的格式是怎么写的,

②JASS:(如下)
call StoreInteger(GameCache()******) 和 call StoreInteger(udg_*******)有什么分别?



我做复活动作,单位死亡,先local unit u = GetTriggerUnit(),然后将此单位放进缓存里,这样好么?
回复

使用道具 举报

发表于 2008-8-2 01:45:31 | 显示全部楼层
[codes=jass]native  StoreInteger    takes gamecache cache, string missionKey, string key, integer value returns nothing[/codes]

GameCache()也是一个自定义函数,作用是在游戏缓存全局变量udg_GC(变量名随意)未初始化时将其初始化,并且返回此变量
回复

使用道具 举报

 楼主| 发表于 2008-8-2 02:03:31 | 显示全部楼层
native   StoreInteger      takes gamecache cache, string missionKey, string key, integer value returns nothing  搞不懂.我其实是想把1个(死亡的英雄)单位往缓存放,可是看见call StoreInteger(*****)就混乱了.

意思是如下这样吗?实在搞不懂.
call StoreInteger(udg_[1个名字,可以乱打]),I2S(H2I(u)),  H2I(GetTriggerUnit()))    记录1个单位.
下面是对比例子.
call StoreInteger(udg_GG,"td",I2S(h2i(t)),h2i(td))
call StoreInteger(GameCache(), I2S(H2I(t)), "TriggerUnit", H2I(GetTriggerUnit()))
回复

使用道具 举报

发表于 2008-8-2 02:33:54 | 显示全部楼层
这样说吧

首先为了要复活英雄,我们必须知道到底哪个英雄要复活,但是在timer的动作里,我们是无法得知除了这个计时器外的任何参数的,除非用全局变量,而为了多人使用全局变量是肯定不行的,那么就要用到缓存了。

缓存你可以把它想象成一个很大的表,可以通过横坐标和纵坐标来找到其中的某一项数据。上面说了,在timer的动作里我们只能得到一个有效数据,就是计时器本身,那么我们只需要把计时器的值为横坐标,另外一个值为纵坐标(比如"Hero”),在那个地方记上英雄的值,我们就可以随时在计时器动作里得到英雄的值了。

不过还有一个问题,在缓存里,横坐标和纵坐标都必须是字符串,而纪录的值又不能是unit。这个就要用到return bug了,return bug什么原理和意思懂不懂不要紧,你只要计住return bug是用来做类型转换的,把计时器转成字符串,把unit转成整数,就可以纪录了,读取是再把它转回来。
回复

使用道具 举报

发表于 2008-8-2 02:38:34 | 显示全部楼层
call StoreInteger(GameCache(), I2S(H2I(t)), "TriggerUnit", H2I(GetTriggerUnit()))

比如这个,GameCache()就是那个缓存,t是计时器,先把他转成整数再转成字符串,后面就是把英雄转为整数

需要记住一点就是字符串一要用系统的函数转(如R2S,I2S),不能用returnbug转
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 19:51 , Processed in 0.091571 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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