krkr进阶教程2

 

mainwindow.tjs……当然不可能一下子讲完的……

该教程为水螅制作,未经允许,请勿转载

 

打开文件后先说下他的版权声明

//;# MainWindow.tjs - KAG メインウィンドウ
//;# Copyright (C)2001-2006, W.Dee and contributors 改変?配布は自由です

基本上system里每个文件前边都有这样的版权声明的,这些文件也都有各种不同的版本,如果发现了新版本的某个模块大部分情况下其实也可以直接替换掉旧版本来用,比如我常常用新版的editlayer.tjs替换掉kagexpress里的旧版,只要替换掉文件就行了,也不需要多写什么。当然还是有小部分情况模块里使用了某些在别处定义的class或者变量之类的没有办法直接进行替换的……

var onModeChange;

var currentDialog;
var conductorStatus;

定义了几个全局变量,具体用途在以后用到了再说……

下边就是KAGWindow的class,从14行一直到7786行就是这个巨大的class,class结束后那些正则表达式不是tjs了而是perl……我对正则表达式没概念看起来大概是把mainwindow里var的变量全部放在list_store和list_restore里然后print了下……||||||||||

总之是去看KAGwindow的class,因为有7000多行我就不一一贴出来讲解了……就把我认为比较需要知道的东西说下……||||||||

开头那一串var设定了class的各种项,每个后边都有注释说明他是干啥的……一般来说,对于窗口的各种系统设定比如文字auto、skip、窗口大小、窗口位置、音量、文字速度之类的想要在游戏中改变都可以在这些var里找那个对应的参数,然后直接改掉它,使用方法就是kag.参数名=xxxx;但是也有些功能不是只改参数就行的,可能还是要执行下某个function进行一系列操作才行,这种时候也可以将找到的对应参数作为关键词在那七千多行里寻找那个需要的function,然后在游戏里调用,方法就是kag.function名字(参数),这是tjs基础语法,就算我不说应该大家也都知道的……

var完了往下是各种function,这些function在不被调用的时候是不执行的,所以可以在需要某个功能的时候再去检索它然后看它的运行机制,平时没事也用不着一行一行的看下去……(当然也可能有些人就喜欢看全文……)

没有人调用它在游戏运行时就会执行的的是KAGWindow这个function,作为class里的构造函数,在kag这个实体被new的时候就会被执行

 

 

 

然后……然后里边就是各种赋值||||||||||(我发现原本受众是看不懂这东西的人,我应该更详细的说明下……但是太多了突然不想解释了怎么办……)

不过稍微说下这一句,kr的一窗口只能创建一个基础层,其他层都是那个层的子层,kag的基础层就是这个

fore.base = new BaseLayer(this, null, "表-背景");

fore.base,就是我们平时kag里写作layer=base page=fore的那个。

之所以说下这个是因为父层和子层是有点限制的,比如子层绝对不会低于父层,就是只有子层盖住父层没有父层盖住子层,子层多出父层区域外的部分就会不显示,移动父层子层会跟着移动等等,明白了这个,就可以明白很多kag里图层们的现象……

fore.messages = [];
   back.messages = [];
   fore.layers = [];
   back.layers = [];

这一组建立的数组,就是fore和back的messagelayer和layer们,也就是kag里用到的那些message和layer们,在tjs里要调用它们就是用这个名字,比如kag.fore.messages[3]这样。

后边还有stage层的建立,event层的建立,select层的建立之类,select层其实平时貌似很少有人用呢||||||||||||就像messagelayer的facelayer和namelayer子层一样,虽然有这个功能但是老实说不是很好用……

另外不会自己建立新层的同学也可以参照一下这里建层的格式,其实就是先new出来一个层类,然后设定visible,大小,位置,需要的话再loadimages一下。

再往下是bgm、se、movie的buf建立,bgm只有一个实体,就是说只能同时播放一首曲子,se根据之前载入的config.tjs里边numSEBuffers的值来建立实体,movie也是。

下边又是各种设定一直到if(ismain) saveSystemVariables();结束了这个funtion,开始运行游戏时执行的就是这些。

里边除了var之外还调用了各种function,这些function基本上都是在mainwindow这个文件里边定义的,想要知道具体内容的话以function名字为关键词在mainwindow里查找就能看到了,比如 saveSystemVariables()的function就是这样写的

function saveSystemVariables()
{
   // システム変数の保存
   if(!isMain) return;

   // プラグインを呼ぶ
   forEachEventHook('onSaveSystemVariables',
    function(handler, f) { handler(); } incontextof this);

   // フルスクリーン
   scflags.fullScreen = fullScreened;

   // 文字表示速度
   scflags.autoModePageWait = autoModePageWait;
   scflags.autoModeLineWait = autoModeLineWait;
   scflags.userChSpeed = userChSpeed;
   scflags.userCh2ndSpeed = userCh2ndSpeed;
   scflags.chDefaultAntialiased = chDefaultAntialiased;
   scflags.chDefaultFace = chDefaultFace;
   scflags.chNonStopToPageBreak = chNonStopToPageBreak;
   scflags.ch2ndNonStopToPageBreak = ch2ndNonStopToPageBreak;

   // ブックマーク名
   scflags.bookMarkNames = bookMarkNames; // (コピーではなくて)参照で十分
        scflags.bookMarkStorages = bookMarkStorages;
        scflags.bookMarkDates = bookMarkDates;
   scflags.bookMarkProtectedStates = bookMarkProtectedStates;

   scflags.lastSaveDataNameGlobal = lastSaveDataNameGlobal;

        // 全てスキップ
        scflags.allskip = allskip;

        scflags.afterauto = afterauto;
        scflags.afterskip = afterskip;
        
   // ファイルに書き込む
   if(!readOnlyMode)
   {
    var fn = saveDataLocation + "/" + dataName +
     "sc.ksd";
    (Dictionary.saveStruct incontextof scflags)(fn, saveDataMode);

    var fn = saveDataLocation + "/" + dataName +
     "su.ksd";
    (Dictionary.saveStruct incontextof sflags)(fn, saveDataMode);
   }
}

可以看到这个function就是将窗口各种状态保存在了scflags里,然后写入了su和sc两个文件。saveDataMode是在config里边设定的文件写入加密模式。把字典写入txt文件就是这句,(Dictionary.saveStruct incontextof 字典名)(路径, 模式);

其他值得一提的是……关于kag里边的指令在mainwindow里的实现机制,可以直接搜索‘タグハンドラ群(レイヤ操作)’下边那些就是了……

待续待修改……



TOP

访客数: 3128037
aa