From b65e5dcfbb02c792c9990558a0297a744d6d6c61 Mon Sep 17 00:00:00 2001 From: oc Date: Fri, 9 Feb 2018 21:06:55 +0800 Subject: [PATCH] V1.4.1 --- README.md | 10 +++++ docs/api.md | 2 +- docs/element.md | 2 +- docs/event.md | 83 +++++++++++++++++++++++++++++++++++++++-- docs/index.md | 2 +- docs/personalization.md | 28 ++++++++------ docs/start.md | 2 +- libs/data.js | 2 +- libs/events.js | 4 +- libs/floors/sample0.js | 2 +- main.js | 2 +- 11 files changed, 116 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index a92fd36d..66369b8a 100644 --- a/README.md +++ b/README.md @@ -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] 支持动画。 diff --git a/docs/api.md b/docs/api.md index e55b13f6..ec92f8a5 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,6 +1,6 @@ # 附录:API列表 -?> 目前版本**v1.4**,上次更新时间:* {docsify-updated} * +?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} * 所有系统支持的API都列在了这里。所有可能被用到的API都在前面用\*标记。 diff --git a/docs/element.md b/docs/element.md index 8c7e7e92..d66b2c41 100644 --- a/docs/element.md +++ b/docs/element.md @@ -1,6 +1,6 @@ # 元件说明 -?> 目前版本**v1.4**,上次更新时间:* {docsify-updated} * +?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} * 在本章中,将对样板里的各个元件进行说明。各个元件主要包括道具、门、怪物、楼梯等等。 diff --git a/docs/event.md b/docs/event.md index 28da579e..8bdf07cb 100644 --- a/docs/event.md +++ b/docs/event.md @@ -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} // 变成老人 + ] +} +``` + +### 获得圣水后变成墙 + +这个例子要求获得圣水时不前进(也就是不能走到圣水地方),然后把圣水位置变成墙。 + +因此需要我们需要覆盖系统trigger(getItem),并覆盖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:battle,type:openDoor等来具体进行控制。 + ## 加点事件 打败怪物后可以进行加点。 diff --git a/docs/index.md b/docs/index.md index 798a5c77..7a358d0d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ # HTML5 魔塔样板说明文档 -?> 目前版本**v1.4**,上次更新时间:* {docsify-updated} * +?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} * 众所周知,魔塔的趋势是向移动端发展,贴吧中也常常能见到“求手机魔塔”的帖子。然而现有的工具中,NekoRPG有着比较大的局限性,游戏感较差,更是完全没法在iOS上运行。而一些APP的魔塔虽然可用,但是必须要下载安装,对于Android和iOS还必须开发不同的版本,非常麻烦。 diff --git a/docs/personalization.md b/docs/personalization.md index 7f43e996..1f4fbd0b 100644 --- a/docs/personalization.md +++ b/docs/personalization.md @@ -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函数中。 diff --git a/docs/start.md b/docs/start.md index d24740df..c9a838c0 100644 --- a/docs/start.md +++ b/docs/start.md @@ -1,6 +1,6 @@ # 快速上手 -?> 目前版本**v1.4**,上次更新时间:* {docsify-updated} * +?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} * 在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔! diff --git a/libs/data.js b/libs/data.js index 79200541..02efe2b4 100644 --- a/libs/data.js +++ b/libs/data.js @@ -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": "阳光", // 勇士名;可以改成喜欢的 diff --git a/libs/events.js b/libs/events.js index b80f61f0..533cb8f6 100644 --- a/libs/events.js +++ b/libs/events.js @@ -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) { diff --git a/libs/floors/sample0.js b/libs/floors/sample0.js index 38118dd7..5fb84bfd 100644 --- a/libs/floors/sample0.js +++ b/libs/floors/sample0.js @@ -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碰到绿门和铁门仍然会自动使用开门。"], diff --git a/main.js b/main.js index ccbf162e..bae1a274 100644 --- a/main.js +++ b/main.js @@ -2,7 +2,7 @@ function main() { //------------------------ 用户修改内容 ------------------------// - this.version = "1.4"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。 + this.version = "1.4.1"; // 游戏版本号;如果更改了游戏内容建议修改此version以免造成缓存问题。 this.useCompress = false; // 是否使用压缩文件 // 当你即将发布你的塔时,请使用“JS代码压缩工具”将所有js代码进行压缩,然后将这里的useCompress改为true。