饥荒mod教程:代码提示和技巧

时间:2014-07-11 03:27:22

(译自国外教程: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

猜你喜欢

推荐阅读

最新文章
相关阅读