写一些零碎的省的自己忘掉的东西......
解析器忽略模式,作用为在此区间内不对其内字符进行任何解析(非文件形式可以使用string缓存代码段,所以不存在最外层的"",但' "" '形式会被中间的'提前闭合报错所以不可行)
首先定义忽略符号组,ignoreSections = [ [ "/*" , "*/" ] , [ "'" , "'" ] , [ "\"" , "\"" ] , [ "\'" , "\'" ] ];,当然我还有一个符号组的长度常数。
忽略模式使用于解析器字符串检测循环当中,并具有两个基本值,Result则是共用值,每次循环重置
var IgnoreMode = 0;
var IgnoreSign;
var Result;
// 在头部尝试结束忽略区间
if( IgnoreMode ){
// 检测是否存在闭合符号
if( Result ){
// 匹配成功,闭合忽略区间,将r浮标(i行r列)向后移动闭合符号长度-1个位置
// 将忽略模式值重置
}
}
// 在尾部尝试开启忽略区间
for( var v = 0 ; v < ignoreSections.count ; v++ ){
// 检测是否存在开包符号
// 直接检测首两位字符是否为//,如果是,结束本i行循环,这里需要额外的代码配合
if( Result ){
// 开启忽略模式,并将[ 起始符号 , 闭合符号 ,起始位置 ]存入IgnoreSign
// 同样将r浮标(i行r列)向后移动起始符号长度-1个位置
}
}
主要作用为解析某些格式代码段的时候,不对忽略区间中的段落进行解析替换,例如需要用到某些与区间符号相冲突的字符
使用xxx.xxx.xxx.xxx获取指定对象,但要求判定对象的状态,且能够处理失败的情况,如果目标对象不存在,需要自动创建新对象
分解动作-拆分路径
xxx.xxx格式路径分隔符为"."拆分每一级路径需要将其字符变为.xxx.xxx.格式,并以.为依据将其中间的每一级xxx拆分出。简单的实现可以直接join出来,但我用的是可以指定区间的所以是indexof+for实现,且不支持忽略模式,需要注意的是,这是个泛用函数,不是单独的动作
分解动作-获取对象
这个就比较麻烦了...这里主要的问题是对象的undefined问题,这东西你type也会报错...这时候就只能try过去,毕竟新对象的话需要一级级的去创建路径,但是如果之前就有的话创建就直接爆掉了
所以需要for起来用每一级Path去尝试获取下一级路径,如果下一级路径为空则赋值一个字典,如果不为空就直接把结果赋值为下一级路径,直到末尾
这个东西主要用在载入资源代码段的时候创建域或引用指定域,获取指定域中的片段,例如GameManager.SaveLoad.SceneSaveLoad
使用某些神奇的关联处理逻辑可以使建立的Namespace一定程度上解决kr本身extends必须要完整路径的问题,我受够了global.Layers.BaseLayer extends global.Layers.ParentLayer..............................
对于区间输入值的处理,对标.mp,格式为
$( InputID ? 'InputType' / '( func/contextfunc/inputfunc/classid/parentclassid )' : 'Default' / '( contextvalue/inputvalue )' )
解释一下,$()是最外围框架,这组符号表示这是一个输入值的处理区间
InputID是搜索需要的值的标签,这个东西是直接截下来的所以不需要额外的处理
'InputType'和'( func )'那一排就属于上面忽略区间下面说的和格式冲突的形式...所以需要加''在外围开启忽略模式,但是实际后面用起来是'func()'的格式.....default的格式也是一样的
InputType是为了验证传入值或者默认值是否符合要求,验证方式可以为是否为某个指定类型,或者后面那一堆利用各种位置的函数验证(比如利用函数进行枚举验证,这东西本身也能拓展就是了),classid验证等等
func是指这个位置的代码段可以直接被eval,然后传入值处理就可以了
contextfunc表示在上下文搜索这个函数,inputfunc则表示在inputdic(对标elm)中搜索这个函数,paentclassid表示是否继承自某个类
default的格式是‘contextvalue( defaultid )’,这两个分别是在当前上下文或者inputdic中搜索defaultid这个值
最后....它当然应该可以处理$()$()这种问题....但是这玩应还是别递归调用了
所以第一步就是
// [ "$(" ] , [ "?" ] , [ ":" ] , [ ")" ]
var Index = [ [] , [] , [] , [] ];
var Counter = 0;
然后把每一组老老实实的for出来..........
把每一组坐标都拿到了,也就拿到了它中间的字符,然后就开始一堆判定了
首先是默认值,如果在Inputdic中查不到inputID这个值的话,那么用default尝试获取一个值,如果还不行就炸掉,这样获取出一个结果,之后再验证一下值就可以了
当然......说得容易,但是实际写出来属于穷举,需要注意的是所有的获取基本都是try,因为实在不一定啥时候获取就崩了
在default和inputtype的解析时,需要InputType = InputType.substring( 1 , InputType.length - 2 );把外围的''切掉,对于func的情况下,切掉''直接就是var Temp = function xx(){}; return Temp;的这种形式了,直接exec出来就完事了,但是千万要注意这可是个exec...........eval就直接爆了
手动文件路径,上下文记录
// 当前所使用的上下文
globalContext = global;
// 当前读取文件的所在路径.
var globalPath = [ global.System.exePath ];
当然这个东西依赖于我上面提到过的路径处理了.....还有isFile和isXP3两个封装函数用于判定文件是否存在和是否存在XP3返回相应路径
其他的就是自己写一组eval,exec,evalScripts,execScripts,loadScripts([].load)了,这其中需要封装例如文件检测,上下文缓存并且切换公共上下文的值,路径同理,以try形式读取文件或代码段,复位。
没错,就是高级版的KAGLoadScript.....但是这样可以直接在这阶段决定File和Parse是否报错还是返回错误标记,也就是返回-1和-2进行后续处理,也就是
function geval( String , Context = global , Error = true )
function gexec( String , Context = global , Error = true )
function gexecScripts( Path , Mode = "" , Context = global , FileError = false , ParseError = true )
function gevalScripts( Path , Mode = "" , Context = global , FileError = false , ParseError = true )
function gloadScripts( Path , FileError = false )
另外比较推荐封装一下数组和字典的深度复制操作.....虽然自写带keys和values的dic这种想法还是算了吧,试过,但是效率低的头疼,只能特殊需要例如存档用或者C*上想想办法
关于图片操作的记录还原问题,如果我没记错的话kag那个是没法还原特殊效果的,防不了拆包还不能刻意制作错位的资源重组么
这个完整的东西比较麻烦,涉及到的比较多...但是总体也就那么几个东西
ImageManager图片及处理用图层缓存管理器,ImageIOObject接口,ImageFunction自定义特效组,封装好的BaseLayer及Layer这种写好了基本指令的layer
这里的基本指令到底有多少东西我就不说了,这里限定为图像操作指令本身,也不管高级的编组或者粒子运用之类的,那个是后续再集成的组动作了
这个接口里主要就是指令操作的记录表(一个函数名表,一个值记录表,你要想拆字符串我没意见),存储函数,值复位(环境状态复位)函数,显示复位函数
ImageFunction负责处理所有的特效动作,并通过组协调将动作记录至动作表当中,而这期间的操作则是在ImageManager当中的图片缓存(基础图片不**作),在TempLayer组当中变换,并处理出最终效果交还Layer。
而ImageFunction在调用的时候可以选择该条指令是否记录,例如伽马值调整这种就没什么记录的必要了
还原时最主要的还原是ImageManager的状态还原,它需要对所有的基本图片进行还原,之后对BaseLayer之类的东西展开还原,这时候必须要保证其基础资源存在,因此这玩应也是存在一个关联表的,如果某个东西不存在的话,可以在一定逻辑下优先那个项先进行还原,也就是优先级问题,但是不耦合的话一般也用不太到就是了......
耦合的话在接口上加个优先级扫一遍就完事了,这里最重要的主要是区分组与单独的层还原是不一样的,但是也有整个层级(树形layer单例)的还原形式,这个东西的还原方式可以自行调整,看怎么做了...当然最简单的办法就是在加入ImageManager的时候改一下注册层级,因为是从下往上还原,也就是以Image,childrenlayer,mainlayer来还原的,当然写出来就是01234这样的了,以免编组出来就层级爆炸了,这个属性怎么变更就不提了...
当然,基础资源不是不能进行变更的,比如把某一块切出来一通操作才是正常素材也是可以的...只不过这个一般就是类似.a或者.asd文件那种形式实现而不是指令缓存了
虽然实际上没啥大用就是了23333