V2.0 Docs

This commit is contained in:
oc 2018-03-14 00:22:34 +08:00
parent 72d140d4c9
commit 55e153928b
13 changed files with 268 additions and 165 deletions

89
docs/V2.0.md Normal file
View 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素材的支持在这里将不再赘述请仔细阅读前面的几个文档进行了解。

View File

@ -3,4 +3,5 @@
- [元件说明](element)
- [事件](event)
- [个性化](personalization)
- [V2.0版本介绍](V2.0)
- [附录API列表](api)

View File

@ -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`

View File

@ -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代表实际连击数
![怪物退化](./img/tuihua.png)
固伤怪则需要在后面增加`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]** 快捷使用炸弹/圣锤

View File

@ -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

View File

@ -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色调层用来控制当前楼层的画面色调
- uiUI层用来绘制一切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为一个数组,代表当前层所有作为背景素材的图片信息。
每一项为一个三元组分别为该背景素材的xy和图片名。其中x和y分别为横纵坐标在0-12之间图片名则必须在上面的this.images中定义过。
每一项为一个四元组分别为该背景素材的xy图片名和是否为前景。其中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的写111-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防减伤。也可以适当进行修改。

View File

@ -1,6 +1,6 @@
# 快速上手
?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} *
?> 目前版本**v2.0**,上次更新时间:* {docsify-updated} *
在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔!
@ -12,9 +12,18 @@
- Chrome浏览器。其他浏览器可能会导致本地服务器产生闪退等现象。
- 一个很好的文本编辑器。推荐带有高亮染色、错误提示等效果。例如WebStormVSCode或者至少也要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`,并使用文本编辑器打开。
![新建剧本](./img/script.png)
@ -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位置即可。
![地图数组](./img/maparray.png)
!> 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。
![修改楼层数据](./img/floordata.png)
全局变量修改完毕后,我们需要告诉主函数加载该楼层。打开`data.js`,找到`floorIds`项将其值改为楼层ID即MT1。
最后一步就是录入怪物数据。打开`enemys.js`文件依次输入你在本塔内使用到的所有怪物的攻防血的数据。其中怪物的特殊属性special项与该文件下面的getSpecialText对应。
!> V2.0版本可以直接在“图块属性”一栏进行修改怪物属性!
![怪物数据](./img/enemyarray.png)
只需要修改自己用到的怪物属性即可,其他没有用到的怪物完全无所谓。
@ -177,7 +195,7 @@
1. 截图请务必刚好截取13x13的图片并需要保证每个位置必须为32x32像素。一般无放缩的RMXP符合条件。
2. 游戏的唯一标识符name请务必修改。如果不修改可能会导致存档出现异常。
3. 别忘了main.js中要修改floorIds指明所用到的所有楼层哦~
3. 别忘了data.js中要修改floorIds指明所用到的所有楼层哦~
下面是几个常见的FAQ

View File

@ -9,7 +9,7 @@ main.floors.MT0 =
"canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器)
"canUseQuickShop": true, // 该层是否允许使用快捷商店
"defaultGround": "ground", // 默认地面的图块IDterrains中
"png": [], // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。
"images": [], // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。
// "color": [0,0,0,0.3], // 该层的默认画面色调。本项可不写代表无色调如果写需要是一个RGBA数组。
// "weather": ["snow",5], // 该层的默认天气。本项可忽略表示晴天,如果写则第一项为"rain"或"snow"代表雨雪第二项为1-10之间的数代表强度。
// "bgm": "bgm.mp3", // 到达该层后默认播放的BGM。本项可忽略。

View File

@ -9,7 +9,7 @@ main.floors.sample0 =
"canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器)
"canUseQuickShop": true, // 该层是否允许使用快捷商店
"defaultGround": "ground", // 默认地面的图块IDterrains中
"png": [], // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。
"images": [], // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。
// "color": [0,0,0,0.3] // 该层的默认画面色调。本项可不写代表无色调如果写需要是一个RGBA数组。
// "weather": ["snow",5], // 该层的默认天气。本项可忽略表示晴天,如果写则第一项为"rain"或"snow"代表雨雪第二项为1-10之间的数代表强度。
"bgm": "bgm.mp3", // 到达该层后默认播放的BGM。本项可忽略。

View File

@ -9,7 +9,7 @@ main.floors.sample1 =
"canFlyTo": true, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器)
"canUseQuickShop": true, // 该层是否允许使用快捷商店
"defaultGround": "grass", // 默认地面的图块IDterrains中
"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。本项可忽略。

View File

@ -9,7 +9,7 @@ main.floors.sample2 =
"canFlyTo": false, // 该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器)
"canUseQuickShop": true, // 该层是否允许使用快捷商店
"defaultGround": "snowGround", // 默认地面的图块IDterrains中
"png": [], // // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。
"images": [], // // 该层默认显示的所有图片;详细用法请查看文档“自定义素材”中的说明。
"color": [255,0,0,0.3], // 该层的默认画面色调。本项可不写代表无色调如果写需要是一个RGBA数组。
"weather": ["rain",10], // 该层的默认天气。本项可忽略表示晴天,如果写则第一项为"rain"或"snow"代表雨雪第二项为1-10之间的数代表强度。
"bgm": "qianjin.mid", // 到达该层后默认播放的BGM。本项可忽略。