This commit is contained in:
oc 2018-02-09 21:06:55 +08:00
parent c0fcbea201
commit b65e5dcfbb
11 changed files with 116 additions and 23 deletions

View File

@ -47,6 +47,16 @@ HTML5 canvas制作的魔塔样板支持全平台游戏
## 更新说明
### 2018.2.9 V1.4.1
* [x] 改变图块setBlock事件
* [x] 同一个点的多事件处理(做法详见文档)。
* [x] 地图中每个块的可通行方向控制(悬崖效果)。
* [x] 动画支持带旋转和翻转的帧。
* [x] 现在可以允许用户丢弃道具了(例如不会再使用的装备)。
* [x] 修复行走时按键会发生动画抖动问题。
* [x] 修复无法打开战斗动画的Bug。
### 2018.2.6 V1.4
* [x] 支持动画。

View File

@ -1,6 +1,6 @@
# 附录:API列表
?> 目前版本**v1.4**,上次更新时间:* {docsify-updated} *
?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} *
所有系统支持的API都列在了这里。所有可能被用到的API都在前面用\*标记。

View File

@ -1,6 +1,6 @@
# 元件说明
?> 目前版本**v1.4**,上次更新时间:* {docsify-updated} *
?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} *
在本章中,将对样板里的各个元件进行说明。各个元件主要包括道具、门、怪物、楼梯等等。

View File

@ -1,6 +1,6 @@
# 事件
?> 目前版本**v1.4**,上次更新时间:* {docsify-updated} *
?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} *
本章内将对样板所支持的事件进行介绍。
@ -440,8 +440,10 @@ number为**要更改到的数字**,有关“数字”的定义详见参见[素
图块更改后:
- 其启用/禁用状态不会发生任何改变。原来是启用还是启用,原来是禁用还是禁用。
- 可通行状态遵循覆盖原则,即**取该图块的默认noPass属性如果剧本的events中定义该点的noPass则覆盖**。
- 其触发器(trigger)亦采用覆盖原则,即**取该图块的默认触发器例如怪物是battle道具是getItem门是openDoor如果剧本的events中定义了该点的trigger则覆盖**。
- 可通行状态遵循覆盖原则,即**首先取该图块的默认noPass属性如果剧本的events中定义该点的noPass则覆盖**。
- 触发器(trigger)亦采用覆盖原则,即**首先取该图块的默认触发器例如怪物是battle道具是getItem门是openDoor如果剧本的events中定义了该点的trigger则覆盖**。
图块更改往往与[同一个点的多事件处理](#同一个点的多事件处理)相关。
### update: 立刻更新状态栏和地图显伤
@ -926,6 +928,81 @@ core.insertAction(list) //往当前事件列表中插入一系列事件。使用
// ……
```
## 同一个点的多事件处理
我们可以发现,就目前而且,每个点的事件是和该点进行绑定,并以该点坐标作为唯一索引来查询。
而有时候,我们往往需要在同一个点存在多个不同的事件。这涉及到同一个点的多事件处理。
我们可以依靠两来实现。**`setBlock`事件**和**if+flag的条件判断**。
下面以几个具体例子来进行详细说明。
### 打怪掉宝(怪物->道具)
我们注意到怪物和道具都是系统默认事件因此无需写events而是直接在afterBattle中setBlock即可。
``` js
"afterBattle": {
"x,y": [
{"type": "setBlock", "number": 21} // 变成黄钥匙。注意是当前点因此可省略floorId和loc
]
}
```
### 打怪变成可对话的NPC怪物->NPC
由于NPC是自定义事件因此我们需要写events。注意到events中不覆盖trigger则还是怪物时存在系统trigger因此会战斗变成NPC后没有系统trigger因此会触发自定义事件。
``` js
"events": {
"x,y": [
"可对话的NPC"
]
},
"afterBattle": {
"x,y": [
{"type": "setBlock", "number": 121} // 变成老人
]
}
```
### 获得圣水后变成墙
这个例子要求获得圣水时不前进(也就是不能走到圣水地方),然后把圣水位置变成墙。
因此需要我们需要覆盖系统triggergetItem并覆盖noPass。
通过if来判断有没有获得圣水没有则触发圣水生命x2然后变成墙否则不执行。
``` js
"events": {
"x,y": {
"trigger": "action", // 覆盖系统trigger默认的getItem不会执行
"noPass": true, // 覆盖可通行状态,不允许走到该点
"data": [
{"type": "if", "condition": "flag:hasSuperPotion", // 条件判断:是否喝过圣水
"true": [], // 喝过了,不执行
"false": [
{"type":"setValue", "name":"status:hp", "value":"status:hp*2"}, // 生命翻倍
{"type":"setBlock", "number": 1}, // 将该点变成墙
{"type":"setValue", "name":"flag:hasSuperPotion", "value": "true"} // 标记已经喝过了
]
}
]
]
}
```
总之,记住如下两点:
- 可以使用setBlock来更改一个图块。
- 可通行状态遵循覆盖原则,即**首先取该图块的默认noPass属性如果剧本的events中定义该点的noPass则覆盖**。
- 触发器(trigger)亦采用覆盖原则,即**首先取该图块的默认触发器例如怪物是battle道具是getItem门是openDoor如果剧本的events中定义了该点的trigger则覆盖**。
- 可以通过if语句和flag来控制自定义事件具体走向哪个分支。
- 如果弄不清楚系统trigger和自定义事件等的区别也可以全部覆盖为自定义事件然后通过type:battletype:openDoor等来具体进行控制。
## 加点事件
打败怪物后可以进行加点。

View File

@ -1,6 +1,6 @@
# HTML5 魔塔样板说明文档
?> 目前版本**v1.4**,上次更新时间:* {docsify-updated} *
?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} *
众所周知魔塔的趋势是向移动端发展贴吧中也常常能见到“求手机魔塔”的帖子。然而现有的工具中NekoRPG有着比较大的局限性游戏感较差更是完全没法在iOS上运行。而一些APP的魔塔虽然可用但是必须要下载安装对于Android和iOS还必须开发不同的版本非常麻烦。

View File

@ -1,6 +1,6 @@
# 个性化
?> 目前版本**v1.4**,上次更新时间:* {docsify-updated} *
?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} *
有时候只靠样板本身可能是不够的。我们需要一些个性化、自定义的素材,道具效果,怪物属性,等等。
@ -221,15 +221,23 @@ if (itemId === 'shield5') {
core.setFlag("shield5", true); // 增加一个自定义Flag已经拿到神圣盾
}
```
2. 免疫吸血效果:在`enemys.js`的getExtraDamage函数中编辑成如果存在神圣盾标记额外伤害为0。
2. 免疫吸血效果:在`enemys.js`的伤害计算中,编辑成如果存在神圣盾标记,吸血伤害为0。
``` js
enemys.prototype.getExtraDamage = function (monster) {
var extra_damage = 0;
if (this.hasSpecial(monster.special, 11)) { // 吸血
// 吸血的比例
extra_damage = core.status.hero.hp * monster.value;
if (core.hasFlag("shield5")) extra_damage = 0; // 如果存在神圣盾,则免疫吸血
extra_damage = parseInt(extra_damage);
enemys.prototype.calDamage = function (monster, hero_hp, hero_atk, hero_def, hero_mdef) {
// ... 上略
// 吸血
if (this.hasSpecial(mon_special, 11)) {
var vampireDamage = hero_hp * monster.value;
// 如果有神圣盾免疫吸血等可以在这里写
if (core.hasFlag("shield5")) vampireDamage = 0; // 存在神圣盾吸血伤害为0
vampireDamage = parseInt(vampireDamage);
// 加到自身
if (monster.add) // 如果加到自身
mon_hp += vampireDamage;
initDamage += vampireDamage;
}
// ... 下略
```
@ -263,8 +271,6 @@ core.prototype.checkBlock = function () {
如果要修改伤害计算公式请修改下面的calDamage函数。请注意如果无法战斗该函数必须返回`999999999`。
对于吸血怪的额外伤害计算在getExtraDamage中。
对于毒衰弱怪物的战斗后结算在`events.js`中的afterBattle函数中。
对于领域、夹击、阻击怪物的检查在`events.js`中的checkBlock函数中。

View File

@ -1,6 +1,6 @@
# 快速上手
?> 目前版本**v1.4**,上次更新时间:* {docsify-updated} *
?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} *
在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔!

View File

@ -6,7 +6,7 @@ data.prototype.init = function() {
this.firstData = {
"title": "魔塔样板", // 游戏名,将显示在标题页面以及切换楼层的界面中
"name": "template", // 游戏的唯一英文标识符。由英文、数字、下划线组成不能超过20个字符。
"version": "Ver 1.4", // 当前游戏版本;版本不一致的存档不能通用。
"version": "Ver 1.4.1", // 当前游戏版本;版本不一致的存档不能通用。
"floorId": "sample0", // 初始楼层ID
"hero": { // 勇士初始数据
"name": "阳光", // 勇士名;可以改成喜欢的

View File

@ -811,7 +811,7 @@ events.prototype.afterBattle = function(enemyId,x,y,callback) {
// 如果事件不为空,将其插入
if (todo.length>0) {
this.insertAction(todo);
this.insertAction(todo,x,y);
}
// 如果已有事件正在处理中
@ -837,7 +837,7 @@ events.prototype.afterOpenDoor = function(doorId,x,y,callback) {
}
if (todo.length>0) {
this.insertAction(todo);
this.insertAction(todo,x,y);
}
if (core.status.event.id == null) {

View File

@ -88,7 +88,7 @@ main.floors.sample0 = {
"6,12": {"floorId": "sample0", "loc": [10,10], "direction": "left", "time": 1000},
},
"afterBattle": { // 战斗后可能触发的事件列表
"2,6": ["\t[ghostSkeleton]不可能,你怎么可能打败我!\n一个打败怪物触发的事件"]
"2,6": ["\t[ghostSkeleton]不可能,你怎么可能打败我!\n一个打败怪物触发的事件"],
},
"afterGetItem": { // 获得道具后可能触发的事件列表
"11,8": ["由于状态栏放不下绿钥匙和铁门钥匙均视为tools放入工具栏中。\n碰到绿门和铁门仍然会自动使用开门。"],

View File

@ -2,7 +2,7 @@ function main() {
//------------------------ 用户修改内容 ------------------------//
this.version = "1.4"; // 游戏版本号如果更改了游戏内容建议修改此version以免造成缓存问题。
this.version = "1.4.1"; // 游戏版本号如果更改了游戏内容建议修改此version以免造成缓存问题。
this.useCompress = false; // 是否使用压缩文件
// 当你即将发布你的塔时请使用“JS代码压缩工具”将所有js代码进行压缩然后将这里的useCompress改为true。