猫史档案馆


[干货] SJS框架(v0.2)

用户:芜湖咸鱼芜湖咸鱼查看:7 回复:17 评论:7 创建时间:2020-06-29T16:07:21


好久不见的SJS又回来啦!

这次更新主要是让事件绑定支持多个事件处理

使用方法:

复制下面的代码

"use strict";const box3EventTypes=["PlayerJoin","Press","EntityContact","EntityCreate","EntityDestroy","EntitySeparate","FluidEnter","FluidLeave","VoxelContact","VoxelSeparate","Chat","Click","PlayerLeave","Release","Tick"];let sjs=class{constructor(t=!0,e=!0){this._initAttr(),this._initAttr=null,global.$=this,e&&console.clear(),this.debug=t,t?console.log("[SJS] 此地图开启了调试模式. 如果你正准备发布地图,请务必启用关闭调试模式,否则运行时会降低性能."):console.log("[SJS] 此地图关闭了调试模式. 如果你正在创作地图,请务必启用调试模式,否则就得不到警告,提示和错误.");for(let t of box3EventTypes)world["on"+t](e=>{for(let n of this.eventFunctionList)n.type==t&&n.func(e)})}_initAttr(){this.eventFunctionList=[],this.Admin=class{constructor(adminNameList,functions={chatDebug:!1}){this.adminNameList=adminNameList,functions.chatDebug&&$.on("Chat",({entity:entity,message:message})=>{if(-1!=this.adminNameList.indexOf(entity.player.name)&&"$"==message[0])try{world.say("~> "+eval(message.slice(1)))}catch(t){world.say("[!]"+t)}},"用于chatDebug功能(来自sjs.Admin)")}},this.EventFunction=class{constructor(t,e,n){this.type=t,this.func=e,this.token=n}},this._runtime={warn:t=>{if(!this.debug)return;let e=new Error(t);e.name="[SJS] 警告",console.warn(this._runtime.stackReplace(e.stack)+"\n")},error:(t,e=!1)=>{if(!this.debug)return;let n=new Error(t);n.name="[SJS] "+(e?"致命":"")+"错误";let i=this._runtime.stackReplace(n.stack)+"\n";if(console.error(i),e)throw"程序停止"},log:(t,e)=>{if(this.debug&&(console.log("[SJS]: "+t+"\n"),e)){let e=new Error(t);e.name="位置追溯",console.warn(this._runtime.stackReplace(e.stack)+"\n")}},stackReplace:t=>{t=t.split("\n");for(let e of t)-1==e.indexOf("<anonymous>")&&-1==e.indexOf("<isolated-vm>")||t.splice(t.indexOf(e));return t.join("\n")}}}on(t,e,n){if(-1!=box3EventTypes.indexOf(t)){if("function"==typeof e){var i=this.eventFunctionList.length;return this.eventFunctionList.push(new this.EventFunction(t,e,i)),this._runtime.log(`已注册事件:"${n||"<未指定描述信息>"}"\n类型:${t} 事件令牌:${i}`),this.eventFunctionList.length>=100&&this._runtime.warn("注册的事件过多(>=100个),可能会影响事件操作的性能,请适当合并事件处理函数."),i}this._runtime.error("事件处理函数必须是一个可调用的函数",!0)}else this._runtime.error('注册了不存在或者不支持的事件("'+t+'")',!0)}clearEvent(t){for(let e of this.eventFunctionList)e.token==t&&(this._runtime.log(`已清除事件处理函数:${t}(事件令牌)`),this.eventFunctionList.splice(this.eventFunctionList.indexOf(e)))}};module.exports=sjs;

然后在编辑器中新建一个JS文件 (打开代码编辑器,点击上面的"+")

然后把新建的文件重命名成'sjs' (右键编辑器上方的"script_01.js",然后点击"重命名")

把上面的代码粘贴进去 (可能会卡一会,耐心等待)

 

然后回到主程序(index.js)

输入下面的代码

var sjs = require('./sjs.js');
sjs = new sjs();

这样就导入了SJS,并完成了初始化

 

使用方法:

在使用"new"创建sjs对象的时候,就完成了初始化,并且会在全局注入变量"$"

你只需要使用$即可访问到sjs

 

事件绑定器:

使用sjs.on('事件名称',事件处理函数,描述信息)即可绑定事件

其中,描述信息是可选的

事件名称和默认的一样,只不过少了'on'  (比如world.onPlayerJoin变为$.on('PlayerJoin'))

第二个参数就是一个处理器函数,默认的一致 (比如$.on("PlayerJoin",({entity})=>{}))

第三个参数是描述信息,主要用来在调试时区分

 

特点:

你可以绑定多个事件处理函数,这点和Box3默认的不同

Box3默认的API只允许一个事件存在一个处理器函数,前面的的会被之后的覆盖,而SJS允许绑定多个处理器函数

 

如何取消事件处理器:

有时候你可能需要清除掉某些事件处理器,你可以使用$.clearEvent(事件令牌)

事件令牌即事件处理器的标识,调用$.on时会作为返回值得到

 

实用工具:

Admin (管喵)

使用方法:

在基础的初始化代码后面加上

new sjs.Admin(管喵名称列表,功能选项)

示例:

new sjs.Admin(['shyfcka','昊然'],{
chatDebug:true //打开聊天调试
})

执行之后就可以立即生效

 

 

 

注意事项:

SJS有一些警告,提示和自定义错误,这些只会在调试模式显示,所以在发布时可以通过new sjs(false)来禁用调试模式以此提高性能

 

如果在使用的时候遇到莫名其妙的报错(SJS内部报错,并且没有中文提示)请回帖


回复

上一页1 页 / 共 1下一页
QBZ_QBZ_

你看我抢个沙发emotion_doge

点赞0


评论


影_混乱影_混乱

板凳

点赞0


评论


传闻中的五音璃音传闻中的五音璃音

SJS = 我学校emotion_doge

           (shanghai japanese school)

点赞1


评论


SKQASKQA

设计师 世界上 世界赛

点赞0


评论


datacatdatacat

前排

点赞0


评论


Moira屑玖iMoira屑玖i

我·········

没看懂

/无奈

这是网络只是嘛?

点赞0


评论


七式草莓七式草莓

一堆“喵”,建议发到网盘上

点赞0


评论


DioSand_5006DioSand_5006

终于看懂SJS框架是啥意思了:

Shyfcka研发的JS框架

点赞0


评论


cool-creepercool-creeper

设计师 世界上 随机数 实际上 手机上 

点赞0


评论


Architect_皮卡awaArchitect_皮卡awa

emotion_编程猫_冷漠

点赞0


评论


不知道该叫啥的一只萌新不知道该叫啥的一只萌新

ReferenceError:

at new Admin(sjs.js:1:742)

at eval (index.js:4:1)

点赞0


评论


七式草莓七式草莓

一堆“喵”,建议发到网盘上

点赞0


评论


七式草莓七式草莓

Error: error loading module: sjs.js, module not found

at ScriptResourceSync.loadModule(<isolated-vm>:13529:19

at require(<isolated-vm>:13586:25)

at eval(index.js:3:11)

点赞0


评论


1101110001000111011100010001

额......没看懂,岛三图形化才好用(对了,网址是什么我忘了,有人告诉我吗)

点赞1


评论


凉飘飘fly凉飘飘fly

瞬间憨批

点赞0


评论


反正是个球反正是个球

喵,大佬

点赞0


评论


反正是个球反正是个球

这个针对box3吗

点赞0


评论