基本函数查询表
名词索引
以下你可以按住ctrl键点击下面的词,可以直接定位到想了解的名词:
编程语言 | 编程语言版本 编程语言区分 |
脚本编辑器 | 注释颜色 |
语法 | 禁用符号 对象(Object)数组/容器(Array) 纯数据(Json) 类 |
编程语言(javascript es5)
编程语言版本
现在网络上随便百度都能找到大量 let、const、箭头函数 等代码。
而这些内容都是es6的特性,不能在es5的环境中支持。
为了防止以后百度出现更多es789什么的乱七八糟的新功能混淆,
这里需要说明一下稳定的es5函数写法。
2020/6 ,ES11发布了。我们这ES5已经成了古董,然而新版加的一堆新特性,似乎也都用不上……
编程语言版本飞速迭代是必然趋势。但至少,es5环境可以支持毕竟古老的浏览器,包括xp系统。不管语言如何迭代,稳定的写法与用法都非常重要。所以,尽量先用 本文档 给出的格式,不建议用百度找的不明写法以及各种奇淫技巧。 |
至少在插件中,本文档的用法经过了反复试验,确实有效。
编程语言区分
游戏编辑器固定使用js语言(这里的js以ES5为标准),typescript暂时和js划分在一起,毕竟同源。如果你是从其他语言转到这里,有必要了解一下。
另外,截止2020/6,ruby语言已经快要死透了,现在用matlab语言的人都比用ruby的人多,如果你是从xp、va或vx转来的,赶紧弃了ruby吧。
Javascript/Typescript | C++/C# | Java | Python | Ruby | |
简介 | 一门语言,少了node.js或html5,什么都干不了。 | 一门语言,少了vs编译器,什么都干不了。 | 一门语言,少了虚拟机jvm或dvm,什么都干不了。 | 一门语言,少了python库,什么都干不了。 | 一门语言,少了rmvx,rmva,rmxp什么都干不了……(误) |
缩进 | 随意缩进 | 随意缩进 | 随意缩进 | 严格缩进 | 随意缩进 |
分号 | 可加,可不加 | 必须加 | 必须加 | 可加,可不加 | 可加,可不加 |
花括号 | 函数代码块,var a = {} 定义json | 函数、内部类代码块,int* a = new int[3]{1, 2, 3}; 定义数组 | 函数、内部类代码块,int a[] = new int[]{1, 2, 3}; 定义数组 | 与函数无关(函数用冒号),a = {} 定义 字典 | 与函数无关b = {1 => 2} 定义 散列 |
常量 | js ES5木有常量定义,ts用const a = 0; | #define DRILL 0const int a =0; | public static final int a = 0; | 木有常量定义 | 木有常量定义 |
变量 | var a;写int a会炸。 | int a; float a; double a;bool a; …… | int a; float a; double a;boolean a; …… | a = 1a = "a" | a = 1a = "a" |
注释 | // 单行注释/* 多行注释 */ | // 单行注释/* 多行注释 */ | // 单行注释/* 多行注释 */ | # 单行注释’ ’ ’ 多行注释 ’ ’ ’ | # 单行注释=begin多行注释=end |
if | if( aaa != 1 ){ . . . }else if( aaa == 1 ){ . . . }if( aaa !== 1 ){ . . . }else if( aaa === 1 ) | if( aaa != 1 ){ }else if( aaa == 1 ) | if( aaa != 1 ){ . . . }else if( aaa == 1 ) | if not aaa == 1 :. . .elif aaa == 1 :. . . | if aaa != 1. . .elsif aaa == 1. . . |
for | var a = [1,2,3];for(var i=0; i<a.length; i++) | int len = 3;int* a = new int[len]{1, 2, 3};for( int i=0; i < len ; i++ ) | int a[] = new int[]{1, 2, 3};for(int i=0;i<a.length(); i++) | a = [1,2,3]for i in range(len(a)):. . . | arr = (1..10).to_afor i in arr do. . .end |
布尔 | true和false字母必须小写 | true和false字母必须小写 | true和false字母必须小写 | True和False首字母必须大写 | true和false字母必须小写 |
引号 | 单引号和双引号都表示字符串。 | 单引号’ ’表示字符。双引号””表示字符串。 | 单引号’ ’表示字符。双引号””表示字符串。 | 单引号和双引号都表示字符串。 | 单引号和双引号都表示字符串。 |
类成员 | this.xxxthis["xxx"] | this.xxxthis->xxx | this.xxx | this.xxx | @xxx |
脚本编辑器
注释颜色
根据之前提及的js特性:
- 字符串的单引号和双引号都是字符串。
- js单行注释和多行注释没有区别,只是写法不一样。
根据上述的特性,个人在编辑器里面将上述四中内容染上了不同的显眼颜色。并且用于划分类型。如下。
/* 【rmmv默认注释,全绿】* -----------------------------------------------------------------------------* ----更新日志* [v1.0]* 完成插件ヽ(*。>Д<)o゜*/ |
//=============================================================================// * 插件指令【大分段】//=============================================================================var _drill_EBV_pluginCommand = Game_Interpreter.prototype.pluginCommand;Game_Interpreter.prototype.pluginCommand = function(command, args) {_drill_EBV_pluginCommand.call(this, command, args);if (command === ">事件缓存变量") {/*-----------------自定义区域【中分段】------------------*/if(args.length == 8){var unit = String(args[1]);if( unit == "本事件" ){// > 事件控制【小分段】var e_id = this._eventId;// ...}}}} |
this._drill_ESE = {};this._drill_ESE['redraw_command'] = false; //重画指令this._drill_ESE['shatter_command'] = false; //碎片指令this._drill_ESE['shatter_id'] = -1; //当前碎片样式idthis._drill_ESE['shatter_data'] = {}; //当前碎片样式数据this._drill_ESE['shatter_converted'] = false; //反向弹道 |
区分的理由如下:
1. rmmv注释,全程字符串,没法区分。所以只要和代码颜色不一样就可以了,那么就鲜绿色吧。
”//”注释为白色,”/**/”注释为鲜绿色。
2. 单行和多行注释常用于给不同的代码分段,
图中定义了大分段(//====)、中分段(/*-----*/)、小分段(// > 步骤),因为颜色鲜明,所以很容易注意到注释内容。
3. js的字符串用的非常多,但是大多都是用于['xxxx']指向成员的。所以一般成员用的字符串,使用单引号,且颜色用深绿色,不显眼。另外,成员的英文名并不好理解,而更多的是需要关注中文注释,所以,每个成员都基本用单引号+中文注释。
4. rmmv用到字符串的时候,比较多的是bitmap资源路径、插件指令切割,为了让字符串更加显眼,所以也设置成鲜绿色。
ㄟ(ʅ⊙ω⊙) 其实你不用刻意模仿,按照你的习惯来,这里我只是提及一下我看到的代码是什么样的,因为鲜明的颜色容易引起注意,仅此而已。
比起其他编辑器花里胡哨的颜色,我的编辑器里面是完全没有 蓝色 的。
因为蓝色 = 量子妹 = 游戏界面 = 画画。
代码和画画是两个不同的维度,作为量子妹的系统世界专属之蓝,至少不会让我感到不安。
另外,代码耗血,画画耗魔,魔法肯定是蓝色的,哈哈(*ˉ﹃ˉ) 。
作者的notepad++的颜色设置:1)打开设置 > 语言格式设置2)选择的主题:twilight3)修改global styles:default style: rgb:213,187,984)修改javascript:default: rgb:219,128,66 #DB8042word: rgb:219,128,66 #DB8042symbols: rgb:219,128,66 #DB8042keyword: rgb:213,187,98stringraw: rgb:134,191,96doublestring: rgb:0,255,128comment: rgb:0,255,128commentline: 白色commentdoc: rgb:0,255,128 |
语法
禁用符号
首先,需要说明一下符号的问题。
1)禁用符号 ===
尽量不要使用 ”===” 符号(恒等于)。当你使用其它的语言复刻相同的功能时,这个符号会非常难受(比如js的工具函数,复刻到c++中)。当你使用 ”aaa=== undefined”,而aaa为null值时,这个符号会非常难受。 |
2)禁用符号 !
尽量不要使用 ”!” 符号(非)。改而使用下面的写法:if( enabled == undefined ){ …… }if( enabled == true ){ …… }if( enabled == false ){ …… }尽量少用 感叹号! 来取非值,因为 ! 会将undefined和false作为相同的结果。要注意 undefined和true 为相同意思的逻辑情况。 |
对象(Object)
称呼与定义: 文档或口语中提及的名词 不完全 表示真正的js定义。
比如,js中的任何类型都是对象,但在我们文档口语中,”对象” 指的并不是js底层的对象。
对象(Object): 指贴图、窗口、有图像数据的实体对象。对象的数据量非常大,一般无法使用JSON.stringify( ) 的方法显示所有数据。纯数据(Data): 指字符串、数字等基本类型的数据,包括数组和json数据。data纯数据可以保存进存档。![]() |
对象不能放才存档文件中,只能通过其他方式绕开。
因此,禁止在$gameSystem里面存放obj对象,这会把存档炸了,无法读取。
(存档底层就是 JSON数据 与 js对象 转字符串,部分js对象本身不具备转换并存储的功能,所以出错)
如果你必须要将使得对象能在全局中调用,你可以放入$gameTemp。
称呼与定义 说明: 从用法和格式上而言,由于JSON数据和js对象几乎是一模一样的,所以实际应用中,大家都傻傻分不清楚。如果统一叫 ”js对象” 反而感觉很别扭,因为js中都是对象,指代不明。而如果我说这是一个json串,那么你的脑海里一定会复现json的经典格式,便能理解这个对象的格式是json的格式。因此,为了方便理解,有时会称呼为json格式。![]() |
在drill插件中,并没有对对象的命名做明确划分。
不过,常见的 对象 命名为:temp_sprite、temp_window、event、temp_obj等。
常见的 纯数据 命名为:temp_data、data、this._drill_data。
数组/容器(Array)
在drill插件中,数组命名会习惯性地添加一个后缀”list”或”tank”(表示容器),比如”_drill_SCA_spriteTank”或”_drill_SCA_dataList”用于区分数组与json。
1)定义数组
var aaa_tank = []; |
2)判断是否为数组
如果aaa_tank是字符串,那么length也会存在。
if( aaa_tank.length != undefined ){ }if( Array.isArray( aaa_tank ) ) |
3)判断是否为空数组
if( aaa_tank.length === 0 ) |
4)判断是否为非空数组
if( aaa_tank.length > 0 ) |
5)数组赋值
注意,数组里面只能写数字,不要错写成arr['aaa']字符串了,写成字符串不会报错,但是读到的数据会出问题。如果你加的是一个变量,建议先转一下数字。
aaa_tank[0] = 1;aaa_tank[1] = 2;aaa_tank[Number(bbb)] = 3;aaa_tank.unshift( 4 ); //头部插入aaa_tank.push( 5 ); //尾部插入 |
6)数组for遍历
这里建议所有数组都使用下面的标准格式,一眼就能看明白,不建议数组到处用for in、for of、foreach写法。
for( var j = 0; j < $gameSystem._drill_BBa_changingTank.length; j++ ){var temp = $gameSystem._drill_BBa_changingTank[j];//...} |
7)数组for退数组
通常 整体销毁spriteTank 或 根据条件删除sprite 时经常用,注意数组必须是递减遍历。
for( var i = this._drill_ERA_animTank.length-1; i>=0; i--){var sprite = this._drill_ERA_animTank[i];this._drill_map_ui_board.removeChild(sprite);this._drill_ERA_animTank.splice(i,1); //递减遍历去除时,不会影响数组下标} |
8)数组拼接数组
area_tank = area_tank.concat( aaa_tank ); |
9)数组map、foreach用法
ES5是支持map和foreach的,但是要注意后面要跟个 ”, this);” 回调函数。这种写法单独存在还行,而如果出现了反复嵌套,建议直接分新函数来写。
var aaa_tank = ccc_tank.map(function(value,index,array){return String(value).toUpperCase();}, this ); |
纯数据(Json)
在drill插件中,json命名一般会统称data,然后data下列出各种子成员。
如果变量没有”data”名字,一般可能是obj对象。
1)定义json
var data = {}; |
2)json赋值
注意,json最好里面只能写字符串,不要错写成data[0]了,写成数字也不会报错,但是后期读代码会很麻烦。另外,成员尽量用单引号,不要用双引号。如果你加的是一个变量,建议先转一下成字符串。
data['cancel'] = 1;data['ok'] = 2;data[String(aaa)] = 3; |
3)json获取全部键
获取json的全部键:(keys是一个数组)
var key_list = Object.keys( data ); |
4)json遍历
建议用转数组的写法,然后进行数组遍历。
只能json遍历时,才用for in 写法。
for(var key in this._drill_AnimExData_data ){var temp = this._drill_AnimExData_data[key];}// 或者var keys = Object.keys(this._drill_AnimExData_data);for(var i = 0; i<keys.length; i++){var temp = this._drill_AnimExData_data[keys[i]];} |
类
1)定义类(单独)
//==============================// * 时间条物体 - 定义//==============================function Drill_GOBTB_GameTimeBar() {this.initialize.apply(this, arguments);}; |
2)定义类(继承)
贴图继承有initialize和update两个基本函数,继承写法如下。
//==============================// * 时间条贴图 - 定义//==============================function Drill_GOBTB_TimeBarSprite() {this.initialize.apply(this, arguments);};Drill_GOBTB_TimeBarSprite.prototype = Object.create(Sprite_Base.prototype);Drill_GOBTB_TimeBarSprite.prototype.constructor = Drill_GOBTB_TimeBarSprite;//==============================// * 初始化//==============================Drill_GOBTB_TimeBarSprite.prototype.initialize = function() {Sprite_Base.prototype.initialize.call(this);// . . .};//==============================// * 帧刷新//==============================Drill_GOBTB_TimeBarSprite.prototype.update = function() {Sprite_Base.prototype.update.call(this);// . . .}; |
3)判断基本类型
通过typeof。注意 等于与恒等于,常用 等于”==”。
if( typeof(_drill_newEvent_event) == "undefined"){ }if( typeof(_drill_newEvent_event) === undefined ) |
4)判断当前类的名称
if( this.constructor.name == "Scene_Battle" ) |
5)判断继承的子类
if( this instanceof Drill_Sprite_LRR ) |