支持下 虽然我载入了却不懂用。。。按esc打开日记直接出错了。。 |
ps:这教程很久前就写好了,有人建议应该写的更通熟易懂,但水平有限修改过后也只有这样了 该教程的特点是对mv源码的依赖小,适合有js编程能力但对mv源码研究不深的人 理解这些技术后,就可以不受到mv本身的约束来写窗口和它所要展示的内容 1.首先,将选项添加进主菜单 var _Window_MenuCommand_addMainCommands = Window_MenuCommand.prototype.addMainCommands; Window_MenuCommand.prototype.addMainCommands = function(){ _Window_MenuCommand_addMainCommands.call(this); if (this.needsCommand('diary')) { this.addCommand(tagName, 'diary', 1); } }; 上面这几段代码,用于将你窗口的选项添加进主菜单中,其中tagName为该选项所显示的字符串 'diary'则是一个指令名,该指令名可以自行设置,但一定要是字符串 第三个选项用途不明,但填1并没有问题,所以写你自己的窗口时填1即可 2.然后给你的选项添加功能 var _Scene_Menu_createCommandWindow = Scene_Menu.prototype.createCommandWindow; Scene_Menu.prototype.createCommandWindow = function(){ _Scene_Menu_createCommandWindow.call(this); this._commandWindow.setHandler('diary', diary_command.bind(this)); }; this._commandWindow.setHandler('diary', diary_command.bind(this)); 这段代码中的第一个参数是变量名,第二个参数用于给你添加的选项附加上逻辑功能 bind关键字与call类似,都是改变函数或变量的this指向,但不同的是,call是改变后立即执行,bind则是改变this的指向,但不立即执行 setHandler源码如下: Window_Selectable.prototype.setHandler = function(symbol, method) { this._handlers[symbol] = method; }; 关于上面代码使用call的意义可以参见我以前的帖子 http://tieba.baidu.com/p/4185225 ... p;cid=0#79770073662 3.其他函数介绍 3.1 窗口跳转函数 var diary_command_activate = function(){ SceneManager.goto(Scene_Menu); }; 该函数在退出日记窗口时执行,用于切换回主菜单,根据给goto输入不同的参数,可以跳转到其他菜单 3,2 窗口逻辑函数 var diary_command = function(){ this._commandWindow.deselect(); diary_run(); }; this._commandWindow.deselect();用于冻结主菜单,使其不接受鼠标与键盘操作 diary_run();则包含了你编写的窗口的所有代码 现在关键的几个函数都介绍完毕了,实际上通过这几个函数已经可以开始编写窗口了 现在来介绍我写的插件中的几项关键技术:状态机,资源预载和本地文件读写 先来说说状态机 //状态机参数 var state_photoLoad = 1; var state_initList = 2; var state_windowDraw = 3; var state_drawFont = 4; var state_nextPage = 5; var state_backPage = 6; var state_end = 7; var currentState = state_photoLoad; 首先设置一组状态变量,然后设置一个记录状态变量的变量,该变量记录下一个应该执行的函数的代码 设置一个状态机,然后设置一个计时器,我设置的是每33毫秒查询一次状态 在下述每个函数执行完时,状态变量currentState都会发生相应变化 这就是状态机了,简单而且能更有效的控制代码的执行,相当简单的技术 //计时器 coordinate.time = setInterval(stateMachine, 33); //状态机 var stateMachine = function () { switch (currentState) { case state_photoLoad: photoLoad(); break; case state_initList: initList(); break; case state_windowDraw: windowDraw(); break; case state_drawFont: drawFont(); break; case state_nextPage: nextPage(); break; case state_backPage: backPage(); break; case state_end: game_end(); break; case null: //window.console.log("错误的状态值"); break; } }; 资源预载: 在我的源码是photoLoad和load_done这两个函数在负责这一功能 原理非常简单 var backGround = new Image(); backGround.src = "img/diary/book.png"; backGround.addEventListener("load", load_done, false); coordinate.backGround = backGround; window.console.log("loading"); 在这段代码中,设置好正确的资源路径,然后加上一个监听函数来监听资源是否被载入 如果确认载入,则执行load_done函数来移除监听并计数,资源载入是在代码执行的空隙时进行的,所以photoLoad的末尾有这么一句代码currentState = state_end 用于停止轮询,等待载入 当load_done中的计数等于需要被载入的资源数量时,就表示资源被全部载入,此时再次启动轮询并指定新的状态 载入的资源此时位于内存中,所以会增加内存负担 此技术也是相当简单的 本地文件读写可以去看node.js的file system那一部分,说的比我好,具体实现可以参考我的代码 node存储的文件是一个字符串文件,所以要转换为数组时,需要自己写个转换函数,也可以参考我的源码 |
之前在贴吧看见一个类似的教程,但他没有显示图片什么的,现在居然有完善的了,感谢 |
附上我这坨翔一样的代码,过几天准备再优化一下可读性 JAVASCRIPT 代码复制
|
站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作
GMT+8, 2024-11-28 08:43
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.