V1.4.1
This commit is contained in:
parent
c0fcbea201
commit
b65e5dcfbb
10
README.md
10
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] 支持动画。
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 附录:API列表
|
||||
|
||||
?> 目前版本**v1.4**,上次更新时间:* {docsify-updated} *
|
||||
?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} *
|
||||
|
||||
所有系统支持的API都列在了这里。所有可能被用到的API都在前面用\*标记。
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 元件说明
|
||||
|
||||
?> 目前版本**v1.4**,上次更新时间:* {docsify-updated} *
|
||||
?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} *
|
||||
|
||||
在本章中,将对样板里的各个元件进行说明。各个元件主要包括道具、门、怪物、楼梯等等。
|
||||
|
||||
|
||||
@ -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等来具体进行控制。
|
||||
|
||||
## 加点事件
|
||||
|
||||
打败怪物后可以进行加点。
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# HTML5 魔塔样板说明文档
|
||||
|
||||
?> 目前版本**v1.4**,上次更新时间:* {docsify-updated} *
|
||||
?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} *
|
||||
|
||||
众所周知,魔塔的趋势是向移动端发展,贴吧中也常常能见到“求手机魔塔”的帖子。然而现有的工具中,NekoRPG有着比较大的局限性,游戏感较差,更是完全没法在iOS上运行。而一些APP的魔塔虽然可用,但是必须要下载安装,对于Android和iOS还必须开发不同的版本,非常麻烦。
|
||||
|
||||
|
||||
@ -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函数中。
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# 快速上手
|
||||
|
||||
?> 目前版本**v1.4**,上次更新时间:* {docsify-updated} *
|
||||
?> 目前版本**v1.4.1**,上次更新时间:* {docsify-updated} *
|
||||
|
||||
在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔!
|
||||
|
||||
|
||||
@ -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": "阳光", // 勇士名;可以改成喜欢的
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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碰到绿门和铁门仍然会自动使用开门。"],
|
||||
|
||||
2
main.js
2
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。
|
||||
|
||||
Loading…
Reference in New Issue
Block a user