dsweddd2014-07-11 03:27
(译自国外教程:codetipsandtricks“代码提示和技巧”)
作者:squeek
我只是想记录一下我改装饥荒.一路上的一些事情,这些事情是我觉得在游戏的书写过程,可能有点隐藏,不直观,不记录,或很难找到答案。。
一个工作示例的所有提到的东西都可以在这里找到:
例如:代码的技巧和窍门
需要是必需的(requireisrequired,前一个是名词,后一个是形容词)
require这个lua函数是一个非常方便的工具。无论何时加载一个文件时,它将结果存储表中(无论文件是否返回)(package.loaded),和任何后续需要调用相同的模块名称(你可以把模块名当做文件名,如果现在你不熟悉lua模块)会给你一个参考先前的结果。
组件(components),屏幕(screens),小部件(widgets),这些模块基本上返回一个定义好的类(type)(因为他们将几乎总是返回类的文件)。
因为这个函数(require)它会缓存结果,并参考缓存的结果,如果你修改它返回的结果,然后还要调用这个模块,饥荒通常会重新加载这些文件。
(译者案:上面的一段话看不懂,安照意思翻译了一下,总感觉怪怪的,好像没理解清楚作者的意思,在这里附上原文)
sincerequirecachesitsresultsandgivesyouareferencetothatcachedresult,ifyouretrievetheresultandmodifyit,youthenalsomodifytheresultofanyfuturerequirecalls(anddon'tstarvewillusuallyuserequiretoloadthesefiles).
有了它,你就可以这样做:
--如果你在mod里使用(modmain.lua),你必须从全局表(_g)得到.
localrequire=global.require
--利用(或参考)缓存表package.loaded[components/deployable]
localdeployable=requirecomponents/deployable
--如果这个函数存在就创建一个备份,否则就创建一个新的函数,以防出现错误.
localdeployable_candeploy_base=deployable.candeployorfunction()returntrueend
functiondeployable:candeploy(pt)
--得到结果从上面的备份函数
-- 译者案:x:fn()就是x.fn(x)的缩写形式,(这是lua中的一个语法糖)
localcan_deploy=deployable_candeploy_base(self,pt)
--增加我们自己需要的参数(需要量?)
can_deploy=can_deployandpt==global.point(0,0,0)
returncan_deploy
end
注意:这是比使用addcomponentpostinit方式更快,而不是覆盖函数(s)为每一个组件形成,这只是那修改一次,仅此而已。就我而言,这应该是首选的方法扩展/覆盖任何饥荒类的定义。
将组件添加到所有人物
下面可以解决这个方案如果你将一个组件添加到播放器使用addsimpostinit预制,onsave和onload组件将不工作(注:这只是simpostinit,不是prefabpostinit)。我没有调查原因,但为了解决您应该使用以下方法:
--增加一个成分在这里,onsave函数将不工作.
addprefabpostinit(world,function(inst)
global.assert(global.getplayer()==nil)
localplayer_prefab=global.savegameindex:getslotcharacter()
--不幸的是,我们现在不能增加一个(postinits,不知道是什么:)
--所以我们需要增加是很难的
global.thesim:loadprefabs({player_prefab})
localoldfn=global.prefabs[player_prefab].fn
global.prefabs[player_prefab].fn=function()
localinst=oldfn()
--增加成分在这里
inst:addcomponent(yourcomponent)
returninst
end
end)
利用时间安排
有时你可能需要访问不存在的东西。
例如,一个实物(prefab)的转换将在prefabpostinit尚未初始化之前或构造组合式的fn函数之前。所以,让我们说,你想做一些基于块(瓷砖)类型派生的东西。最简单的方法是创建一个任务,将在执行0秒(dotaskintime函数,参数为0秒),这本质上等待一个框架在执行之前您提供的回调函数。
addprefabpostinit(berrybush,function(inst)
--inst.transform:getworldposition()这个函数将输出世界坐标,在地图未生成前,调用这个函数将出现错误.
inst:dotaskintime(0,function()
---现在,我们可以放心调用这个函数了
inst.transform:getworldposition()
end)
end)
---------下面是关于这个贴子几个比较有用的回复----------
引用:[[[如果你将一个组件添加到播放器使用addsimpostinit预制,onsave和onload组件将不工作(注:这只是simpostinit,不是prefabpostinit)。我没有调查的原因….]]]
回复:原因是当simpostinit解雇,savedata已经加载并传递给现有onload方法,所以太晚了对于一个额外的组件savedata钓到鱼。onsave会工作,但因为onload不它是毫无意义的。
-----------------------
在上面你提到require…
许多lua函数不会不首先加载正确的require,例如……
math=require“math”
string=require“string”
table=require“table”
这些让你做一些非常重要的功能,如math.floor()或string.find()或table.insert()
显然我是个白痴,你不需要这些尽管你需要访问他们需要通过全局变量一样。
math=global.math
string=global.string
table=global.table
/默默地坐在角落里(/sitsquietlyinthecorner)
--------------------------------
回复楼上:
我从来没有“require”这些,他们总是工作。我认为他们需要在一个非常基本的文件或标准。
------------------
回复楼上:
这些都是由lua本身具备的,当它开始运行,并放置在国防部的游戏环境。所以你不需要require(),但同时它是无害的。其他模块的标准库、写作等
debug=global.require/debug
功能相同的
debug=global.debug
从mod内部环境(在global,再次是冗余/无害)。
注,因为lua是嵌入到引擎,它是调用lual_openlibs(l)加载它们,但我跑题了,关键是他们一直require()已经任何代码运行之前。
--------------------
继续回复楼上:
你不需要。那些已经在mod的环境。并不是每一个模块的标准库,但这些都是下面代码定义的:
functioncreateenvironment(modname)
localmodutil=require(modutil)
require(recipe)--foringredient
localenv=
{
tuning=tuning,
characterlist=characterlist,
modname=modname,
pairs=pairs,
ipairs=ipairs,
print=print,
math=math,
table=table,
type=type,
string=string,
tostring=tostring,
class=class,
global=_g,
modroot=../mods/..modname../,
prefab=prefab,
asset=asset,
ingredient=ingredient,
}
env.env=env
--installourcrazyloader!
env.modimport=function(modulename)
print(modimport:..env.modroot..modulename)
localresult=kleiloadlua(env.modroot..modulename)
ifresult==nilthen
error(errorinmodimport:..modulename..notfound!)
elseiftype(result)==stringthen
error(errorinmodimport:..modinfoname(modname)..importing..modulename..!n..result)
else
setfenv(result,env.env)
result()
end
end
modutil.insertpostinitfunctions(env)
returnenv
end