脚本系统
# 脚本系统简介
脚本系统为LP编辑器的一个额外的组成部分,主要面向高级的开发者
,提供一些方便的接口,使得能够实现更加复杂的功能。尽管LP编辑器提供了脚本功能,但是普通的编辑方式仍然是最推荐的方式。
具体来说你可以对控件
和事件
添加脚本,脚本分为4种。
- 前置需求脚本(属性只读)
- 需求脚本
- 触发前脚本
- 触发后脚本
# 调试
你可以直接运行并调试你的代码(相当于在游戏中执行一次代码),在右侧可以看到日志。
另外打开预览测试服的开关还可以看到实时效果。
# 前置需求脚本
前置需求脚本为控件和事件触发的前置条件,与普通编辑中的需求属性
概念相同。该脚本在控件和事件的最前面执行,如果脚本返回false
,则控件和事件不会被触发。如果是控件
,还会影响控件的显示。
注意
不推荐设置前置需求脚本,因为前置需求脚本的运行环境与其他三个不同,因此只能做属性的只读操作。且缺少很多接口。
# 需求脚本
与前置需求脚本
类似,但是不影响控件的显示。只在控件和事件触发前,做一层判断,如果返回了一个非空值
,则不会触发控件和事件。类似事件中的触发需求属性
。如果是控件,则会在顶部弹窗显示返回的内容。类似需求不足时的橙色弹窗
# 触发前脚本、触发后脚本
当控件或事件成功通过所有判断后,最先执行的为触发前脚本。具体顺序为
触发前脚本 ---> LP编辑器中的消耗属性 ---> 触发后脚本 ---> LP编辑器中的获得属性
# 基础教程
LP编辑器制作的游戏,运行环境为浏览器,因此脚本系统采用JavaScript语言
。关于JavaScript语言的教程,可以参考MDN。
这里暂时不做过多的介绍,具体可以看后面出的视频教程(还没出)
LP编辑器中的所有脚本,最后都会被封装为一个函数,并且提供一些固定的参数。这些参数可以在脚本中使用,也可以不使用。
提示
原理:所有脚本都是经过 new Function("参数", script) 后执行。
# player类
palyer对象主要用于写入和读取玩家属性,以及一些全局性控制的操作
可以直接键入 player.
即可看到教程
名称 | 类型 | 简介 |
---|---|---|
getPro | 方法 | 获取玩家属性 |
setPro | 方法 | 设置玩家属性 |
getComPro | 方法 | 获取玩家组合属性 |
getEventEnabled | 方法 | 获取指定事件的开启/关闭状态 |
setEventEnabled | 方法 | 获取指定某事件的开启/关闭状态 |
# getPro
方法,获取玩家的属性。
参数 | 说明 |
---|---|
name | 属性名或属性ID |
返回 | 返回指定属性名字,若参数错误则返回为false。 |
举例
player.getPro("铁矿石") //获得属性【铁矿石】的值
player.getPro("xo3noz") //xo3noz为铁矿石ID,获取【铁矿石】的值
# setPro
方法,设置玩家的属性。
参数 | 说明 |
---|---|
name | 属性名或属性ID |
value | 需要设置的值,必须为数值类型 |
返回 | true 设置成功 false 设置失败 |
举例
player.setPro("铁矿石",1) //设置【铁矿石】属性的值为1
player.setPro("xo3noz",1) //xo3noz为铁矿石ID,设置【铁矿石】属性的值为1
# getComPro
方法,获取玩家的组合属性。
参数 | 说明 |
---|---|
name | 属性名或属性ID |
返回 | 返回指定组合属性值,若参数错误则返回false。 |
举例
player.getComPro("铁矿石上限") //获得【铁矿石上限】组合属性的值
# getEventEnabled
方法,获取指定事件是否启用。
参数 | 说明 |
---|---|
name | 事件名或事件ID(你并不能获得事件ID) |
返回 | ture 指定事件处于开启状态 flase 指定事件处于关闭状态 若参数错误则返回为空 |
举例
player.getEventEnabled("资源获取") //查询【资源获取】事件是否开启
# setEventEnabled
方法,设置指定事件是否启用。
参数 | 说明 |
---|---|
name | 事件名或事件ID(你并不能获得事件ID) |
bool | 布尔值 true 开启事件 flase 关闭 |
返回值 | 无返回 |
举例
player.setEventEnabled("资源获取", true) //【资源获取】事件开启运行
# objects类
objects 用于写入和读取类对象的各种数据
名称 | 类型 | 描述 |
---|---|---|
getObject | 方法 | 获取指定类的所有对象 |
delObject | 方法 | 删除指定类中指定序号的对象 |
newObject | 方法 | 新建指定类的对象 |
getObjectsByFilter | 方法 | 调用筛选器获取的对象列表 |
# getObject
方法,获取指定类的对象列表,可以设定指定属性范围进行筛选。
参数 | 说明 |
---|---|
className | 类名 |
[proName] | 选填,指定筛选的属性名 |
[valueMin] | 选填,指定属性的最小值,默认为0 |
[valueMax] | 选填,指定属性的最大值,默认为0 |
返回 | 对象列表,若类名错误则为空列表 |
对于获取到的对象列表可以使用以下方法来获取或者修改对应属性
方法 | 参数 | 说明 |
---|---|---|
getPro | name | 获取对应对象指定属性的值 name:属性名或属性ID 返回:指定属性的值 |
setPro | name,value | 设置对应对象指定属性的值 name:属性名或属性ID value:需要设置的值,必须为数值类型 返回:true 设置成功;false 设置失败 |
delPro | name | 删除某个对象的属性,使得它不再拥有这个属性,而他所有事件、公式等将使用玩家属性。(仅对过期属性生效) 参数1:属性名字或者属性ID 返回:ture 删除成功;flase 删除失败 |
getComPro | name | 获取对象组合属性,在对象中引用计算过程种若有对象的属性,则会强制带入对象属性 |
getName | - | 获得对应对象的名称 返回:对应对象名称 |
setName | name | 设置对应对象的名称 name:设置对应对象的名称 返回:无返回 |
getDes | - | 获得对应对象的描述 返回:对应对象描述 |
setDes | description | 设置对应对象的描述 Description:设置对应对象的描述 返回:无返回 |
getID | - | 获得对应对象的ID(目前这个属性只有脚本能获取,唯一,无法修改且不可删除) 返回:内置对象的ID |
举例
objects.getObjects("怪物对象") //获得怪物对象列表,如果怪物列表不存在后续方法将全部报错
objects.getObjects("怪物对象")[0].getPro("最大生命") //获得第一个怪物对象的最大生命
objects.getObjects("怪物对象")[0].setPro("最大生命", 10) //设置第一个怪物对象的最大生命为10
objects.getObjects("怪物对象")[0].delPro("最大生命") //删除第一个怪物对象的最大生命属性
let x = objects.getObjects("怪物对象")[0].getName //获取第一个怪物对象的名称并赋值给X
objects.getObjects("怪物对象")[0].setName("小鸡") //设置第一个怪物对象的名称为小鸡
let x = objects.getObjects("怪物对象")[0].getDes //获取第一个怪物对象的描述并赋值给X
objects.getObjects("怪物对象")[0].setDes("这是一只小鸡") //设置第一个怪物对象的描述为这是一只小鸡
let x = objects.getObjects("怪物对象")[0].getDes //获取第一个怪物对象的ID并赋值给X
# delObject
方法,删除指定类中指定序列的对象
参数 | 说明 |
---|---|
name | 要删除的类名 |
index | 类名的序列,从0开始为第一位 |
举例
objects.delObject("怪物对象",0) //删除怪物对象第1位的对象
# newObject
方法,新建指定类的对象
参数 | 说明 |
---|---|
classname | 所属类名 |
name | 对象名称 |
des | 对象介绍 |
返回 | 新建对象 目前成功与失败都会返回一个列表,需要注意下 |
举例
objects.newObject("怪物对象","小鸡","这是一只小鸡") //创建一个名为小鸡的怪物对象
# getObjectsByFilter
方法,调用筛选器获取对象列表
参数 | 说明 |
---|---|
filterName | 筛选器名称或ID |
objId | 对象ID,可通过tools.kwargs.objID传入当前对应对象 |
返回 | 对象列表,失败返回false |
举例
objects.getObjectsByFilter("筛选命中的怪物") //筛选出筛选器【筛选命中的怪物】种所有的怪物对象
# tools类
tools 用于调用各种工具函数
名称 | 类型 | 描述 |
---|---|---|
setItemStyle | 方法 | 设置控件样式 |
getItemStyle | 方法 | 获取控件样式 |
setDefaultItemStyle | 方法 | 设置回默认的样式设置 |
setGlobalStyle | 方法 | 设置主页面组件式 |
getGlobalStyle | 方法 | 获取主页面组件样式 |
setDefaultGlobalStyle | 方法 | 设置组件全局样式回默认的样式设置 |
savePlayerDataToCloud | 方法 | 保存数据到云端 |
playAudio | 方法 | 播放音频 |
getLocalData | 方法 | 异步获取本地缓存数据 |
setLocalData | 方法 | 异步设置本地缓存数据 |
getTempData | 方法 | 同步获取临时缓存数据(刷新失效) |
setTempData | 方法 | 同步设置临时缓存数据(刷新失效) |
sendHttpRequest | 方法 | 发送Http请求 |
showToast | 方法 | 中间展示提示文本 |
showNotify | 方法 | 顶部展示提示文本 |
showDialog | 方法 | 中间展示弹窗 |
kwargs.objID | 方法 | 额外参数(当前绑定对象ID) |
# setItemStyle
作用:设置某个控件的样式
参数 | 说明 |
---|---|
item | 控件名字或控件ID |
type | 要设置的样式类型 |
style | 具体的样式,可以是字符串也可以是字典 |
[objectid] | (可选):对象ID,用于修改对象控件样式 |
返回 | 无 |
样式类型包括
- cellstyle:最外层框样式(行样式)
- textstyle:文本域样式
- namestyle:控件名字样式
- desstyle:控件介绍样式
- buttonstyle:按钮样式
- buttontextstyle:按钮名字样式
- buttontipsstyle:按钮提示样式
- iconstyle:图标样式
- subitemsstyle:控件容器/框/折叠样式
- progressstyle:进度条框样式
- progresstextstyle:进度条文本样式
- progressinnerstyle:进度条样式
- objectcellstyle:对象列表样式
# getItemStyle
作用:获取某个控件被tools设置的样式
参数 | 说明 |
---|---|
item | 控件名字或控件ID |
type | 要获取的样式类型 |
[objectid] | (可选):对象ID,用于获取对象控件样式 |
返回 | 具体设置的样式 |
# setDefaultItemStyle
作用:设置某个控件的样式为默认
参数 | 说明 |
---|---|
item | 控件名字或控件ID |
type | 要设置的样式类型 |
[objectid] | (可选):对象ID,用于修改对象控件样式 |
返回 | 无 |
# setGlobalStyle
作用:设置某个主页面组件的样式
参数 | 说明 |
---|---|
type | 组件类型 |
style | 具体的样式,字典 |
返回 | 无 |
组件类型包含
- swiperproperty 滚动属性栏
- property 属性栏
- chatmini 迷你聊天窗
- mainpage 主页面
- tabbar 底部链接栏
# getGlobalStyle
作用:获取某个主页面组件被tools设置的样式
参数 | 说明 |
---|---|
type | 组件类型 |
返回 | 具体样式 |
# setDefaultGlobalStyle
作用:设置某个主页面组件的样式为默认
参数 | 说明 |
---|---|
type | 组件类型 |
返回 | 无 |
# savePlayerDataToCloud
作用:弹出云端保存窗口
| 返回 | 无 |
# playAudio
作用:播放音频
参数 | 说明 |
---|---|
url | 音频地址 |
返回 | 无 |
# getLocalData
作用:异步获取本地数据
参数 | 说明 |
---|---|
key | 数据的key |
返回值 | Promise |
举例
// 了解本例子,你需要先了解js中promise的概念,因为存储在浏览器中的数据需要异步获取,所以需要用到promise
// 注意直接调用本函数,是无效的!如
// let a = getLocalData("a");
// console.log(a)
// 上面这段代码不能得到a的值!因为获取是异步的,第一句代码执行完毕后,a还没有值!!
// 因此要用promise,这个函数返回的是promise,只需要在then中获取数据即可
// 本例子中,我们在then中打印了a的值、
tools.getLocalData("a").then((res)=>{
console.log("a的值",res)
// 在这里编写实际的逻辑!
})
# setLocalData
作用:异步设置本地数据
参数 | 说明 |
---|---|
key | 数据的key |
value | 数据的值 |
返回值 | Promise |
# getTempData
作用:获取全局变量
参数 | 说明 |
---|---|
key | 数据的key |
返回值 | 数据的值 |
// 本例子中,我们获取了一个全局变量a的值,并打印了出来,这个是同步的
let a = tools.getTempData("a");
console.log("a的值",a)
与getLocalData的区别是,getLocalData是异步的,而getTempData是同步的。LocalData存储在浏览器中,因此刷新页面,值还存在
TempData存储在内存中,因此刷新页面,值就不存在了,需要通过场景事件
等,重新设置。
# setTempData
作用:设置全局变量
参数 | 说明 |
---|---|
key | 数据的key |
value | 数据的值 |
返回值 | 无 |
# sendHttpRequest
作用:发送http请求
参数 | 说明 |
---|---|
method | 请求方法 |
url | 请求地址 |
data | 请求数据 |
headers | 请求头 |
返回值 | Promise |
method包括
- get
- post
- put
- delete
// 你可以通过这个接口,请求自己的后台获取或设置一些数据,与自己的后台进行交互。
// 本例子中,我们请求了一个后台的json接口,获取了里面的数据,并打印了出来。
// 接口返回promise
tools.sendHttpRequest("get","https://www.fastmock.site/mock/test/json").then((res)=>{
console.log("请求结果",res)
}).catch((err)=>{
console.log("请求失败",err) // 这里处理失败的情况
})
# showToast
作用:在中间展示一个灰色背景的提示文本
参数 | 说明 |
---|---|
msg | 文本内容 |
type | 展示类型('text'(默认) | 'loading' | 'success' | 'fail' | 'html') |
duration | 持续时间,单位ms,默认4000ms |
返回值 | 无 |
# showNotify
作用:在顶部展示一个明显的提示文本
参数 | 说明 |
---|---|
msg | 文本内容 |
background | 背景颜色(如red,green,rgb(44,44,44),#123456) |
color | 文字颜色 |
duration | 持续时间,单位ms,默认4000ms |
返回值 | 无 |
# showDialog
作用:在中间展示一个明显的弹窗
参数 | 说明 |
---|---|
title | 弹窗标题 |
msg | 弹窗内容 |
# kwargs.objID
作用:获取当前绑定的对象ID,仅在对象控件中生效
console.log(tools.kwargs.objID)