V2.0 Docs
This commit is contained in:
parent
72d140d4c9
commit
55e153928b
89
docs/V2.0.md
Normal file
89
docs/V2.0.md
Normal file
@ -0,0 +1,89 @@
|
||||
# V2.0版本介绍
|
||||
|
||||
?> 目前版本**v2.0**,上次更新时间:* {docsify-updated} *
|
||||
|
||||
目前样板已经更新到V2.0版本,本章将对V2.0的一些内容进行介绍。
|
||||
|
||||
请确保已经看过前面的几个文档(2.0都有部分更新),前面已经描述过的东西这里将不再赘述。
|
||||
|
||||
也欢迎通过看B站的视频教程来具体了解2.0版本的使用方法。
|
||||
|
||||
## 目录结构的改变
|
||||
|
||||
在1.x中,所有数据和逻辑都是一体的,例如怪物数据和怪物伤害计算公式等等。这导致样板的版本更新时会十分不便。
|
||||
|
||||
在2.0中,我们将数据和逻辑进行了分离,拆分成了libs和project两个目录。
|
||||
|
||||
- libs目录为游戏核心库文件,包括一些游戏逻辑等内容
|
||||
- project目录为针对每个塔的目录,是和游戏逻辑是分离的。
|
||||
|
||||
我们只需要修改project目录下的各项内容,而无需去动libs目录(有特殊需求除外);
|
||||
将来如果想把塔迁移到新的版本上,也只需要迁移project即可。
|
||||
|
||||
另外一点的就是,我们将libs目录中的core.js进行了拆分,从而使每个文件的具体工作更加一目了然,也避免了接近6K行的大文件会导致打开IDE的卡顿问题。
|
||||
|
||||
## 全GUI造塔
|
||||
|
||||
在1.X版本中,我们提供了一个地图编辑器。但是它的功能十分弱,只能进行绘图的功能,实际的各项操作还是需要通过VSCode打开js文件实际进行编写代码。
|
||||
|
||||
但是在2.0中,我们大大拓展了地图编辑器的功能,从而达到了“全GUI造塔”的功能,用户再也不用手动打开任何一个文件进行编辑了。
|
||||
|
||||
GUI界面分为`地图编辑器`,`事件编辑器`和`文本编辑器`。
|
||||
|
||||
!> 即使现在可以全GUI造塔,也强烈建议对1.X的造塔方式进行了解,因为这是一切的基础。
|
||||
|
||||
### 地图编辑器
|
||||
|
||||
地图编辑器分为三个区域,左侧的`编辑区`,中间的`画布区`,右侧的`素材区`。
|
||||
|
||||
画布区下方有切换地图和编辑器模式的下拉菜单,点击`保存地图`后画布的内容才会真正写入到js文件中。
|
||||
|
||||
在素材区点击图块时,会选中该图块,此时tips会显示该图块的信息,编辑区会进入图块属性模式,怪物或物品可以直接在里面编辑数值。如果图块的数字和ID没有被定义,则可以直接在左侧定义,**定义新图块后需要保存并刷新页面后才能生效**。
|
||||
|
||||
在tips中有图块信息时,在画布上点击或拖拽可以把图块画上去,可以使用ctrl+Z撤销操作以及对应的ctrl+Y恢复撤销。擦除方块可以使用素材区最左上角的擦除块。
|
||||
|
||||
点击界面中的空白,tips中的图块信息会被清空,此时再点击画布上的点,则编辑器会进入地图选点模式。此模式下可以编辑改点的`events`,`afterBattle`,`changeFloor`等事件或者是`canMove`来改变各方向的通行状态。
|
||||
|
||||
切换地图会使编辑区进入楼层属性模式,这里可以修改首次到达该楼层时会触发的事件`firstArrive`,楼层显示的名称,默认的前景背景图片,默认天气和色调等等。
|
||||
|
||||
!> 这里不允许编辑楼层的ID,需要修改ID的场合请直接改js文件,并保持三个标识符完全一致。`data.js`中的`floorIds`也需要对应进行修改。
|
||||
|
||||
全塔属性中编辑整个塔为单位的属性,例如起始剧情`startText`,`name`,提供哪些难度,主角的起始属性,全局商店,各种数值以及系统FLAG等。**创建新塔时需要认真编辑这里面的所有选项。**
|
||||
|
||||
脚本编辑模式可以修改常用的需要更改的函数。例如,给不同的难度设置不同的内容`setInitData`,加点`addPoint`,以及修改游戏中的关于界面`drawAbout`等等。
|
||||
|
||||
追加素材模式可以导入一个图片到该标签的画板中,然后依次点击画板中的图块,点追加就可以按顺序把这些图片添加到对应的画布区素材的最下方,**需要刷新来生效**。
|
||||
|
||||
地图编辑模式中可以导入来自地图生成器的地图数组,同时创建新楼层需要在这里通过另存为来实现,可以点清除地图把另存为出的新楼层清空。
|
||||
|
||||
!> 编辑区的表格可以直接修改,推荐通过双击,在事件编辑器和文本编辑器中进行编辑。编辑区中的修改需要点保存才会生效。
|
||||
|
||||
### 事件编辑器
|
||||
|
||||
地图选点中的事件类表格,以及楼层属性中的`firstArrive`和全塔属性的`startText`,在双击时会进入事件编辑器,是由[antlr-blockly](https://github.com/zhaouv/antlr-blockly)生成的图块式的可视化编辑器.
|
||||
|
||||
把左侧的方块拖到面板中,下方就会实时的显示对应的js的代码(以及数值不正确时的提示).
|
||||
|
||||
每个方块点击右键会展开一个菜单,点帮助可以跳转到此文档中对应的内容。利用好复制功能可以极大提高编辑的效率。注释选项请不要使用,编辑器并不会保留这里的注释。
|
||||
|
||||
`template`中提供了一些模板事件,例如战前剧情,打怪开门。
|
||||
|
||||
`显示文章`的两个方块,以及`自动剧情文本`,`选项`和`自定义JS脚本`这5个方块,可以通过双击在文本编辑器中(以多行的方式)编辑其中的文字。
|
||||
|
||||
### 文本编辑器
|
||||
|
||||
事件编辑器之外的内容双击后由文本编辑器来编辑,是有js高亮支持的多行文本编辑器[CodeMirror](https://github.com/codemirror/CodeMirror),点confirm即可使编辑的文本替换到表格中。
|
||||
|
||||
### 拓展地图编辑器
|
||||
|
||||
> 面向有一定编程基础的用户
|
||||
|
||||
修改`project/`下的`*comment.js`可以让地图编辑器对自己添加的属性有更好的支持.例如:
|
||||
+ 给`comment.js`中`enemys`加入新的键值对,就可以更方便的给怪物在UI界面中添加对应的值.
|
||||
+ 在`data.comment.js`中把自己添加的内容标记为叶节点,不再在表格中展开到最末端.
|
||||
|
||||
地图编辑器的部分API见`_server/README.md`
|
||||
|
||||
## 部分事件和API更新
|
||||
|
||||
在2.0中,有部分的事件和API存在更新,也增加了包括48x32素材的支持,在这里将不再赘述,请仔细阅读前面的几个文档进行了解。
|
||||
@ -3,4 +3,5 @@
|
||||
- [元件说明](element)
|
||||
- [事件](event)
|
||||
- [个性化](personalization)
|
||||
- [V2.0版本介绍](V2.0)
|
||||
- [附录:API列表](api)
|
||||
|
||||
@ -1,51 +0,0 @@
|
||||
# 地图编辑器使用说明
|
||||
|
||||
## 地图编辑器
|
||||
|
||||
UI界面分为3个区域,左侧的编辑区,中间的画布区,右侧的素材区,以及两个弹窗形式的分别是事件编辑器和文本编辑器.
|
||||
|
||||
画布区下方有切换地图和编辑器模式的下拉菜单,点击`保存地图`后画布的内容才会写入到文件中.同时一个显示信息的tips区.
|
||||
|
||||
在素材区点击图块时,会选中该图块,此时tips会显示该图块的信息,编辑区会进入图块属性模式,怪物或物品可以直接在里面编辑数值.如果地图的数字和ID未被定义,可以在左侧定义,定义新图块需要刷新才能生效.
|
||||
|
||||
在tips中有图块信息时,在画布上点击或拖拽可以把图块画上去,可以使用ctrl+Z撤销操作以及对应的ctrl+Y恢复撤销.擦除方块可以使用素材区最左上角的擦除块.
|
||||
|
||||
点击界面中的空白,tips中的图块信息会被清空,此时再点击画布上的点,编辑器会进入地图选点模式.此时可以编辑改点的`events`,`afterBattle`,`changeFloor`等事件或者是`canMove`来改变各方向的通行状态.
|
||||
|
||||
切换地图会使编辑区进入楼层属性模式,这里可以修改首次到达该楼层时会触发的事件`firstArrive`,楼层显示的名称,默认的前景背景图片,默认天气和色调,是否允许使用快捷商店等等.注:这里不允许编辑楼层的ID,需要修改ID的场合请直接改js文件,并保持注释中的三个标识符一致.
|
||||
|
||||
全塔属性中编辑整个塔为单位的属性,例如起始剧情`startText`,塔的ID,提供哪些难度,主角的起始属性起始道具,全局商店,各种数值以及系统FLAG.创建新塔时需要认真编辑这里面的所有选项.
|
||||
|
||||
脚本编辑模式可以修改常用的需要更改的函数.例如,给不同的难度设置不同的内容,加点,推箱子达成后的触发,以及修改游戏中的`关于`界面.
|
||||
|
||||
追加素材模式可以导入一个图片到该标签的画板中,然后依次点击画板中的图块,点追加就可以按顺序把这些图片添加到对应的画布区素材的最下方,需要刷新来生效.
|
||||
|
||||
地图编辑模式中可以导入来自地图生成器的地图数组,同时创建新楼层需要在这里通过另存为来实现,可以点清除地图把另存为出的新楼层清空.
|
||||
|
||||
> 编辑区的表格可以直接修改,推荐通过双击,在事件编辑器和文本编辑器中进行编辑.编辑区中的修改需要点保存才会生效.
|
||||
|
||||
## 事件编辑器
|
||||
|
||||
地图选点中的表格,以及楼层属性中的`firstArrive`和全塔属性的`startText`,在双击时会进入事件编辑器,是由[antlr-blockly](https://github.com/zhaouv/antlr-blockly)生成的图块式的可视化编辑器.
|
||||
|
||||
把左侧的方块拖到面板中,下方就会实时的显示对应的js的代码(以及数值不正确时的提示).
|
||||
|
||||
每个方块点击右键会展开一个菜单,点帮助可以跳转到此文档中对应的内容.利用好复制功能可以极大提高编辑的效率.注释选项请不要使用,编辑器并不会保留这里的注释.
|
||||
|
||||
template中提供了一些模板事件,例如战前剧情,打怪开门.
|
||||
|
||||
`显示文章`的两个方块,以及`自动剧情文本`,`选项`和`自定义JS脚本`这5个方块,可以通过双击方块,在文本编辑器中(以多行的方式)编辑其中的文字.
|
||||
|
||||
## 文本编辑器
|
||||
|
||||
事件编辑器之外的内容双击后由文本编辑器来编辑,是有js高亮支持的多行文本编辑器[CodeMirror](https://github.com/codemirror/CodeMirror),点confirm即可使编辑的文本替换到表格中
|
||||
|
||||
## 拓展地图编辑器
|
||||
|
||||
> 面向有一定编程基础的用户
|
||||
|
||||
修改`project/`下的`*comment.js`可以让地图编辑器对自己添加的属性有更好的支持.例如:
|
||||
+ 给`comment.js`中`enemys`加入新的键值对,就可以更方便的给怪物在UI界面中添加对应的值.
|
||||
+ 在`data.comment.js`中把自己添加的内容标记为叶节点,不再在表格中展开到最末端.
|
||||
|
||||
地图编辑器的部分API见`_server/README.md`
|
||||
@ -1,6 +1,6 @@
|
||||
# 元件说明
|
||||
|
||||
?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} *
|
||||
?> 目前版本**v2.0**,上次更新时间:* {docsify-updated} *
|
||||
|
||||
在本章中,将对样板里的各个元件进行说明。各个元件主要包括道具、门、怪物、楼梯等等。
|
||||
|
||||
@ -37,7 +37,7 @@
|
||||
|
||||
怪物可以有特殊属性,每个怪物可以有多个自定义属性。
|
||||
|
||||
怪物的特殊属性所对应的数字(special)在下面的`getSpecialText`中定义,请勿对已有的属性进行修改。
|
||||
怪物的特殊属性所对应的数字(special)在`libs/enemys.js`中的`getSpecialText`中定义,请勿对已有的属性进行修改。
|
||||
|
||||
``` js
|
||||
enemys.prototype.getSpecialText = function (enemyId) {
|
||||
@ -66,6 +66,8 @@ enemys.prototype.getSpecialText = function (enemyId) {
|
||||
if (this.hasSpecial(special, 19)) text.push("自爆");
|
||||
if (this.hasSpecial(special, 20)) text.push("无敌");
|
||||
if (this.hasSpecial(special, 21)) text.push("退化");
|
||||
if (this.hasSpecial(special, 22)) text.push("固伤");
|
||||
if (this.hasSpecial(special, 23)) text.push("重生");
|
||||
return text.join(" ");
|
||||
}
|
||||
```
|
||||
@ -125,6 +127,8 @@ N连击怪物的special是6,且我们可以为它定义n代表实际连击数
|
||||
|
||||

|
||||
|
||||
固伤怪则需要在后面增加`damage`选项,代表战前扣血数值。
|
||||
|
||||
如有额外需求,可参见[自定义怪物属性](personalization#自定义自定义怪物属性),里面讲了如何设置一个新的怪物属性。
|
||||
|
||||
## 路障,楼梯,传送门
|
||||
@ -153,10 +157,10 @@ floorId指定的是目标楼层的唯一标识符(ID)。
|
||||
|
||||
现在我们的H5魔塔支持播放动画,也支持天气系统了。
|
||||
|
||||
要播放动画,你需要先使用“RM动画导出器”将动画导出,放在animates目录下,然后在main.js中定义。
|
||||
要播放动画,你需要先使用“RM动画导出器”将动画导出,放在animates目录下,然后再data.js中定义。
|
||||
|
||||
``` js
|
||||
this.animates = [// 在此存放所有可能使用的动画,必须是animate格式,在这里不写后缀名
|
||||
"animates": [// 在此存放所有可能使用的动画,必须是animate格式,在这里不写后缀名
|
||||
// 动画必须放在animates目录下;文件名不能使用中文,不能带空格或特殊字符
|
||||
"hand", "sword", "zone", "yongchang", "thunder" // 根据需求自行添加
|
||||
]
|
||||
@ -164,8 +168,6 @@ this.animates = [// 在此存放所有可能使用的动画,必须是animate
|
||||
|
||||
!> 动画必须是animate格式,名称不能使用中文,不能带空格或特殊字符。
|
||||
|
||||
目前暂时不支持带旋转和翻转的帧。
|
||||
|
||||
导出动画时可能会进行一些压缩以节省流量,因此清晰度可能不如原版。
|
||||
|
||||
动画播放时,是按照每秒20帧的速度(即50ms/帧)。
|
||||
@ -192,13 +194,13 @@ this.animates = [// 在此存放所有可能使用的动画,必须是animate
|
||||
要播放音乐和音效,你需要将对应的文件放在sounds目录下,然后在main.js中进行定义
|
||||
|
||||
``` js
|
||||
this.bgms = [ // 在此存放所有的bgm,和文件名一致。第一项为默认播放项
|
||||
"bgms": [ // 在此存放所有的bgm,和文件名一致。第一项为默认播放项
|
||||
// 音频名不能使用中文,不能带空格或特殊字符;可以直接改名拼音就好
|
||||
'058-Slow01.mid', 'bgm.mp3', 'qianjin.mid', 'star.mid'
|
||||
'bgm.mp3', 'qianjin.mid', 'star.mid',
|
||||
];
|
||||
this.sounds = [ // 在此存放所有的SE,和文件名一致
|
||||
"sounds": [ // 在此存放所有的SE,和文件名一致
|
||||
// 音频名不能使用中文,不能带空格或特殊字符;可以直接改名拼音就好
|
||||
'floor.mp3', 'attack.ogg', 'door.ogg', 'item.ogg'
|
||||
'floor.mp3', 'attack.ogg', 'door.ogg', 'item.ogg', 'zone.ogg'
|
||||
]
|
||||
```
|
||||
|
||||
@ -245,7 +247,7 @@ this.sounds = [ // 在此存放所有的SE,和文件名一致
|
||||
- **[ESC]** 打开/关闭系统菜单
|
||||
- **[H]** 打开帮助页面
|
||||
- **[Z]** 转向
|
||||
- **[R]** 回退
|
||||
- **[R]** 回放录像
|
||||
- **[SPACE]** 轻按(仅在轻按开关打开时有效)
|
||||
- **[1]** 快捷使用破墙镐
|
||||
- **[2]** 快捷使用炸弹/圣锤
|
||||
|
||||
107
docs/event.md
107
docs/event.md
@ -1,6 +1,6 @@
|
||||
# 事件
|
||||
|
||||
?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} *
|
||||
?> 目前版本**v2.0**,上次更新时间:* {docsify-updated} *
|
||||
|
||||
本章内将对样板所支持的事件进行介绍。
|
||||
|
||||
@ -20,6 +20,13 @@
|
||||
|
||||
在事件列表中使用`type: show`和`type: hide`可以将一个禁用事件启用,或将一个启用事件给禁用。
|
||||
|
||||
## 关于V2.0的重要说明
|
||||
|
||||
在V2.0版本中,所有事件均可以使用blockly来进行块的可视化编辑。
|
||||
|
||||
它能通过拖动、复制粘贴等方式帮助你快速生成事件列表,而不用手动打大量字符。
|
||||
|
||||
但是,仍然强烈建议要对每个事件的写法进行了解。
|
||||
|
||||
## 自定义事件
|
||||
|
||||
@ -615,13 +622,13 @@ loc可忽略,如果忽略则显示为事件当前点。
|
||||
|
||||
``` js
|
||||
"x,y": [ // 实际执行的事件列表
|
||||
{"type": "showImage", "name": "bg", "loc": [231,297]}, // 在(231,297)显示bg.png
|
||||
{"type": "showImage", "name": "1", "loc": [109,167]}, // 在(109,167)显示1.png
|
||||
{"type": "showImage", "name": "bg.jpg", "loc": [231,297]}, // 在(231,297)显示bg.jpg
|
||||
{"type": "showImage", "name": "1.png", "loc": [109,167]}, // 在(109,167)显示1.png
|
||||
{"type": "showImage"} // 如果不指定name则清除所有图片。
|
||||
]
|
||||
```
|
||||
|
||||
name为图片名。**请确保图片在main.js中的this.images中被定义过。**
|
||||
name为图片名。**请确保图片在data.js中的images中被定义过。**
|
||||
|
||||
loc为图片左上角坐标,以像素为单位进行计算。
|
||||
|
||||
@ -769,10 +776,12 @@ move完毕后移动的NPC/怪物一定会消失,只不过可以通过immediate
|
||||
|
||||
### win: 获得胜利
|
||||
|
||||
`{"type": "win", "reason": "xxx"}` 将会直接调用events.js中的win函数,并将reason作为参数传入。
|
||||
`{"type": "win", "reason": "xxx"}` 将会直接调用events.js中的win函数,并将reason作为结局传入。
|
||||
|
||||
该事件会显示获胜页面,并重新游戏。
|
||||
|
||||
!> 如果`reason`不为空,则会以reason作为获胜的结局!
|
||||
|
||||
### lose: 游戏失败
|
||||
|
||||
`{"type": "lose", "reason": "xxx"}` 将会直接调用`events.js`中的lose函数,并将reason作为参数传入。
|
||||
@ -1059,19 +1068,24 @@ core.insertAction(list) //往当前事件列表中插入一系列事件。使用
|
||||
|
||||
打败怪物后可以进行加点。
|
||||
|
||||
如果要对某个怪物进行加点操作,则首先需要修改该怪物的点数值,即在怪物定义的后面添加`point`,代表怪物本身的加点数值。
|
||||
要启用加点,首先需要在`data.js`中将`enableAddPoint`置为true。
|
||||
|
||||
如果要对某个怪物进行加点操作,则首先需要修改该怪物的`point`数值,代表怪物本身的加点数值。
|
||||
|
||||
``` js
|
||||
... 'def': 0, 'money': 1, 'experience': 1, 'special': 0, 'point': 1}, // 在怪物后面添加point代表怪物的加点数
|
||||
... 'def': 0, 'money': 1, 'experience': 1, 'point': 1, 'special': 0}, // 在怪物后面添加point代表怪物的加点数
|
||||
```
|
||||
|
||||
然后在`events.js`文件中找到`addPoint`函数。它将返回一个choices事件。修改此函数为我们需要的加点项即可。
|
||||
然后在`functions.js`文件中找到`addPoint`函数。它将返回一个choices事件。修改此函数为我们需要的加点项即可。
|
||||
|
||||
!> V2.0版本可以直接在“脚本编辑 - 加点事件”中双击进行修改!
|
||||
|
||||
``` js
|
||||
////// 加点 //////
|
||||
events.prototype.addPoint = function (enemy) {
|
||||
var point = enemy.point; // 获得该怪物的point
|
||||
if (!core.isset(point) || point<=0) return [];
|
||||
////// 加点事件 //////
|
||||
"addPoint" : function (enemy) {
|
||||
// 加点事件
|
||||
var point = enemy.point;
|
||||
if (!core.flags.enableAddPoint || !core.isset(point) || point<=0) return [];
|
||||
|
||||
// 加点,返回一个choices事件
|
||||
return [
|
||||
@ -1230,11 +1244,13 @@ events.prototype.addPoint = function (enemy) {
|
||||
|
||||
上面的afterBattle事件只对和怪物进行战斗后才有会被处理。
|
||||
|
||||
如果我们想在使用炸弹后也能触发一些事件(如开门),则可以在`events.js`里面的`afterUseBomb`函数进行处理:
|
||||
如果我们想在使用炸弹后也能触发一些事件(如开门),则可以在`functions.js`里面的`afterUseBomb`函数进行处理:
|
||||
|
||||
!> V2.0版本可以直接在“脚本编辑 - 使用炸弹后的事件”中双击进行修改!
|
||||
|
||||
``` js
|
||||
////// 使用炸弹/圣锤后的事件 //////
|
||||
events.prototype.afterUseBomb = function () {
|
||||
"afterUseBomb": function () {
|
||||
// 这是一个使用炸弹也能开门的例子
|
||||
if (core.status.floorId=='xxx' && core.terrainExists(x0,y0,'specialDoor') // 某个楼层,该机关门存在
|
||||
&& !core.enemyExists(x1,y1) && !core.enemyExists(x2,y2)) // 且守门的怪物都不存在
|
||||
@ -1262,11 +1278,11 @@ events.prototype.afterUseBomb = function () {
|
||||
|
||||
!> 推箱子的前方不允许存在任何事件(花除外),包括已经禁用的自定义事件。
|
||||
|
||||
推完箱子后将触发events.js中的afterPushBox事件,你可以在这里进行开门判断。
|
||||
推完箱子后将触发functions.js中的afterPushBox事件,你可以在这里进行开门判断。
|
||||
|
||||
``` js
|
||||
////// 推箱子后的事件 //////
|
||||
events.prototype.afterPushBox = function () {
|
||||
"afterPushBox" = function () {
|
||||
|
||||
var noBoxLeft = function () {
|
||||
// 地图上是否还存在未推到的箱子,如果不存在则返回true,存在则返回false
|
||||
@ -1290,6 +1306,33 @@ events.prototype.afterPushBox = function () {
|
||||
}
|
||||
```
|
||||
|
||||
## 怪物数据的动态修改
|
||||
|
||||
有时候我们可能还需要在游戏过程中动态修改怪物数据,例如50层魔塔的封印魔王,或者根据难度分歧来调整最终Boss的属性数据。
|
||||
|
||||
而在我们的存档中,是不会对怪物数据进行存储的,只会存各个变量和Flag,因此我们需要在读档后根据变量或Flag来调整怪物数据。
|
||||
|
||||
我们可以在functions.js中的`afterLoadData`进行处理。
|
||||
|
||||
``` js
|
||||
////// 读档事件后,载入事件前,可以执行的操作 //////
|
||||
"afterLoadData" : function(data) {
|
||||
// 读档事件后,载入事件前,可以执行的操作
|
||||
if (core.hasFlag("fengyin")) { // 如果存在封印(flag为真)
|
||||
core.material.enemys.blackKing.hp/=10; // 将怪物的血量变成原来的十分之一
|
||||
// ...
|
||||
}
|
||||
// 同样难度分歧可以类似写 if (core.getFlag('hard', 0)==3) {...
|
||||
}
|
||||
|
||||
// 在封印时,可以调用setValue将该flag置为真,然后调用自定义脚本 core.afterLoadData() 即可。
|
||||
"x,y": [ // 封印
|
||||
{"type": "setValue", "name": "flag:fengyin", "value": "true"},
|
||||
{"type": "function", "function": function() {
|
||||
core.afterLoadData();
|
||||
}}
|
||||
]
|
||||
```
|
||||
|
||||
## 战前剧情
|
||||
|
||||
@ -1361,7 +1404,7 @@ events.prototype.afterPushBox = function () {
|
||||
|
||||
``` js
|
||||
////// 不同难度分别设置初始属性 //////
|
||||
events.prototype.setInitData = function (hard) {
|
||||
"setInitData": function (hard) {
|
||||
if (hard=='Easy') { // 简单难度
|
||||
core.setFlag('hard', 1); // 可以用flag:hard来获得当前难度
|
||||
// 可以在此设置一些初始福利,比如设置初始生命值可以调用:
|
||||
@ -1386,7 +1429,7 @@ events.prototype.setInitData = function (hard) {
|
||||
|
||||
``` js
|
||||
////// 游戏获胜事件 //////
|
||||
events.prototype.win = function(reason) {
|
||||
"win": function(reason) {
|
||||
core.ui.closePanel();
|
||||
var replaying = core.status.replay.replaying;
|
||||
core.stopReplay();
|
||||
@ -1396,19 +1439,21 @@ events.prototype.win = function(reason) {
|
||||
core.drawText([
|
||||
"\t[恭喜通关]你的分数是${status:hp}。"
|
||||
], function () {
|
||||
core.events.gameOver('', replaying);
|
||||
core.events.gameOver(reason||'', replaying);
|
||||
})
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
其参数reason为获胜原因(即type:win事件里面的reason参数)。你可以在这里修改自己的获胜界面显示的文字。
|
||||
其参数reason为获胜原因(即type:win事件里面的reason参数)。
|
||||
|
||||
!> 如果reason不为空,则将会作为结局名!
|
||||
|
||||
当失败(`{"type": "lose"}`,或者被怪强制战斗打死、被领域怪扣血死、中毒导致扣血死,路障导致扣血死等等)事件发生时,将调用`events.js`中的`lose`事件。其直接显示一段文字,并重新开始游戏。
|
||||
|
||||
``` js
|
||||
////// 游戏失败事件 //////
|
||||
events.prototype.lose = function(reason) {
|
||||
"lose": function(reason) {
|
||||
core.ui.closePanel();
|
||||
var replaying = core.status.replay.replaying;
|
||||
core.stopReplay();
|
||||
@ -1424,26 +1469,6 @@ events.prototype.lose = function(reason) {
|
||||
|
||||
其参数reason为失败原因。你可以在这里修改失败界面时显示的文字。
|
||||
|
||||
如果要设置多种不同的结局,只需要在win的传参中把`core.events.gameOver('', replaying);`的空字符串改成具体的结局名。
|
||||
|
||||
例如:
|
||||
|
||||
``` js
|
||||
events.prototype.win = function(reason) { // 传入参数"reason"为结局名
|
||||
// ... 上略
|
||||
], function () {
|
||||
core.events.gameOver(reason, replaying); // 使用reason作为结局名
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
// 然后在事件可以调用
|
||||
{"type": "win", "reason": "TRUE END"}, // TE结局
|
||||
{"type": "win", "reason": "NORMAL END"} // NE结局
|
||||
```
|
||||
|
||||
上面这个例子中,我们直接把reason作为结局名的参数传入gameOver函数,这样的话就可以直接在{"type": "win"}中加上"reason"代表具体的结局。
|
||||
|
||||
==========================================================================================
|
||||
|
||||
[继续阅读下一章:个性化](personalization)
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 5.7 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 6.2 KiB |
@ -1,18 +1,37 @@
|
||||
# 个性化
|
||||
|
||||
?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} *
|
||||
?> 目前版本**v2.0**,上次更新时间:* {docsify-updated} *
|
||||
|
||||
有时候只靠样板本身可能是不够的。我们需要一些个性化、自定义的素材,道具效果,怪物属性,等等。
|
||||
|
||||
## 图层的说明
|
||||
|
||||
HTML5魔塔是使用画布(canvas)来绘制,存在若干个图层,它们之间有一个覆盖关系,后面的图层将覆盖前面的图层。
|
||||
|
||||
所有图层从低往高依次如下:
|
||||
|
||||
- bg:背景层;绘制地面素材,或者作为背景的图片素材
|
||||
- event:事件层;所有事件(道具、墙壁、NPC、怪物等)都绘制在这一层进行处理
|
||||
- hero:勇士层;主要用来绘制勇士
|
||||
- event2:事件2层;本层主要用来绘制48x32的图片素材的上半部分(避免和勇士错位),也可以用来绘制该层的前景图片素材
|
||||
- fg:显伤层;主要用来绘制怪物显伤和领域显伤
|
||||
- animate:动画层;主要用来绘制动画,图块的淡入/淡出效果,图块的移动。showImage事件绘制的图片也是在这一层。
|
||||
- weather:天气层;主要用来绘制天气(雨/雪)
|
||||
- curtain:色调层;用来控制当前楼层的画面色调
|
||||
- ui:UI层;用来绘制一切UI窗口,如剧情文本、怪物手册、楼传器、系统菜单等等
|
||||
- data:数据层;用来绘制一些顶层的或更新比较快的数据,如左上角的提示,战斗界面中数据的变化等等。
|
||||
|
||||
## 自定义素材
|
||||
|
||||
所有素材的图片都在`images`目录下。
|
||||
- `animates.png` 为所有动画效果。主要是星空熔岩,开门,毒网,传送门之类的效果。为四帧。
|
||||
- `autotile.png` 为Autotile块。
|
||||
- `enemys.png` 为所有怪物的图片。其对应的数字,从上至下依次是会从201开始计算(即,绿色史莱姆为201,小蝙蝠为205,依次类推)。请注意,动画效果为两帧,一般是原始四帧中的1和3。(四帧中12相同,34相同,因此只取1和3即可)
|
||||
- `enemys.png` 为所有怪物的图片。
|
||||
- `enemy48.png` 为所有48x32怪物的图片。
|
||||
- `heros.png` 为勇士行走图。
|
||||
- `items.png` 为所有道具的图标。
|
||||
- `npcs.png` 为所有NPC的图标,也是两帧。
|
||||
- `npcs.png` 为所有NPC的图标。
|
||||
- `npc48.png` 为所有48x32的NPC图标。
|
||||
- `terrains.png` 为所有地形的图标。
|
||||
|
||||
系统会读取`icon.js`文件,并获取每个ID对应的图标所在的位置。
|
||||
@ -23,38 +42,38 @@
|
||||
|
||||
如果你需要某个素材已经存在,则可以直接将其覆盖images目录下的同名文件,就能看到效果。
|
||||
|
||||
### 使用自己的图片作为某层楼的背景素材
|
||||
### 使用自己的图片作为某层楼的背景/前景素材
|
||||
|
||||
由于HTML5功能(素材)有限,导致了对很多比较复杂的素材(比如房子内)等无法有着较好的绘图方式。
|
||||
|
||||
为了解决这个问题,我们允许用户自己放置一张或多张图片作为某一层的背景素材。
|
||||
|
||||
要启用这个功能,我们首先需要在`main.js`中将可能的图片进行加载。
|
||||
要启用这个功能,我们首先需要在`data.js`中将可能的图片进行加载。
|
||||
|
||||
``` js
|
||||
this.images = [ // 在此存放所有可能使用的图片
|
||||
"images": [ // 在此存放所有可能使用的图片
|
||||
// 图片可以被作为背景图(的一部分),也可以直接用自定义事件进行显示。
|
||||
// 图片名不能使用中文,不能带空格或特殊字符;可以直接改名拼音就好
|
||||
// 建议对于较大的图片,在网上使用在线的“图片压缩工具(http://compresspng.com/zh/)”来进行压缩,以节省流量
|
||||
"bg.jpg", // 依次向后添加
|
||||
"bg.jpg", "house.png", "bed.png"// 依次向后添加
|
||||
];
|
||||
```
|
||||
|
||||
!> 请使用网上的一些[在线图片压缩工具](http://compresspng.com/zh/)对png图片进行压缩,以节省流量。一张500KB的png图片可以被压缩到20-30KB,显示效果不会有太大差异。
|
||||
!> 请使用网上的一些[在线图片压缩工具](http://compresspng.com/zh/)对图片进行压缩,以节省流量。
|
||||
|
||||
之后,我们可以在每层剧本的`"images"`里来定义该层的默认背景图片素材。
|
||||
|
||||
``` js
|
||||
"png": [[x,y,"bg.jpg"]], // 背景图;你可以选择一张或多张图片来作为背景素材。
|
||||
"png": [], // 无任何背景图
|
||||
"png": [[1,1,"house"], [6,7,"house2"]] // 在(1,1)放一个house.png,且(6,7)放house2.png
|
||||
"images": [[x,y,"bg.jpg",false]], // 背景图;你可以选择一张或多张图片来作为背景/前景素材。
|
||||
"images": [], // 无任何背景图
|
||||
"images": [[1,1,"house.png",false], [6,7,"bed.png",true]] // 在(1,1)放一个house.png在背景层,且(6,7)放bed.png在前景层
|
||||
```
|
||||
|
||||
png为一个数组,代表当前层所有作为背景素材的图片信息。
|
||||
images为一个数组,代表当前层所有作为背景素材的图片信息。
|
||||
|
||||
每一项为一个三元组,分别为该背景素材的x,y和图片名。其中x和y分别为横纵坐标,在0-12之间;图片名则必须在上面的this.images中定义过。
|
||||
每一项为一个四元组,分别为该背景素材的x,y,图片名和是否为前景。其中x和y分别为横纵坐标,在0-12之间;图片名则必须在上面的images中定义过。
|
||||
|
||||
你的图片背景素材将会覆盖原来本身的背景层。
|
||||
如果第四项为true,则会在前景层(event2)上绘制,能覆盖勇士,常常用来作为柱子的上半部分等情况。
|
||||
|
||||
**如果你需要让某些点不可通行(比如你建了个房子,墙壁和家具等位置不让通行),则需在`events`中指定`{"noPass": false}`,参见[自定义事件](event#自定义事件)的写法。
|
||||
|
||||
@ -82,6 +101,8 @@ png为一个数组,代表当前层所有作为背景素材的图片信息。
|
||||
|
||||
这是因为,该素材没有被定义,无法被游戏所识别。
|
||||
|
||||
!> 在V2.0中,我们可以简单的在地图编辑器中新增素材的ID和数字,但是仍然**强烈建议**对素材的机制进行了解。
|
||||
|
||||
#### 素材的机制
|
||||
|
||||
本塔所有的素材都拥有三个属性:**ID**,**索引**,**数字**。
|
||||
@ -91,7 +112,7 @@ png为一个数组,代表当前层所有作为背景素材的图片信息。
|
||||
|
||||
**`ID-索引` 对应关系定义在icons.js文件中。该文件将唯一确定一个ID在图片上所在的位置。**
|
||||
|
||||
**`ID-数字` 对应关系定义在maps.js文件的getBlock函数中。该函数将唯一确定一个ID对应的数字是多少。**
|
||||
**`ID-数字` 对应关系定义在maps.js文件中。该函数将唯一确定一个ID对应的数字是多少。**
|
||||
|
||||
如果需要添加一个素材到游戏,则必须为其分配一个唯一标识符,并同时修改`icons.js`和`maps.js`两个文件。
|
||||
|
||||
@ -106,7 +127,7 @@ png为一个数组,代表当前层所有作为背景素材的图片信息。
|
||||
3. 修改对应楼层的剧本文件的`defaultGround`项,改成新的ID。
|
||||
|
||||
**如果你要在游戏内使用本地形,则操作如下:**
|
||||
3. 指定一个数字,在maps.js的getBlock函数下类似进行添加。
|
||||
3. 指定一个数字,在maps.js中类似进行添加。
|
||||
|
||||
#### 新添加Autotile
|
||||
|
||||
@ -114,24 +135,26 @@ png为一个数组,代表当前层所有作为背景素材的图片信息。
|
||||
|
||||
1. 将新的Autotile图片复制到images目录下。
|
||||
2. 进入icons.js,在autotile分类下进行添加该文件的名称,索引简单的写0。
|
||||
3. 指定一个数字,在maps.js的getBlock函数下类似进行添加。
|
||||
3. 指定一个数字,在maps.js中类似进行添加。
|
||||
|
||||
!> Autotile的ID和文件名完全相同!且其ID/文件名不能含有中文、空格或特殊字符。
|
||||
|
||||
!> V2.0版本不能在地图编辑器中添加Autotile,请按上面的操作来执行。
|
||||
|
||||
#### 新添加道具
|
||||
|
||||
如果你需要新增一个未被定义的道具:
|
||||
|
||||
1. 指定一个唯一的英文ID,不能和现有的重复。
|
||||
2. 进入icons.js,在items分类下进行添加索引(对应图标在图片上的位置,即index)
|
||||
3. 指定一个数字,在maps.js的getBlock下类似进行添加。
|
||||
3. 指定一个数字,在maps.js中类似进行添加。
|
||||
4. 在items.js中仿照其他道具,来添加道具的信息。
|
||||
|
||||
有关如何自行实现一个道具的效果,参见[自定义道具效果](#自定义道具效果)。
|
||||
|
||||
#### 新添加怪物
|
||||
|
||||
如果我们需要新添加怪物,请在enemys.png中新增一行,然后复制粘贴上四帧怪物图的**1和3帧**。
|
||||
如果我们需要新添加怪物,请在enemys.png中新增一行。
|
||||
|
||||
你可以通过便捷PS工具的“更改色相”来将红头怪变成橙头怪等。
|
||||
|
||||
@ -139,9 +162,11 @@ png为一个数组,代表当前层所有作为背景素材的图片信息。
|
||||
|
||||
1. 指定一个唯一的英文ID,不能和enemys中现有的重复。
|
||||
2. 进入icons.js,在enemys分类下进行添加索引(对应图标在图片上的位置,即index)
|
||||
3. 在maps.js的getBlock下继续进行添加。请注意其ID为200开始的顺序,即如果新增一行为261,依次类推
|
||||
3. 在maps.js中继续进行添加。
|
||||
4. 在enemys.js中仿照其他怪物,来添加怪物的信息。
|
||||
|
||||
!> 如果是48x32的怪物素材,请放在enemy48.png中,然后在icons.js的enemy48下添加索引。
|
||||
|
||||
有关如何自行实现一个怪物的特殊属性或伤害计算公式,参见[怪物的特殊属性](#怪物的特殊属性)。
|
||||
|
||||
#### 新添加NPC
|
||||
@ -150,6 +175,8 @@ png为一个数组,代表当前层所有作为背景素材的图片信息。
|
||||
2. 进入icons.js,在npcs分类下进行添加索引(对应图标在图片上的位置,即index)
|
||||
3. 指定一个数字,在maps.js的getBlock下类似进行添加。
|
||||
|
||||
!> 如果是48x32的怪物素材,请放在npc48.png中,然后在icons.js的npc48下添加索引。
|
||||
|
||||
### 地图生成器使用自定义素材
|
||||
|
||||
地图生成器是直接从js文件中读取数字-图标对应关系的。
|
||||
@ -166,30 +193,24 @@ png为一个数组,代表当前层所有作为背景素材的图片信息。
|
||||
|
||||
对于即捡即用类道具,如宝石、血瓶、剑盾等,我们可以简单地修改`data.js`中的value一栏即可。
|
||||
|
||||
如果你有更高级的需求(例如每个区域的效果不同),则需要编辑`items.js`文件。具体方式是:
|
||||
如果你想要同种宝石在不同层效果不同的话,可以进行如下操作:
|
||||
|
||||
1. 在楼层的item_ratio中定义宝石的比率(比如1-10的写1,11-20层写2等)
|
||||
2. 修改获得道具的itemEffect函数(在items.js中的itemEffect中编辑,V2.0中也可以使用编辑器)
|
||||
|
||||
1. 找到`getItemEffect`函数;所有即捡即用类道具的效果都在这里实现。
|
||||
2. 算道具效果系数,或应该增加的值。
|
||||
``` js
|
||||
items.prototype.getItemEffect = function(itemId, itemNum) {
|
||||
var itemCls = core.material.items[itemId].cls;
|
||||
// 消耗品
|
||||
if (itemCls === 'items') {
|
||||
var floor = parseInt(core.status.thisMap.name); // 获得当前楼层。此name和剧本中的name完全一致。
|
||||
var ratio = 1; // 道具效果系数
|
||||
if (floor>=11 && floor<=20 ) ratio = 2; // 11-20F(二区),道具效果翻倍
|
||||
if (floor>=21 && floor<=30 ) ratio = 3; // 21-30F(二区),道具效果三倍
|
||||
// ... 根据自己的需要来写
|
||||
|
||||
if (itemId === 'redJewel') core.status.hero.atk += core.values.redJewel * ratio; // 将初始效果乘以倍数
|
||||
if (itemId === 'blueJewel') core.status.hero.def += core.values.blueJewel * ratio; // 将初始效果乘以倍数
|
||||
if (itemId === 'greenJewel') core.status.hero.mdef += core.values.greenJewel * ratio; // 将初始效果乘以倍数
|
||||
if (itemId == 'yellowJewel') { // 黄宝石属性:需自己定义
|
||||
// ... 下略
|
||||
// ratio为楼层的item_ratio值,可以进行翻倍宝石属性
|
||||
core.status.hero.atk += core.values.redJewel * ratio
|
||||
```
|
||||
3. 修改同样修改下面的`getItemEffectTip`函数,使提示文字相应变动。
|
||||
|
||||
!> **请注意这里`core.status.thisMap.name`获取的是当前层中,你在剧本文件里写的name那一项(即状态栏中的层数显示)。然后可以通过几个简单的if来判断应该增加的值。**
|
||||
这里我们可以直接写ratio来取用该楼层中定义的`item_ratio`的值。
|
||||
|
||||
如果不是倍数增加(比如线性增加)也可以类似来写
|
||||
|
||||
``` js
|
||||
// 一个二倍线性增加的例子
|
||||
core.status.hero.atk += core.values.redJewel + 2*ratio
|
||||
```
|
||||
|
||||
### 消耗类道具(cls: tools);永久类道具(cls: constants)
|
||||
|
||||
@ -212,12 +233,10 @@ events.prototype.passNet = function (data) {
|
||||
|
||||
### 实战!拿到神圣盾后免疫吸血、领域、夹击效果
|
||||
|
||||
1. 在getItemEffect中修改拿到神圣盾时的效果,标记一个自定义Flag。
|
||||
1. 在itemEffect中修改拿到神圣盾时的效果,标记一个自定义Flag。
|
||||
``` js
|
||||
if (itemId === 'shield5') {
|
||||
core.status.hero.def += core.values.shield5;
|
||||
core.setFlag("shield5", true); // 增加一个自定义Flag:已经拿到神圣盾
|
||||
}
|
||||
core.status.hero.def += core.values.shield5 * ratio;
|
||||
core.setFlag("shield5", true); // 增加一个自定义Flag:已经拿到神圣盾
|
||||
```
|
||||
2. 免疫吸血效果:在`enemys.js`的伤害计算中,编辑成如果存在神圣盾标记,吸血伤害为0。
|
||||
``` js
|
||||
@ -239,10 +258,10 @@ enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, her
|
||||
}
|
||||
// ... 下略
|
||||
```
|
||||
3. 免疫领域、夹击、阻击效果:在`core.js`中,找到checkBlock函数,并编辑成如果有神圣盾标记,则将伤害变成0。
|
||||
3. 免疫领域、夹击、阻击效果:在`control.js`中,找到checkBlock函数,并编辑成如果有神圣盾标记,则将伤害变成0。
|
||||
``` js
|
||||
// 检查领域、夹击、阻击事件
|
||||
core.prototype.checkBlock = function () {
|
||||
control.prototype.checkBlock = function () {
|
||||
var x=core.getHeroLoc('x'), y=core.getHeroLoc('y');
|
||||
var damage = core.status.checkBlock.damage[13*x+y];
|
||||
if (damage>0) {
|
||||
@ -269,9 +288,9 @@ core.prototype.checkBlock = function () {
|
||||
|
||||
如果要修改伤害计算公式,请修改下面的calDamage函数。请注意,如果无法战斗,该函数必须返回`999999999`。
|
||||
|
||||
对于毒衰弱怪物的战斗后结算在`events.js`中的afterBattle函数中。
|
||||
对于毒衰弱怪物的战斗后结算在`functions.js`中的afterBattle函数中。
|
||||
|
||||
对于领域、夹击、阻击怪物的检查在`events.js`中的checkBlock函数中。
|
||||
对于领域、夹击、阻击怪物的检查在`control.js`中的checkBlock函数中。
|
||||
|
||||
`getCritical`, `getCriticalDamage`和`getDefDamage`三个函数依次计算的是该怪物的临界值、临界减伤和1防减伤。也可以适当进行修改。
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 快速上手
|
||||
|
||||
?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} *
|
||||
?> 目前版本**v2.0**,上次更新时间:* {docsify-updated} *
|
||||
|
||||
在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔!
|
||||
|
||||
@ -12,9 +12,18 @@
|
||||
- Chrome浏览器。其他浏览器可能会导致本地服务器产生闪退等现象。
|
||||
- 一个很好的文本编辑器。推荐带有高亮染色、错误提示等效果。例如:WebStorm,VSCode,或者至少也要Sublime Text。
|
||||
- ([VSCode下载地址](https://code.visualstudio.com/),群里的群文件中也有,强烈推荐之。)
|
||||
- **2.0版本可以不需要,但是仍然强烈推荐有一个,从而能对H5造塔有更深的了解。**
|
||||
|
||||
只要满足了上述条件,你就可以开始做自己的塔啦!
|
||||
|
||||
## V2.0的使用
|
||||
|
||||
目前版本已经更新到V2.0,在2.0版本中,我们可以进行全GUI造塔。
|
||||
|
||||
下面的文档主要是讲如何通过代码编辑的方式来造,仍然强烈建议进行阅读从而有着一定的了解。
|
||||
|
||||
如果想直接知道如何在V2.0造塔,可以直接参见[V2.0版本介绍](V2.0)的说明,或者看[B站视频教程](http://www.bilibili.com/video/av17608025/)。
|
||||
|
||||
## 启动HTTP服务
|
||||
|
||||
在根目录下有一个“启动服务.exe”,运行之。
|
||||
@ -25,6 +34,7 @@
|
||||
* “地图编辑器”允许你以可视化的方式进行编辑地图。
|
||||
* “便捷PS工具”能让你很方便的对自定义素材进行添加。参见[自定义素材](personalization#自定义素材)。
|
||||
* “地图生成器”能让你从已有的截图(如RMXP项目)中立刻生成可被本样板识别的地图数据。
|
||||
* “RM动画导出器”能让你从RMXP中导出动画而被H5魔塔使用。
|
||||
* “JS代码压缩工具”能对JS代码进行压缩,从而减少IO请求数和文件大小。
|
||||
* “伤害和临界值计算器”是一个很便捷的小工具,能对怪物的伤害和临界值进行计算。
|
||||
|
||||
@ -34,7 +44,7 @@
|
||||
|
||||
类似于RMXP,本塔每层楼都是一个“剧本”,剧本内主要定义了本层的地图和各种事件。主函数将读取每个剧本,并生成实际的地图供游戏使用。
|
||||
|
||||
我们打开 `libs/floors/` 目录,这个目录是所有剧本的目录。我们需要指定一个楼层名,例如MT1;然后,我们可以将`MT0.js`(模板)复制重命名为为`MT1.js`,并使用文本编辑器打开。
|
||||
我们打开 `project/floors/` 目录,这个目录是所有剧本的目录。我们需要指定一个楼层名,例如MT1;然后,我们可以将`MT0.js`(模板)复制重命名为为`MT1.js`,并使用文本编辑器打开。
|
||||
|
||||

|
||||
|
||||
@ -43,11 +53,14 @@
|
||||
具体样板文件的每个要素如下:
|
||||
- **`floorId`** 楼层唯一标识符;必须和文件名,以及 `main.floors.xxx` 完全一致
|
||||
- **`title`** 楼层中文名,将在切换楼层时进行显示
|
||||
- **`name`** 楼层再状态栏显示的名称
|
||||
- **`canFlyTo`** 当前楼层可否被楼传器飞到。如果该层不能飞到,则也在该层也不允许使用楼传器。
|
||||
- **`canUseQuickShop`** 当前楼层可否使用快捷商店。
|
||||
- **`defaultGround`** 该层的背景(地面)素材。需要是在`icon.js`里`terrains`中定义的一个ID,如`ground`, `grass2`等等。
|
||||
- **`color`** 该层的画面色调。本项可选,如果不写则色调为默认值(无色调),否则是一个RGBA数组,比如`[255,0,0,0.3]`等。
|
||||
- **`defaultGround`** 该层的背景(地面)素材。
|
||||
- **`images`** 该层默认显示的前景/背景图片
|
||||
- **`color`** 该层的画面色调。
|
||||
- **`bgm`** 到达该层后默认播放的BGM。本项可忽略。
|
||||
- **`item_ratio`** 该层的宝石/血瓶倍率
|
||||
- **`map`** 本层地图,需要是13x13数组,建议使用地图生成器或者可视化地图编辑器制作。
|
||||
- **`firstArrive`** 第一次到该楼层触发的事件
|
||||
- **`events`** 该楼的所有可能事件列表
|
||||
@ -55,6 +68,7 @@
|
||||
- **`afterBattle`** 战斗后可能触发的事件列表
|
||||
- **`afterGetItem`** 获得道具后可能触发的事件列表
|
||||
- **`afterOpenDoor`** 开完门后可能触发的事件列表
|
||||
- **`cannotMove`** 每个图块不可通行的方向,也就是悬崖效果
|
||||
|
||||
我们最终的任务其实是,将每个楼层的剧本(地图&事件)给写完即可。
|
||||
|
||||
@ -72,12 +86,14 @@
|
||||
|
||||
然后可以在上面任意进行绘制地图。
|
||||
|
||||
!> **如果地图的数字和ID未被定义,则会进行提示:数字和ID未被定义!此时可能需要手动在icons.js和maps.js中定义对应的数字和ID。请参见[自定义素材](personalization#自定义素材)。**
|
||||
!> **如果地图的数字和ID未被定义,则会进行提示:数字和ID未被定义!此时要对素材的ID和数字进行定义,请参见[自定义素材](personalization#自定义素材)。**
|
||||
|
||||
绘制地图完毕后,点击"导出地图",即可在左边看到对应的JSON数组,并且已经复制到了剪切板。将其粘贴到剧本中的map位置即可。
|
||||
|
||||

|
||||
|
||||
!> V2.0版本可以直接将当前地图进行保存或另存为,不需要这样手动打开进行编辑。
|
||||
|
||||
### 从RMXP导入已有的地图
|
||||
|
||||
如果我们想复刻一个现有的,已经被RMXP所制作的塔,也有很便捷的方式,那就是用到我们的“地图生成器”。
|
||||
@ -117,6 +133,8 @@
|
||||
|
||||
我们打开`data.js`文件,这里面定义了各种全局属性和勇士初始值。
|
||||
|
||||
!> V2.0版本可以直接在地图编辑器的`全塔属性`中进行修改!
|
||||
|
||||
我们可以将本塔标题改名为“1层小塔”,
|
||||
|
||||
游戏的唯一标识符叫onefloor,然后可以直接修改勇士的各项初始数据.
|
||||
@ -139,12 +157,12 @@
|
||||
|
||||
其他的几项暂时不会被涉及到,因此不用考虑。
|
||||
|
||||
全局变量修改完毕后,我们需要告诉主函数加载该楼层。打开`main.js`(该文件和index.html同级),找到`this.floorIds`项,将其值改为楼层ID即MT1。
|
||||
|
||||

|
||||
全局变量修改完毕后,我们需要告诉主函数加载该楼层。打开`data.js`,找到`floorIds`项,将其值改为楼层ID即MT1。
|
||||
|
||||
最后一步就是录入怪物数据。打开`enemys.js`文件,依次输入你在本塔内使用到的所有怪物的攻防血的数据。其中怪物的特殊属性(special项)与该文件下面的getSpecialText对应。
|
||||
|
||||
!> V2.0版本可以直接在“图块属性”一栏进行修改怪物属性!
|
||||
|
||||

|
||||
|
||||
只需要修改自己用到的怪物属性即可,其他没有用到的怪物完全无所谓。
|
||||
@ -177,7 +195,7 @@
|
||||
|
||||
1. 截图请务必刚好截取13x13的图片,并需要保证每个位置必须为32x32像素。一般无放缩的RMXP符合条件。
|
||||
2. 游戏的唯一标识符name请务必修改。如果不修改可能会导致存档出现异常。
|
||||
3. 别忘了main.js中要修改floorIds指明所用到的所有楼层哦~
|
||||
3. 别忘了data.js中要修改floorIds指明所用到的所有楼层哦~
|
||||
|
||||
下面是几个常见的FAQ:
|
||||
|
||||
|
||||
@ -9,7 +9,7 @@ main.floors.MT0 =
|
||||
"canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器)
|
||||
"canUseQuickShop": true, // 该层是否允许使用快捷商店
|
||||
"defaultGround": "ground", // 默认地面的图块ID(terrains中)
|
||||
"png": [], // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。
|
||||
"images": [], // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。
|
||||
// "color": [0,0,0,0.3], // 该层的默认画面色调。本项可不写(代表无色调),如果写需要是一个RGBA数组。
|
||||
// "weather": ["snow",5], // 该层的默认天气。本项可忽略表示晴天,如果写则第一项为"rain"或"snow"代表雨雪,第二项为1-10之间的数代表强度。
|
||||
// "bgm": "bgm.mp3", // 到达该层后默认播放的BGM。本项可忽略。
|
||||
|
||||
@ -9,7 +9,7 @@ main.floors.sample0 =
|
||||
"canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器)
|
||||
"canUseQuickShop": true, // 该层是否允许使用快捷商店
|
||||
"defaultGround": "ground", // 默认地面的图块ID(terrains中)
|
||||
"png": [], // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。
|
||||
"images": [], // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。
|
||||
// "color": [0,0,0,0.3] // 该层的默认画面色调。本项可不写(代表无色调),如果写需要是一个RGBA数组。
|
||||
// "weather": ["snow",5], // 该层的默认天气。本项可忽略表示晴天,如果写则第一项为"rain"或"snow"代表雨雪,第二项为1-10之间的数代表强度。
|
||||
"bgm": "bgm.mp3", // 到达该层后默认播放的BGM。本项可忽略。
|
||||
|
||||
@ -9,7 +9,7 @@ main.floors.sample1 =
|
||||
"canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器)
|
||||
"canUseQuickShop": true, // 该层是否允许使用快捷商店
|
||||
"defaultGround": "grass", // 默认地面的图块ID(terrains中)
|
||||
"images": [[0,0,"bg.jpg",false]], // // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。
|
||||
"images": [[0,0,"bg.jpg",false]], // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。
|
||||
// "color": [0,0,0,0.3] // 该层的默认画面色调。本项可不写(代表无色调),如果写需要是一个RGBA数组。
|
||||
"weather": ["snow",6], // 该层的默认天气。本项可忽略表示晴天,如果写则第一项为"rain"或"snow"代表雨雪,第二项为1-10之间的数代表强度。
|
||||
// "bgm": "bgm.mp3", // 到达该层后默认播放的BGM。本项可忽略。
|
||||
|
||||
@ -9,7 +9,7 @@ main.floors.sample2 =
|
||||
"canFlyTo": false, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器)
|
||||
"canUseQuickShop": true, // 该层是否允许使用快捷商店
|
||||
"defaultGround": "snowGround", // 默认地面的图块ID(terrains中)
|
||||
"png": [], // // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。
|
||||
"images": [], // // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。
|
||||
"color": [255,0,0,0.3], // 该层的默认画面色调。本项可不写(代表无色调),如果写需要是一个RGBA数组。
|
||||
"weather": ["rain",10], // 该层的默认天气。本项可忽略表示晴天,如果写则第一项为"rain"或"snow"代表雨雪,第二项为1-10之间的数代表强度。
|
||||
"bgm": "qianjin.mid", // 到达该层后默认播放的BGM。本项可忽略。
|
||||
|
||||
Loading…
Reference in New Issue
Block a user