api.md
This commit is contained in:
parent
a688bdb868
commit
ffda8bdf97
911
_docs/api.md
911
_docs/api.md
@ -16,13 +16,236 @@
|
||||
|
||||
### Console:命令行
|
||||
|
||||
Console页为命令行。可以在这里输入一些命令进行调试。
|
||||
|
||||
比如,进入游戏后,输入`core.status.hero.atk`即可获得勇士的当前攻击力数值。`core.status.hero.atk=100`可以设置攻击力为100。
|
||||
|
||||
更多的API可参见[附录:API列表](#附录:API列表)。
|
||||
|
||||
除此以外,游戏中的报错等信息也是可以在Console中进行查看的。
|
||||
|
||||

|
||||
|
||||
### Sources:断点调试
|
||||
|
||||
Sources页可以查看JS源代码,并进行断点调试等。
|
||||
|
||||
例如,如果相对脚本编辑中的伤害计算函数进行断点调试:
|
||||
1. 在左边找到`project/functions.js`,单击打开文件
|
||||
2. 并找到对应的行(可以Ctrl+F搜索),比如搜索`getDamageInfo`
|
||||
3. 在行号上点一下打断点,会出现一个蓝色标签
|
||||
|
||||
之后,当代码运行到你的断点处时,将自动停止运行。
|
||||
|
||||

|
||||
|
||||
可以将鼠标移动到变量上,将弹窗形式显示这个变量的各项数值,从而查看变量值是否符合预期。
|
||||
|
||||
图中红色框内有几个按钮,从左到右分别是:**继续执行**,**执行到下一行**,**进入当前函数**,**跳出当前函数**,**单步执行**。
|
||||
|
||||
通过这几个按钮,可以一行一行的对代码进行执行,执行过程中能不断查看各个变量的数值变化,从而定位问题所在。
|
||||
|
||||
红圈下方是Call Stack,即当前的函数调用链(从哪些地方调用过来的)。
|
||||
|
||||
Sources还有更多有趣的功能,在此不做介绍,有兴趣的可自行网上搜索了解。
|
||||
|
||||
### Elements:网页元素查看
|
||||
|
||||
Elements页可以查看网页的源代码,调整css布局等。
|
||||
|
||||

|
||||
|
||||
不过对魔塔样板来说,最重要的是红圈中的按钮。点击此按钮可以进入**手机模式**。
|
||||
|
||||
手机模式下,左边可以对屏幕分辨率进行调整和模拟。
|
||||
|
||||
这可以很有效的帮我们进行测试样板在手机端的表现。
|
||||
|
||||
## 整体项目架构
|
||||
|
||||
## 函数的转发,复写函数
|
||||
``` bash
|
||||
├── /_server/ # 为可视化地图编辑器提供一些支持的目录
|
||||
├── /libs/ # ---- 系统库目录 ----
|
||||
│ ├─ /thirdparty/ # 游戏所用到的第三方库文件
|
||||
│ ├─ actions.js # 用户交互处理
|
||||
│ ├─ core.js # 系统核心文件(游戏入口,接口&转发)
|
||||
│ ├─ control.js # 游戏逻辑控制
|
||||
│ ├─ data.js # 全塔属性等
|
||||
│ ├─ enemys.js # 怪物相关处理
|
||||
│ ├─ events.js # 各个事件的执行
|
||||
│ ├─ icons.js # 图标和素材
|
||||
│ ├─ items.js # 道具效果
|
||||
│ ├─ loader.js # 各个资源加载
|
||||
│ ├─ maps.js # 地图数据和绘制
|
||||
│ ├─ ui.js # UI窗口绘制
|
||||
│ └─ utils.js # 工具类函数
|
||||
├── /project/ # ---- 项目目录 ----
|
||||
│ ├─ /animates/ # 动画目录
|
||||
│ ├─ /floors/ # 楼层文件
|
||||
│ ├─ /images/ # 图片素材
|
||||
│ ├─ /sounds/ # bgm和音效
|
||||
│ ├─ data.js # 全塔属性
|
||||
│ ├─ enemys.js # 怪物属性
|
||||
│ ├─ events.js # 公共事件
|
||||
│ ├─ functions.js # 脚本编辑
|
||||
│ ├─ icons.js # 素材和ID的对应关系定义
|
||||
│ ├─ items.js # 道具的定义和效果
|
||||
│ ├─ maps.js # 地图和数字的对应关系
|
||||
│ └─ plugins.js # 自定义插件
|
||||
├── /常用工具/ # 辅助造塔的小工具
|
||||
├── editor.html # 地图编辑器
|
||||
├── editor-mobile.html # 手机版的地图编辑器
|
||||
├── index.html # 主程序,游戏的入口
|
||||
├── main.js # JS程序的入口,将动态对所需JS进行加载
|
||||
├── style.css # 游戏所需要用到的样式表
|
||||
└── 启动服务.exe # 一个本地的HTTP服务器,通过它来运行游戏
|
||||
```
|
||||
|
||||
`_server`为****,里面存放了地图编辑器相关的各项内容。
|
||||
|
||||
`libs`为**系统库目录**,里面存放了各个系统核心函数。
|
||||
|
||||
从V2.6开始,请勿直接修改libs下的代码,如有需要修改系统库函数请尝试在插件中[复写函数](#复写函数)
|
||||
|
||||
`project`为**项目目录**,你所造的塔的数据全部存放在project下。在不同样板之间接档也是直接迁移project目录即可。
|
||||
|
||||
## 函数的转发
|
||||
|
||||
在本样板中,`core.js`里面基本是没有定义什么函数的,所有的游戏内函数都在其他几个文件中实现。
|
||||
|
||||
例如,常见的获得某个变量值`getFlag`是定义在`control.js`中的:
|
||||
|
||||
```js
|
||||
////// 获得某个自定义变量或flag //////
|
||||
control.prototype.getFlag = function(name, defaultValue) {
|
||||
if (!core.status.hero) return defaultValue;
|
||||
var value = core.status.hero.flags[name];
|
||||
return value != null ? value : defaultValue;
|
||||
}
|
||||
```
|
||||
|
||||
也就是,我们可以通过`core.control.getFlag(name, value)`来调用此函数。
|
||||
|
||||
但是这样会十分不便,我们希望能直接调用`core.getFlag(name, value)`,而不需要中间的control。
|
||||
|
||||
为了达到这个目的,样板设置了**函数转发**,即**将其他文件中定义的函数,转发到core中执行**。
|
||||
|
||||
上述`getFlag`代码的转发实际上是增加了如下函数:
|
||||
|
||||
```js
|
||||
////// getFlag函数的转发 //////
|
||||
core.getFlag = function (name, defaultValue) {
|
||||
return core.control.getFlag(name, defaultValue);
|
||||
}
|
||||
// 转发后,即可通过 core.getFlag() 来实际调用 core.control.getFlag()
|
||||
```
|
||||
|
||||
转发是自动完成的,其满足如下两条规则:
|
||||
- **在libs中其他文件定义的函数,如果不以下划线`_`开头,就会进行转发。**
|
||||
- **如果core中已经存在同名函数,则会在控制台中打出一条报错信息,并不转发该函数。**
|
||||
|
||||
具体函数的转发实现代码可参见`core.js`的`_forwardFunc`函数。
|
||||
|
||||
!> 除此以外,插件中以`this.xxx`来定义的函数也会被转发!
|
||||
|
||||
例如,你可以直接调用`core.drawLight()`来实际调用插件中的`core.plugin.drawLight`。
|
||||
|
||||
## 复写函数
|
||||
|
||||
样板的功能毕竟是写死的,有时候我们也需要修改样板的一些行为。
|
||||
|
||||
在V2.6以前,需要直接打开libs目录下的对应文件并进行修改。但是开libs下的文件就会出现各种问题:
|
||||
- 不容易随着新样板来接档迁移
|
||||
- 也不好找到自己改过什么,从而能整理成新的插件在别的塔使用
|
||||
- ……
|
||||
|
||||
好消息的是,从V2.6开始,我们再也不需要开文件了,而是可以直接在插件中对原始函数进行复写。
|
||||
|
||||
如果我想对xxx文件中的yyy函数进行重写,其模式一般是:`core.xxx.yyy = function (参数列表) { ... }`
|
||||
|
||||
下面是几个例子,从简单到复杂。
|
||||
|
||||
### 重写怪物手册的背景图绘制,使用winskin而不是默认的黑色
|
||||
|
||||
```js
|
||||
// 重写ui.js中的_drawBook_drawBackground函数
|
||||
core.ui._drawBook_drawBackground = function () {
|
||||
// 调用core.drawBackground函数来绘制winskin
|
||||
// core.__PIXEL__为定义的一个宏,对于13x13的值是416,对于15x15的值是480
|
||||
core.drawBackground(0, 0, core.__PIXEL__, core.__PIXEL__);
|
||||
}
|
||||
```
|
||||
|
||||
### 重写点击楼传事件
|
||||
|
||||
```js
|
||||
// 重写点击楼传事件
|
||||
core.events.useFly = function (fromUserAction) {
|
||||
if (core.isMoving()) {
|
||||
core.drawTip("请先停止勇士行动");
|
||||
return;
|
||||
}
|
||||
if (core.status.lockControl || core.status.event.id != null) return;
|
||||
|
||||
if (core.canUseItem('fly')) core.useItem('fly');
|
||||
else core.drawTip("当前无法使用"+core.material.items.fly.name);
|
||||
}
|
||||
```
|
||||
|
||||
### 楼层切换时根据flag来播放不同的音效
|
||||
|
||||
```js
|
||||
// 重写events.js中的_changeFloor_beforeChange,修改音效值
|
||||
core.events._changeFloor_beforeChange = function (info, callback) {
|
||||
// 直接替换原始函数中的 core.playSound('floor.mp3');
|
||||
if (core.getFlag("floorSound") == 0) core.playSound('floor0.mp3');
|
||||
if (core.getFlag("floorSound") == 1) core.playSound('floor1.mp3');
|
||||
if (core.getFlag("floorSound") == 2) core.playSound('floor2.mp3');
|
||||
// ...
|
||||
|
||||
// 下面是原始函数中的代码
|
||||
window.setTimeout(function () {
|
||||
if (info.time == 0)
|
||||
core.events._changeFloor_changing(info, callback);
|
||||
else
|
||||
core.show(core.dom.floorMsgGroup, info.time / 2, function () {
|
||||
core.events._changeFloor_changing(info, callback);
|
||||
});
|
||||
}, 25)
|
||||
}
|
||||
```
|
||||
|
||||
### 每次打开全局商店时播放一个音效
|
||||
|
||||
打开全局商店是在`events.js`中的`openShop`函数,因此需要对其进行重写。
|
||||
|
||||
然而,我们只需要在这个函数执行之前插一句音效播放,所以并不需要重写整个函数,而是直接插入一行就行。
|
||||
|
||||
```js
|
||||
var openShop = core.events.openShop; // 先把原始函数用一个变量记录下来
|
||||
core.events.openShop = function (shopId, needVisited) {
|
||||
core.playSound("shop.mp3"); // 播放一个音效
|
||||
return openShop(shopId, needVisited); // 直接调用原始函数
|
||||
}
|
||||
```
|
||||
|
||||
### 每次绘制地图前在控制台打出一条信息
|
||||
|
||||
绘制地图在`maps.js`的`drawMap`函数,因此需要对其进行重写。
|
||||
|
||||
由于只需要额外在函数执行前增加一句控制台输出,所以直接插入一行即可。
|
||||
|
||||
但是需要注意的是,`drawMap`中使用了`this._drawMap_drawAll()`,因此使用函数时需要用`call`或者`apply`来告知this是什么。
|
||||
|
||||
```js
|
||||
var drawMap = core.maps.drawMap; // 先把原始函数用一个变量记录下来
|
||||
core.maps.drawMap = function (floorId, callback) {
|
||||
console.log("drawMap..."); // 控制台打出一条信息
|
||||
drawMap.call(core.maps, floorId, callback); // 需要使用`call`来告知this是core.maps
|
||||
}
|
||||
```
|
||||
|
||||
详见[`call`或`apply`的用法](https://www.jianshu.com/p/80ea0d1c04f8)。
|
||||
|
||||
## 附录:API列表
|
||||
|
||||
@ -47,689 +270,3 @@
|
||||
### ui.js
|
||||
|
||||
### utils.js
|
||||
|
||||
**这里只列出所有可能会被造塔者用到的常用API,更多的有关内容请在代码内进行查询。**
|
||||
|
||||
如有任何疑问,请联系小艾寻求帮助。
|
||||
|
||||
可以在chrome浏览器的控制台中(`ctrl+shift+I`,找到Console)中直接进行调用,以查看效果。
|
||||
|
||||
**以下所有异步API都会加上[异步]的说明,存在此说明的请勿在事件处理的自定义脚本中使用。**
|
||||
|
||||
!> 最常用的新手向命令,强烈建议每个人了解
|
||||
|
||||
``` text
|
||||
|
||||
core.status.floorId
|
||||
获得当前层的floorId。
|
||||
|
||||
|
||||
core.status.maps
|
||||
获得所有楼层的地图信息。
|
||||
|
||||
|
||||
core.status.thisMap
|
||||
获得当前楼层信息,其等价于core.status.maps[core.status.floorId]。
|
||||
|
||||
|
||||
core.floors
|
||||
获得所有楼层的信息。例如core.floors[core.status.floorId].events可获得本楼层的所有自定义事件。
|
||||
|
||||
|
||||
core.status.hero
|
||||
获得当前勇士状态信息。例如core.status.hero.atk就是当前勇士的攻击力数值。
|
||||
|
||||
|
||||
core.material.enemys
|
||||
获得所有怪物信息。例如core.material.enemys.greenSlime就是获得绿色史莱姆的属性数据。
|
||||
|
||||
|
||||
core.material.items
|
||||
获得所有道具的信息。
|
||||
|
||||
|
||||
core.debug()
|
||||
开启调试模式。此模式下可以按Ctrl键进行穿墙,并忽略一切事件。
|
||||
此模式下不可回放录像和上传成绩。
|
||||
|
||||
|
||||
core.updateStatusBar()
|
||||
立刻刷新状态栏和地图显伤。
|
||||
|
||||
|
||||
core.setStatus('atk', 1000)
|
||||
将攻击力设置为1000;这里把atk可以改成hp, def, mdef, money, experience等等。
|
||||
本句等价于 core.status.hero.atk = 1000
|
||||
|
||||
|
||||
core.getStatus('atk')
|
||||
返回当前攻击力数值。本句等价于 core.status.hero.atk。
|
||||
|
||||
|
||||
core.setHeroLoc('x', 5)
|
||||
设置勇士位置。这句话的意思是将勇士当前位置的横坐标设置为5。
|
||||
同理可以设置勇士纵坐标 core.setHeroLoc('y', 3)。
|
||||
值得注意的是,这句话虽然会使勇士改变位置,但并不会使界面重新绘制;如需立刻重新绘制地图还需调用:
|
||||
core.clearMap('hero'); core.drawHero();
|
||||
来对界面进行更新。
|
||||
|
||||
|
||||
core.setItem('pickaxe', 10)
|
||||
将破墙镐个数设置为10个。这里可以写任何道具的ID。
|
||||
|
||||
|
||||
core.addItem('pickaxe', 2)
|
||||
将破墙镐的个数增加2个,无任何特效。这里可以写任何道具的ID。
|
||||
|
||||
|
||||
core.getItem('pickaxe', 4)
|
||||
令勇士获得4个破墙镐。这里可以写任何道具的ID。
|
||||
和addItem相比,使用getItem会播放获得道具的音效,也会在左上角绘制获得提示。
|
||||
|
||||
|
||||
core.removeItem('pickaxe', 3)
|
||||
删除3个破墙镐。第二项可忽略,默认值为1。
|
||||
|
||||
|
||||
core.itemCount('pickaxe')
|
||||
返回当前破墙镐的个数。这里可以写任何道具的ID。
|
||||
|
||||
|
||||
core.hasItem('pickaxe')
|
||||
返回当前是否存在某个道具。等价于 core.itemCount('pickaxe')>0 。
|
||||
|
||||
|
||||
core.getEquip(0)
|
||||
获得0号装备类型(武器)的当前装备的itemId。如果不存在则返回null。
|
||||
这里可以写任意装备类型,从0开始和全塔属性中的equipName一一对应。
|
||||
|
||||
|
||||
core.hasEquip('sword1')
|
||||
获得当前某个具体的装备是否处于正在被装备状态。
|
||||
|
||||
|
||||
core.setFlag('xyz', 2)
|
||||
设置某个flag/变量的值为2。这里可以写任何的flag变量名。
|
||||
|
||||
|
||||
core.getFlag('xyz', 7)
|
||||
获得某个flag/变量的值;如果该变量不存在,则返回第二个参数。
|
||||
比如 core.getFlag('point', 2) 则获得变量point的值;如果该变量从未定义过则返回2。
|
||||
|
||||
|
||||
core.hasFlag('xyz')
|
||||
返回是否存在某个变量且不为0。等价于 core.getFlag('xyz', 0)!=0 。
|
||||
|
||||
|
||||
core.removeFlag('xyz')
|
||||
删除某个flag/变量。
|
||||
|
||||
|
||||
core.insertAction(list, x, y, callback)
|
||||
插入并执行一段自定义事件。在这里你可以写任意的自定义事件列表,有关详细写法请参见文档-事件。
|
||||
x和y如果设置则覆盖"当前事件点"的坐标,callback如果设置则覆盖事件执行完毕后的回调函数。
|
||||
例如: core.insertAction(["楼层切换", {"type":"changeFloor", "floorId": "MT3"}])
|
||||
将依次显示剧情文本,并执行一个楼层切换的自定义事件。
|
||||
--------
|
||||
从V2.5.4开始提出了“公共事件”的说法,这里也可以插入一个公共事件名。
|
||||
例如:core.insertAction("毒衰咒处理") 将插入公共事件“毒衰咒处理”。
|
||||
|
||||
|
||||
core.changeFloor(floorId, stair, heroLoc, time, callback) [异步]
|
||||
立刻切换到指定楼层。
|
||||
floorId为目标楼层ID,stair为到达的目标楼梯,heroLoc为到达的指定点,time为动画时间,callback为切换完毕后的回调。
|
||||
例如:
|
||||
core.changeFloor('MT2', 'upFloor', null, 600) 切换到MT2层的上楼点,动画事件600ms
|
||||
core.changeFloor('MT5', null, {'x': 3, 'y': 6}, 0) 无动画切换到MT5层的(3,6)位置。
|
||||
|
||||
|
||||
core.resetMap()
|
||||
重置当前楼层地图和楼层属性。
|
||||
此函数参数有三种形式:
|
||||
- 不加任何参数,表示重置当前层:core.resetMap()
|
||||
- 加上一个floorId,表示重置某一层:core.resetMap("MT1")
|
||||
- 使用一个数组,表示重置若干层:core.resetMap(["MT1", "MT2", "MT3"])
|
||||
---------------------------
|
||||
** 说明:从V2.5.5开始存档方式发生了改变,在编辑器修改了地图后现在将直接生效,无需再重置地图。
|
||||
|
||||
R
|
||||
录像回放的快捷键;这不是一个控制台命令,但是也把它放在这里供使用。
|
||||
录像回放在修改地图或新增数据后会很有用。
|
||||
|
||||
```
|
||||
|
||||
!> 一些相对高级的命令,针对有一定脚本经验的人
|
||||
|
||||
``` text
|
||||
|
||||
========== 可直接从core中调用的,最常被使用的函数 ==========
|
||||
core.js实际上是所有API的入口(路由),核心API的实现在其他几个文件中,core.js主要进行转发操作。
|
||||
|
||||
|
||||
core.nextX(n)
|
||||
获得勇士面向的第n个位置的x坐标,n可以省略默认为1(即正前方)
|
||||
|
||||
|
||||
core.nextY(n)
|
||||
获得勇士面向的第n个位置的y坐标,n可以省略默认为1(即正前方)
|
||||
|
||||
|
||||
core.nearHero(x, y)
|
||||
判断某个点是否和勇士的距离不超过1。
|
||||
|
||||
|
||||
core.openDoor(id, x, y, needKey, callback) [异步]
|
||||
尝试开门操作。id为目标点的ID,x和y为坐标,needKey表示是否需要使用钥匙,callback为开门完毕后的回调函数。
|
||||
id可为null代表使用地图上的值。
|
||||
例如:core.openDoor('yellowDoor', 10, 3, false, function() {console.log("1")})
|
||||
此函数返回true代表成功开门,并将执行callback回调;返回false代表无法开门,且不会执行回调函数。
|
||||
|
||||
|
||||
core.battle(id, x, y, force, callback) [异步]
|
||||
执行战斗事件。id为怪物的id,x和y为坐标,force为bool值表示是否是强制战斗,callback为战斗完毕后的回调函数。
|
||||
id可为null代表使用地图上的值。
|
||||
例如:core.battle('greenSlime', null, null, true)
|
||||
|
||||
|
||||
core.trigger(x, y) [异步]
|
||||
触发某个地点的事件。
|
||||
|
||||
|
||||
core.isReplaying()
|
||||
当前是否正在录像播放中
|
||||
|
||||
|
||||
core.drawBlock(block)
|
||||
重绘某个图块。block应为core.status.thisMap.blocks中的一项。
|
||||
|
||||
|
||||
core.drawMap(floorId, callback)
|
||||
重绘某一层的地图。floorId为要绘制楼层的floorId,callback为绘制完毕后的回调函数。
|
||||
|
||||
|
||||
core.terrainExists(x, y, id, floorId)
|
||||
检测某个点是否存在(指定的)地形。
|
||||
x和y为坐标;id为地形ID,可为null表示任意地形;floorId为楼层ID,可忽略表示当前楼层。
|
||||
|
||||
|
||||
core.enemyExists(x, y, id, floorId)
|
||||
检测某个点是否存在(指定的)怪物。
|
||||
x和y为坐标;id为怪物ID,可为null表示任意怪物;floorId为楼层ID,可忽略表示当前楼层。
|
||||
|
||||
|
||||
core.getBlock(x, y, floorId, showDisable)
|
||||
获得某个点的当前图块信息。
|
||||
x和y为坐标;floorId为楼层ID,可忽略或null表示当前楼层。
|
||||
showDisable如果为true,则对于禁用的点和事件也会进行返回。
|
||||
如果该点不存在图块,则返回null。
|
||||
否则,返回值如下: {"index": xxx, "block": xxx}
|
||||
其中index为该点在该楼层blocks数组中的索引,block为该图块实际内容。
|
||||
|
||||
|
||||
core.getBlockId(x, y, floorId, showDisable)
|
||||
获得某个点的图块ID。
|
||||
x和y为坐标;floorId为楼层ID,可忽略或null表示当前楼层。
|
||||
showDisable如果为true,则对于禁用的点和事件也会进行返回。
|
||||
如果该点不存在图块,则返回null,否则返回该点的图块ID。
|
||||
|
||||
|
||||
core.getBlockCls(x, y, floorId, showDisable)
|
||||
获得某个点的图块cls。
|
||||
x和y为坐标;floorId为楼层ID,可忽略或null表示当前楼层。
|
||||
showDisable如果为true,则对于禁用的点和事件也会进行返回。
|
||||
如果该点不存在图块,则返回null,否则返回该点的图块cls。
|
||||
|
||||
|
||||
core.showBlock(x, y, floorId)
|
||||
将某个点从禁用变成启用状态。
|
||||
|
||||
|
||||
core.hideBlock(x, y, floorId)
|
||||
将某个点从启用变成禁用状态,但不会对其进行删除。
|
||||
此函数不会实际将该块从地图中进行删除,而是将该点设置为禁用,以供以后可能的启用事件。
|
||||
|
||||
|
||||
core.removeBlock(x, y, floorId)
|
||||
将从启用变成禁用状态,并尽可能将其从地图上删除。
|
||||
和hideBlock相比,如果该点不存在自定义事件(比如门或普通的怪物),则将直接从地图中删除。
|
||||
如果存在自定义事件,则简单的禁用它,以供以后可能的启用事件。
|
||||
|
||||
|
||||
core.setBlock(number, x, y, floorId)
|
||||
改变图块。number为要改变到的图块数字,x和y为坐标,floorId为楼层ID,可忽略表示当前楼层。
|
||||
|
||||
|
||||
core.useItem(itemId, noRoute, callback)
|
||||
尝试使用某个道具。itemId为道具ID,noRoute如果为真则该道具的使用不计入录像。
|
||||
callback为成功或失败后的回调。
|
||||
|
||||
|
||||
core.canUseItem(itemId)
|
||||
返回当前能否使用某个道具。
|
||||
|
||||
|
||||
core.loadEquip(itemId, callback)
|
||||
装备上某个装备。itemId为装备的ID,callback为成功或失败后的回调。
|
||||
|
||||
|
||||
core.unloadEquip(equipType, callback)
|
||||
卸下某个部位的装备。equipType为装备类型,从0开始;callback为成功或失败后的回调。
|
||||
|
||||
|
||||
core.getNextItem()
|
||||
轻按。
|
||||
|
||||
|
||||
core.drawTip(text, itemIcon)
|
||||
在左上角绘制一段提示信息,2秒后消失。itemIcon为道具图标的索引。
|
||||
|
||||
|
||||
core.drawText(contents, callback) [异步]
|
||||
绘制一段文字。
|
||||
不推荐使用此函数,尽量使用core.insertAction(contents)来显示剧情文本。
|
||||
|
||||
|
||||
core.closePanel()
|
||||
结束一切事件和绘制,关闭UI窗口,返回游戏进程。
|
||||
|
||||
|
||||
core.replaceText(text)
|
||||
将一段文字中的${}进行计算并替换。
|
||||
|
||||
|
||||
core.calValue(value, prefix, need, times)
|
||||
计算表达式的实际值。这个函数可以传入status:atk等这样的参数。
|
||||
|
||||
|
||||
core.getLocalStorage(key, defaultValue)
|
||||
从localStorage中获得某个数据(已被parse);如果对应的key不存在则返回defaultValue。
|
||||
|
||||
|
||||
core.getLocalForage(key, defaultValue, successCallback, errorCallback)
|
||||
从localForage中获得某个数据(已被parse),如果对应的key不存在则返回defaultValue。
|
||||
如果成功则通过successCallback回调,失败则通过errorCallback回调。
|
||||
|
||||
|
||||
core.hasSave(index)
|
||||
判定当前某个存档位是否存在存档,返回true/false。
|
||||
index为存档编号,0代表自动存档,大于0则为正常的存档位。
|
||||
|
||||
|
||||
core.clone(data)
|
||||
深拷贝某个对象。
|
||||
|
||||
|
||||
core.isset(x)
|
||||
测试x是否不为null,不为undefined也不为NaN。
|
||||
|
||||
|
||||
core.rand(num)
|
||||
使用伪种子生成伪随机数。该随机函数能被录像支持。
|
||||
num如果设置大于0,则生成一个[0, num-1]之间的数;否则生成一个0到1之间的浮点数。
|
||||
此函数为伪随机算法,SL大法无效。(即多次SL后调用的该函数返回的值都是相同的。)
|
||||
|
||||
|
||||
core.rand2(num)
|
||||
使用系统的随机数算法得到的随机数。该随机函数能被录像支持。
|
||||
num如果设置大于0,则生成一个[0, num-1]之间的数;否则生成一个0到2147483647之间的整数。
|
||||
此函数使用了系统的Math.random()函数,支持SL大法。
|
||||
但是,此函数会将生成的随机数值存入录像,因此如果调用次数太多则会导致录像文件过大。
|
||||
|
||||
|
||||
core.restart() [异步]
|
||||
返回标题界面。
|
||||
|
||||
|
||||
========== core.actions.XXX 和游戏控制相关的函数 ==========
|
||||
actions.js主要用来进行用户交互行为的处理。
|
||||
所有用户行为,比如按键、点击、滑动等等,都会被此文件接收并进行操作。
|
||||
|
||||
|
||||
========== core.control.XXX 和游戏控制相关的函数 ==========
|
||||
control.js主要用来进行游戏控制,比如行走控制、自动寻路、存读档等等游戏核心内容。
|
||||
|
||||
core.control.setGameCanvasTranslate(canvasId, x, y)
|
||||
设置大地图的偏移量
|
||||
|
||||
|
||||
core.control.updateViewport()
|
||||
更新大地图的可见区域
|
||||
|
||||
|
||||
core.control.gatherFollowers()
|
||||
立刻聚集所有的跟随者
|
||||
|
||||
|
||||
core.control.replay()
|
||||
回放下一个操作
|
||||
|
||||
|
||||
========== core.enemys.XXX 和怪物相关的函数 ==========
|
||||
enemys.js主要用来进行怪物相关的内容,比如怪物的特殊属性,伤害和临界计算等。
|
||||
|
||||
|
||||
core.enemys.hasSpecial(special, test)
|
||||
测试怪物是否含有某个特殊属性。
|
||||
常见用法: core.enemys.hasSpecial(monster.special, 3) ## 测试是否拥有坚固
|
||||
|
||||
|
||||
core.enemys.getSpecialText(enemyId)
|
||||
返回一个列表,包含该怪物ID对应的所有特殊属性。
|
||||
|
||||
|
||||
core.enemys.getSpecialHint(enemy, special)
|
||||
获得怪物某个(或全部)特殊属性的文字说明。
|
||||
|
||||
|
||||
core.enemys.canBattle(enemyId, x, y, floorId)
|
||||
返回当前能否战胜某个怪物。
|
||||
后面三个参数是怪物坐标和楼层。
|
||||
|
||||
|
||||
core.enemys.getDamage(enemyId, x, y, floorId)
|
||||
返回当前对某个怪物的战斗伤害。如果无法战斗,返回null。
|
||||
后面三个参数是怪物坐标和楼层。
|
||||
|
||||
|
||||
core.enemys.getExtraDamage(enemyId)
|
||||
返回某个怪物会对勇士造成的额外伤害(不可被魔防抵消),例如仇恨、固伤等等。
|
||||
|
||||
|
||||
core.enemys.nextCriticals(enemyId, number, x, y, floorId)
|
||||
返回一个列表,为接下来number(可忽略,默认为1)个该怪物的临界值和临界减伤。
|
||||
列表每一项类似 [x,y] 表示临界值为x,且临界减伤为y。
|
||||
如果无临界值,则返回空列表。
|
||||
|
||||
|
||||
core.enemys.getDefDamage(enemyId, k, x, y, floorId)
|
||||
获得k(可忽略,默认为1)防减伤值。
|
||||
|
||||
|
||||
core.enemys.getDamageInfo(enemy, hero_hp, hero_atk, hero_def, hero_mdef, x, y, floorId)
|
||||
获得实际战斗信息,比如伤害,回合数,每回合伤害等等。
|
||||
此函数是实际战斗过程的计算。
|
||||
|
||||
|
||||
core.enemys.calDamage(enemy, hero_hp, hero_atk, hero_def, hero_mdef, x, y, floorId)
|
||||
获得在某个勇士属性下怪物伤害;实际返回的是上面getDamageInfo中伤害的数值。
|
||||
|
||||
|
||||
core.enemys.getCurrentEnemys(floorId)
|
||||
获得某一层楼剩余所有怪物的信息(供怪物手册使用)
|
||||
|
||||
|
||||
========== core.events.XXX 和事件相关的函数 ==========
|
||||
events.js主要用来进行事件处理,比如自定义事件,以及某些条件下可能会被触发的事件。
|
||||
大多数事件API都在脚本编辑中存在,这里只列出部分比较重要的脚本编辑中不存在的API。
|
||||
|
||||
|
||||
core.events.gameOver(ending, fromReplay)
|
||||
游戏结束并上传的事件。
|
||||
该函数将提问是否上传和是否下载录像,并返回标题界面。
|
||||
|
||||
|
||||
core.events.doEvents(list, x, y, callback) [异步]
|
||||
开始执行某个事件。
|
||||
请不要执行此函数,尽量使用 core.insertAction(list, x, y, callback) 来开始执行一段事件。
|
||||
|
||||
|
||||
core.events.doAction()
|
||||
执行下一个事件。此函数中将对所有自定义事件类型分别处理。
|
||||
|
||||
|
||||
core.events.getCommonEvent(name)
|
||||
根据名称获得一个公共事件;如果不存在对应的公共事件则返回null。
|
||||
|
||||
|
||||
core.events.openShop(shopId, needVisited) [异步]
|
||||
打开一个全局商店。needVisited表示是否需要该商店已被打开过。
|
||||
|
||||
|
||||
core.events.disableQuickShop(shopId)
|
||||
禁用一个全局商店
|
||||
|
||||
|
||||
core.events.canUseQuickShop(shopId)
|
||||
当前能否使用某个快捷商店
|
||||
|
||||
|
||||
core.events.setHeroIcon(name)
|
||||
设置勇士行走图
|
||||
|
||||
|
||||
========== core.items.XXX 和道具相关的函数 ==========
|
||||
items.js将处理和道具相关的内容,比如道具的使用,获取和删除等等。
|
||||
|
||||
|
||||
core.items.compareEquipment(equipId1, equipId2)
|
||||
比较两个装备的属性变化值
|
||||
|
||||
|
||||
========== core.loader.XXX 和游戏加载相关的函数 ==========
|
||||
loader.js将主要用来进行资源的加载,比如加载音乐、图片、动画等等。
|
||||
|
||||
|
||||
========== core.maps.XXX 和地图处理相关的函数 ==========
|
||||
maps.js主要用来进行地图相关的的操作。包括绘制地图,获取地图上的点等等。
|
||||
|
||||
|
||||
core.maps.getNumberById(id)
|
||||
根据ID来获得对应的数字。如果该ID不存在对应的数字则返回0。
|
||||
|
||||
|
||||
core.maps.canMoveHero(x,y,direction,floorId)
|
||||
判断能否前往某个方向。x,y为坐标,可忽略为当前点;direction为方向,可忽略为当前方向。
|
||||
floorId为楼层ID,可忽略为当前楼层。
|
||||
|
||||
|
||||
core.maps.canMoveDirectly(destX, destY)
|
||||
判断当前能否瞬间移动到某个点。
|
||||
该函数如果返回0则不可瞬间移动,大于0则可以瞬间移动,且返回值是跨度(即少走的步数)。
|
||||
|
||||
|
||||
core.maps.removeBlockById(index, floorId)
|
||||
根据索引删除或禁用某块。
|
||||
|
||||
|
||||
core.maps.removeBlockByIds(floorId, ids)
|
||||
根据索引删除或禁用若干块。
|
||||
|
||||
|
||||
core.maps.drawAnimate(name, x, y, callback)
|
||||
播放一段动画,name为动画名(需在全塔属性注册),x和y为坐标(0-12之间),callback可选,为播放完毕的回调函数。
|
||||
播放过程是异步的,如需等待播放完毕请使用insertAction插入一条type:waitAsync事件。
|
||||
此函数将随机返回一个数字id,为此异步动画的唯一标识符。
|
||||
|
||||
|
||||
core.maps.stopAnimate(id, doCallback)
|
||||
立刻停止一个异步动画。
|
||||
id为该动画的唯一标识符(由drawAnimate函数返回),doCallback可选,若为true则会执行该动画所绑定的回调函数。
|
||||
|
||||
|
||||
========== core.ui.XXX 和对话框绘制相关的函数 ==========
|
||||
ui.js主要用来进行UI窗口的绘制,比如对话框、怪物手册、楼传器、存读档界面等等。
|
||||
|
||||
|
||||
core.ui.getContextByName(canvas)
|
||||
根据画布名找到一个画布的context;支持系统画布和自定义画布。如果不存在画布返回null。
|
||||
也可以传画布的context自身,则返回自己。
|
||||
|
||||
|
||||
core.clearMap(name)
|
||||
清空某个画布图层。
|
||||
name为画布名,可以是系统画布之一,也可以是任意自定义动态创建的画布名;还可以直接传画布的context本身。(下同)
|
||||
如果name也可以是'all',若为all则为清空所有系统画布。
|
||||
|
||||
|
||||
core.ui.fillText(name, text, x, y, style, font)
|
||||
在某个画布上绘制一段文字。
|
||||
text为要绘制的文本,x,y为要绘制的坐标,style可选为绘制的样式,font可选为绘制的字体。(下同)
|
||||
|
||||
|
||||
core.ui.fillBoldText(name, text, x, y, style, font)
|
||||
在某个画布上绘制一个描黑边的文字。
|
||||
|
||||
|
||||
core.ui.fillRect(name, x, y, width, height, style)
|
||||
绘制一个矩形。style可选为绘制样式。
|
||||
|
||||
|
||||
core.ui.strokeRect(name, x, y, width, height, style)
|
||||
绘制一个矩形的边框。
|
||||
|
||||
|
||||
core.ui.drawLine(name, x1, y1, x2, y2, style, lineWidth)
|
||||
绘制一条线。lineWidth可选为线宽。
|
||||
|
||||
|
||||
core.ui.drawArrow(name, x1, y1, x2, y2, style, lineWidth)
|
||||
绘制一个箭头。
|
||||
|
||||
|
||||
core.ui.setFont(name, font) / core.ui.setLineWidth(name, lineWidth)
|
||||
设置一个画布的字体/线宽。
|
||||
|
||||
|
||||
core.ui.setAlpha(name, font) / core.ui.setOpacity(name, font)
|
||||
设置一个画布的绘制不透明度和画布本身的不透明度。
|
||||
两者区别如下:
|
||||
- setAlpha是设置"接下来绘制的内容的不透明度",不会对已经绘制的内容产生影响。比如setAlpha('ui', 0.5)则会在接下来的绘制中使用0.5的不透明度。
|
||||
- setOpacity是设置"画布本身的不透明度",已经绘制的内容也会产生影响。比如我已经在UI层绘制了一段文字,再setOpacity则也会看起来变得透明。
|
||||
尽量不要对系统画布使用setOpacity(因为会对已经绘制的内容产生影响),自定义创建的画布则不受此限制。
|
||||
|
||||
|
||||
core.ui.setFillStyle(name, style) / core.ui.setStrokeStyle(name, style)
|
||||
设置一个画布的填充样式/描边样式。
|
||||
|
||||
|
||||
core.ui.setTextAlign(name, align)
|
||||
设置一个画布的文字对齐模式。
|
||||
|
||||
|
||||
core.ui.calWidth(name, text, font)
|
||||
计算一段文字在画布上的绘制宽度
|
||||
font可选,如果存在则会先设置该画布上的字体。
|
||||
|
||||
|
||||
core.ui.drawImage(name, image, x, y, w, h, x1, y1, w1, h1)
|
||||
在一个画布上绘制图片。
|
||||
name为画布名,可以是系统画布之一,也可以是任意自定义动态创建的画布名;还可以直接传画布的context本身。
|
||||
image为要绘制的图片,可以是一个全塔属性中定义的图片名(会从images中去获取),图片本身,或者一个画布。
|
||||
后面的8个坐标参数与canvas的drawImage的八个参数完全相同。
|
||||
请查看 http://www.w3school.com.cn/html5/canvas_drawimage.asp 了解更多。
|
||||
|
||||
|
||||
core.ui.createCanvas(name, x, y, width, height, zIndex)
|
||||
动态创建一个画布。name为要创建的画布名,如果已存在则会直接取用当前存在的。
|
||||
x,y为创建的画布相对窗口左上角的像素坐标,width,height为创建的长宽。
|
||||
zIndex为创建的纵向高度(关系到画布之间的覆盖),z值高的将覆盖z值低的;系统画布的z值可在个性化中查看。
|
||||
返回创建的画布的context,也可以通过core.dymCanvas[name]调用。
|
||||
|
||||
|
||||
core.ui.relocateCanvas(name, x, y)
|
||||
重新定位一个自定义画布。
|
||||
|
||||
|
||||
core.ui.resizeCanvas(name, x, y)
|
||||
重新设置一个自定义画布的大小。
|
||||
|
||||
|
||||
core.ui.deleteCanvas(name)
|
||||
删除一个自定义画布。
|
||||
|
||||
|
||||
core.ui.deleteAllCanvas()
|
||||
清空所有的自定义画布。
|
||||
|
||||
|
||||
core.ui.drawThumbnail(floorId, canvas, blocks, x, y, size, heroLoc, heroIcon)
|
||||
绘制一个缩略图,比如楼传器界面,存读档界面等情况。
|
||||
floorId为目标楼层ID,canvas为要绘制到的图层,blocks为要绘制的所有图块。
|
||||
x,y为该图层开始绘制的起始点坐标,size为每一格的像素,heroLoc为勇士坐标,heroIcon为勇士图标。
|
||||
|
||||
|
||||
========== core.utils.XXX 工具类的辅助函数 ==========
|
||||
utils.js主要用来进行一些辅助函数的计算。
|
||||
|
||||
|
||||
core.utils.splitLines(canvas, text, maxLength, font)
|
||||
自动切分长文本的换行。
|
||||
canvas为图层,text为要自动换行的内容,maxLength为每行最长像素,font为文本的字体。
|
||||
|
||||
|
||||
core.utils.cropImage(image, size)
|
||||
纵向对图片进行切分(裁剪)。
|
||||
|
||||
|
||||
core.utils.push(a,b)
|
||||
向某个数组后插入另一个数组或元素
|
||||
|
||||
|
||||
core.utils.unshift(a, b)
|
||||
向某个数组前插入另一个数组或元素
|
||||
|
||||
|
||||
core.utils.encodeBase64(str)
|
||||
Base64加密字符串
|
||||
|
||||
|
||||
core.utils.decodeBase64(str)
|
||||
Base64解密字符串
|
||||
|
||||
|
||||
core.utils.formatBigNumber(x, onMap)
|
||||
大数据的格式化
|
||||
|
||||
|
||||
core.utils.subarray(a, b)
|
||||
检查b是否是a的从头开始子串。
|
||||
如果是,则返回a删去b的一段;否则返回null。
|
||||
|
||||
|
||||
core.utils.same(a, b)
|
||||
比较a和b两个对象是否相同
|
||||
|
||||
|
||||
core.utils.clamp(x, a, b)
|
||||
将x限制在[a,b]之间的范围内
|
||||
|
||||
|
||||
core.utils.arrayToRGB(color)
|
||||
将形如[255,0,0]之类的数组转成#FF0000这样的RGB形式。
|
||||
|
||||
|
||||
core.utils.arrayToRGBA(color)
|
||||
将形如[255,0,0,1]之类的数组转成rgba(255,0,0,1)这样的RGBA形式。
|
||||
|
||||
|
||||
core.utils.encodeRoute(list)
|
||||
压缩加密路线。可以使用core.encodeRoute(core.status.route)来压缩当前路线。
|
||||
|
||||
|
||||
core.utils.decodeRoute(route)
|
||||
解压缩(解密)路线。
|
||||
|
||||
|
||||
core.utils.readFile(success, error, readType) [异步]
|
||||
尝试请求读取一个本地文件内容。
|
||||
success和error为成功/失败后的回调,readType不设置则以文本读取,否则以DataUrl形式读取。
|
||||
|
||||
|
||||
core.utils.readFileContent(content) [异步]
|
||||
文件读取完毕后的内容处理。
|
||||
|
||||
|
||||
core.utils.download(filename, content)
|
||||
尝试生成并下载一个文件。
|
||||
|
||||
|
||||
core.utils.copy(data)
|
||||
尝试复制一段文本到剪切板。
|
||||
|
||||
|
||||
core.utils.http(type, url, formData, success, error) [异步]
|
||||
发送一个异步HTTP请求。
|
||||
type为'GET'或者'POST';url为目标地址;formData如果是POST请求则为表单数据。
|
||||
success为成功后的回调,error为失败后的回调。
|
||||
|
||||
```
|
||||
|
||||
BIN
_docs/img/console1.jpg
Normal file
BIN
_docs/img/console1.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 49 KiB |
BIN
_docs/img/elements.jpg
Normal file
BIN
_docs/img/elements.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 171 KiB |
BIN
_docs/img/sources.jpg
Normal file
BIN
_docs/img/sources.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 116 KiB |
@ -337,28 +337,16 @@ function (enemy, hero_hp, hero_atk, hero_def, hero_mdef, x, y, floorId) {
|
||||
|
||||
对于特殊的塔,我们可以考虑修改楼传事件来完成一些特殊的要求,比如镜子可以按楼传来切换表里。
|
||||
|
||||
要修改楼传事件,需要进行如下几步:
|
||||
要修改楼传事件,需要进行如下两步:
|
||||
|
||||
1. 截获楼传的点击事件。在control.js中找到useFly函数,并将其替换成如下内容:
|
||||
``` js
|
||||
////// 点击楼层传送器时的打开操作 //////
|
||||
control.prototype.useFly = function (need) {
|
||||
if (core.isMoving()) {
|
||||
core.drawTip("请先停止勇士行动");
|
||||
return;
|
||||
}
|
||||
if (core.status.lockControl || core.status.event.id != null) return;
|
||||
|
||||
if (core.canUseItem('fly')) core.useItem('fly');
|
||||
else core.drawTip("当前无法使用"+core.material.items.fly.name);
|
||||
}
|
||||
```
|
||||
1. 重写楼传的点击事件。在插件中对`core.control.useFly进行重写`。详细代码参见[重写点击楼传事件](api#重写点击楼传事件)。
|
||||
2. 修改楼传的使用事件。和其他永久道具一样,在地图编辑器的图块属性中修改楼传的useItemEffect和canUseItemEffect两个内容。例如:
|
||||
``` js
|
||||
"useItemEffect": "core.insertAction([...])" // 执行某段自定义事件,或者其他脚本
|
||||
"canUseItemEffect": "true" // 任何时候可用
|
||||
```
|
||||
修改时,请先把`null`改成空字符串`""`,然后再双击进行编辑。
|
||||
|
||||
除了覆盖楼传事件外,对于快捷商店、虚拟键盘等等也可以进行覆盖,只不过是仿照上述代码重写对应的函数(`openQuickShop`,`openKeyboard`)即可。
|
||||
|
||||
## 自定义怪物属性
|
||||
|
||||
@ -441,7 +429,7 @@ this.myfunc = function(x) {
|
||||
|
||||
从V2.6开始,在插件中用`this.xxx`定义的函数将会被转发到core中。例如上述的`myfunc`除了`core.plugin.myfunc`外也可以直接`core.myfunc`调用。
|
||||
|
||||
详见[函数转发](api#函数转发)。
|
||||
详见[函数的转发](api#函数的转发)。
|
||||
|
||||
## 标题界面事件化
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user