《饥荒补遗》
本文来自:
--------------------------------------------------------------------------------
联系方式:
QQ:1486276329,1723386660
Email:1486276329@qq.com
blog: http://www.cnblogs.com/czfblog/
阅读本文如有不解之处,请联系我!
小帆 著
14 年 1 月 31 日.
第一章:从一个物品说起 log—木头.
打开 log.lua,映入眼帘的是一个资源表 Asset 和一个大的函数 fn
资源表用来载入与这个物品有关的资源文件,它的每一个内容都是一个 Asset 类的实例,
Asset 的构造函数定义在 prefabs 文件里.主要参数有两个,类型名,和文件.
fn 函数是用来作为一个参数的,在构建一个新的 prefads 对象时,这个函数作为一个参数传
入对象里.
每 一 个 物 品 文 件 最 终 都 会 输 出 一 个 prefads 对 象 , 在 prefablist.lua 里 定 义 了 一 个
table(名称为 PREFABFILES)用来表明所有的物品文件的名称,
在 main.lua(212 行) 里, ModSafeStartup 函数把所有的 PREFABFILES 表明的文件都载入,
同样地,在 mainfunction(684 行)里,也有一个函数用来载入所有的物品文件.
综上所述,要创建一个新的物品,需要在物品描述文件里创建一个新的 prefads 对象,且要在
PREFABFILES 里添加文件名(PREFABFILES[#PREFABFILES]=物品文件名).
在一个物品的描述函数 fn 里,首先用函数 CreateEntity 创造一个实物对象
(EntityScript,这个对象定义在 EntityScript.lua 里,里面定义了 40 多个方法,最好把这个
文件看一遍,加深一下理解),
且把对象登记在 Ents 表里,
并返回这个对象到局部变量 inst 里(这个变量在物品实例创造后就消失,不会影响其余的物
品,还有就是可以省点内存,这就是局部变量的好处.别小看这个局部变量,假如没有用局部变
量,饥荒运行过程中的内存使用至少要增加 10 倍以上).
有了这个物品实例后,就来操作这个物品,最终输出这个物品对象就行了(return inst)
首先增加了两个属性 Transform(变化)和 AnimState(特征声明),这两个函数的定义我找不到
在哪,等我找到了再来解释.
之后把这个对象加入 MakeInventoryPhysics(物理对象清单),
在物品 inst 里增加了一个 physics 对象,这个函数定义在 standardcomponents.lua 里,可以
用来操控物理现象.
下面的三行用来改造特征属性,这个以后再说.
属性弄好了之后,开始增加成分了,这些成分定义在 components 文件夹里,我们的物品对象调
用增加成分函数,在 components 目录找到对应的文件并假如到物品里,这个函数声明在文件.
EntityScript.lua 里.
成分内容以后再说.
欧了,到现在,一个基本的物品就构建成功了,总结一下
饥荒程序调用 main.lua 文件,把 PREFABFILES 列表里所示的物品文件载入,每一个物品文件最
终输出一个 prefabs 类的实例,每个 prefabs 对象接受三个参数,物品名,物品函数 fn,资源表.
资源表的每一项都是 asset 类的实例.物品函数 fn,输出一个物品实例对象,这个物品的实例
的属性可以用对应的方法修改,重点是增加成分(components)
第二章:系统 ui{主界面}------mainscreen.lua
这个文件用来生成主界面,就是我们运行饥荒时显示的界面,
我们通过修改这个文件,可以定制自己 mod 的个性界面(不过我不赞同这样,你应该创建一个新
的界面,之后修改代码,替换掉 mainscreen,而不是修改他,这个方法以后再 say)
这个文件导入别的界面(设置界面,开始界面等),
并生成一个基本界面对象,
控制别的界面的显示与隐藏.
从一个最简单的函数说起,MainScreen:Settings(328 行),
在主界面调用这个函数时,弹出设置窗口,我们来看一下这个函数时怎样实现的.
在饥荒里,都用一个 FrontEnd(见 FrontEn.lua)类的实例 TheFrontEnd,
这个就是前端显示,在这个对象里,有一个弹出窗口的函数(PushScreen 330 行),
这个函数接受一个界面作为参数,并显示出这个界面.
这个函数很重要很重要很重要,假如你自己做了一个界面,就可以用这个函数调用了.
MainScreen:Settings 每一次调用,就是弹出一个设置窗口而已,我们再来看这个在什么时候被调
用(废话,一定在点击 setting 按钮时被调用了呗).这个函数没你们想得那样简单,很复杂的说.
首先,在每一个界面(screen)里都用一个主要的函数(doinit 49 行),
用来绘制这些个按钮啊,图片啊,菜单啊.在主界面的 doinit 里,绘制了许多的控件,其中他调用了
mainmenu(231,452 行)
函数来绘制菜单.下面的注意看!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
IsGamePurchased 函数定义在
这个函数返回一个布尔值.
继续
原理如下:
先建立一个菜单表,把每一项菜单加入菜单里,主界面设置菜单.
现在我们来增加一个增加的菜单
其中有一个菜单项(OPTIONS,选项,471 行),
绑定了事件 DoOptionsMenu(373),
(就是我们单击这个菜单项时,就调用 DoOptionsMenu 函数)
调用了 DoOptionsMenu()函数之后,主界面的 menu 就随之改变