Merge pull request #483 from AutumnOrange51/v2.x

V2.x
This commit is contained in:
Zhang Chen 2020-06-05 08:30:43 +08:00 committed by GitHub
commit 616fc1e114
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
27 changed files with 1502 additions and 3136 deletions

View File

@ -1,7 +1,8 @@
- [快速上手](start) - [快速上手](start)
- [元件说明](element) - [元件说明](element)
- [事件](event) - [事件编辑](event)
- [事件指令](instruction)
- [个性化](personalization) - [个性化](personalization)
- [脚本](script) - [脚本](script)
- [修改编辑器](editor) - [修改编辑器](editor)

View File

@ -1,350 +1,383 @@
# 元件说明 # 元件说明
?> 目前版本**v2.7**,上次更新时间:* {docsify-updated} * ?> 目前版本**v2.7**,上次更新时间:* {docsify-updated} *
在本章中,将对样板里的各个元件进行说明。各个元件主要包括道具、门、怪物、楼梯等等。 在这个部分,将详细讲解编辑器的每个部件的用法。
## 素材区
素材区在展开状态下,从左到右分为若干列:
1. `project\materials\terrains.png`:位于素材区第一列(最上面两个图块不在这张图片里,它们分别是擦除和空气墙),其中从楼梯开始往下有系统含义,请勿随意修改其图块属性。
2. `project\materials\animates.png`位于素材区第二列共4帧。主要为星空、岩浆、三色墙、六色门、四向出入口箭头、四种路障。
3. `project\materials\enemys.png`32×32px像素下同的怪物您可以随意修改它们的任何属性。如果嫌两帧太少还可以作为32×48px怪物画在靠下2/3部分。
4. `project\materials\enemy48.png`32×48px的怪物自带只有四只。您可以随意修改它们的任何属性。
5. `project\materials\npcs.png`32×32px的NPC如老人、商人、小偷、公主、仙子、木牌、魔龙和章鱼的其他8块您可以随意修改它们的任何属性。
6. `project\materials\npc48.png`32×48的NPC自带只有样板0层的小姐姐但您也可以用它来制作32×48px的门。
7. `project\autotiles`:自动元件,会随着在地图上的连续摆放而自动采取适当的绘制方式。
8. `project\tilesets`额外素材用来突破其他素材合计不得超过1000个的限制。您可以在这个区域拖动来批量框选再在地图区单击成片绘制或拖动平铺。
请打开样板0层 `sample0.js` 进行参照对比。 您可以随时使用`core.getBlockCls(x, y, floorId, showDisable)`这一API来获取游戏中某个位置的图块类别其中自动元件和额外素材会分别返回“autotile”和“tileset”其他的则会返回所在的图片文件名不含后缀
## 地图编辑快捷键Z
![image](img/v2.7/editor.png)如图所示您可以在此对地图进行清空或删除操作也可以新建或批量新建任意宽高的空白地图。其中“导出并复制地图”是指显示出左侧的矩阵并复制一般用来跨塔复制地图您也可以直接改动其中的数字再点击“从框中导入地图”就能将改动的结果同步到地图上。下面的“楼层ID、中文名、状态栏名”分别对应楼层属性快捷键V的floorId、title和name其中floorId也作为文件名不能使用中文title会显示在楼传界面和楼层切换黑屏name也允许使用中文。
## 图块属性快捷键C
![image](img/v2.7/mapsC.png)
如上图,除怪物和道具外,所有素材的图块属性都定义在`project\maps.js`中。道具和怪物属性也支持清空和批量复制,下面逐一讲解各条目的含义和用法:
1. 图块ID`core.getBlockId(x, y, floorId, showDisable)`的返回结果不允许使用中文和纯数字。请注意额外素材tileset的图块ID由素材图片的顺序和图块在图片上的位置确定无法更改也请勿随意调换图片的顺序。样板已注册的图块中建议只修改怪物和NPC的图块ID修改方法为上图最下方的“修改图块id为”。
2. 图块数字见前面的描述额外素材的数字由ID去掉字母X得到。
3. 图块类别:即前面所说的`core.getBlockCls(x, y, floorId, showDisable)`的返回结果。
4. 图块名称:怪物在手册中、道具在道具栏中、其他图块在剧情对话中的默认名称,可以随意修改。但原则上不推荐不同的怪物和道具有重复的名称,否则会影响事件编辑器的中文替换功能。
![生成地图](./img/sample0.png) 在讲解其他属性之前,这里简单介绍一下素材的注册机制。
## 道具 除自动元件和额外素材外其余图块只有在注册后才拥有上面所说的ID和数字。
样板自带的所有道具在样板0层中已全部给出。当你在样板0层中拿到某个宝物时会有提示这里不再赘述详见拿到该道具的说明。
大多数宝物都有默认的效果,屠龙匕首暂未定义,如有自己的需求可参见[自定义道具效果](personalization#自定义道具效果)。 未注册的图块则只有“索引”索引为n表示该图块在图片的第n+1
拿到道具后将触发`afterGetItem`事件从V2.7起,`afterGetItem` 脚本提供了一个参数表示该道具是否是通过轻按捡到的,对应的事件也允许在轻按时不予触发),有关事件的详细介绍请参见[事件](event)。 ID和索引的对应关系定义在project\icons.js中
如需修改某个道具的效果,在不同区域宝石数据发生变化等问题,请参见[自定义道具效果](personalization#自定义道具效果)的说明。 尝试用未注册的图块如道具一列中的某些魔杖和飞羽或者利用便捷PS工具新追加的图块在地图上绘制就会出现红色的问号方框。
<br>**有关轻按,在全塔属性的系统开关中有定义。如果勾选了 `enableGentleClick` ,则鼠标(触摸屏)通过双击勇士,键盘通过空格,手机通过虚拟数字键 7 可达到轻按效果,即不移动而获得周围物品。**
## 装备
如果需要让剑盾等变成装备,可以直接在它们的图块属性中把 `cls` 一项改为 `equips`<br>
从V2.4.1开始HTML5魔塔样板终于拥有了属于自己的装备页面。
### 装备栏的设置,装备类型 此时请在数据区手动注册此图块只需填写一个新ID和数字1000以内即可。
在全塔属性中,有一个`equipName`项,其定义了本塔的所有可装备的装备栏。 也可以点击“自动注册”按钮批量注册该图片的所有未注册素材自动注册出的ID非常难看建议立即手动修改为有意义的英数或拼音。
<br>其需要是一个长度为正数且不大于 6 15×15 样板为不大于 8 )的一维数组,其中每一项为装备栏的名称,**建议是两个汉字**。<br>
例如下面这种写法就是定义了四个装备孔,名称分别为武器、防御、首饰和魔杖。
自动元件的注册与此不同除了替换样板现有的几个外如果还需要追加新的请在地图区下方的下拉框中切换到“追加素材”快捷键M然后导入文件到画板autotile再点击“追加”按钮即可。非Windows系统追加其他素材也主要依靠这种方式具体用法请自行探索。
### 非怪物非道具属性
1. 触发器目前素材区只有第一列最下面两个图块使用pushBox这一触发器请勿修改之也请勿对别的图块使用这一触发器。其余触发器中custom一般不需要ski用于画在背景层的图块来实现滑冰效果openDoor用于制作门。怪物和道具的触发器分别是battle和getItem不能修改
关于推箱子存在三种图块目标点flower、没推到位的黄箱子box、推到位的绿箱子boxed
推箱子的前方不能存在任何事件层图块flower除外否则会推不动。
每推一步箱子后将触发“脚本编辑——推箱子后”,您可以在里面统计上述三种图块的数量,进行对应的处理。
2. 可通行性:勾选后勇士才可以踏入此图块,否则只能撞击此图块。(怪物被锁定为不可通行,道具被锁定为可通行)
3. 碰触脚本勇士踏入或撞击此图块时执行的脚本该项会被eval相当于一种自定义的触发器您可以参考踩灯和四种路障去填写它。
4. 不可出入方向:对三个图层的图块都有效。不可出方向指的是勇士站在这种图块上不能向哪个方向走(包括撞击),不可入方向指的是勇士不能从哪个方向走向这种图块(包括撞击,如勾选了“上”则不能从上方向下走向这个图块),请参考素材区第一列最下面的四个箭头。
5. 可破震勾选后此图块将成为破墙镐pickaxe和地震卷轴earthquake这两个道具的目标。
6. 动画帧数您可以修改此帧数来让本来有4帧的图块只用前3帧循环播放另外制作门时请务必将此帧数改为1表示门在打开前静止在第1帧。
7. 门信息只对4帧的图块自动元件除外有效您可以点击“编辑按钮”来填写此图块作为门的开关耗时、开关音效以及需要哪些钥匙各多少把可以填写任何消耗类道具也可以选择某些道具只需持有一定数量而不消耗。修改此信息后您需要将上面的“动画帧数”改为1并可能需要将“触发器”改为openDoor不改的话将无法通过撞击来开门但可以像三色墙一样用来制作暗墙
8. 行走图朝向只对npc48有效。设置后当勇士撞击该npc时npc会尝试转身面向勇士对话事件结束前请使用“事件转向”指令将其转回去
走动时也会尝试自动转向请参考样板0层使用的小姐姐。
### 道具属性
样板自带的道具都在样板0层摆好了您可以直接进入游戏捡起它们就会看到该道具的注意事项这里不再赘述。
1. 道具类别虽然和图块类别的英文缩写都是cls但有本质区别请注意区分。道具的图块类别都是items而道具类别分为以下几种
1. items是的你没看错又是items这个词请注意和图块类别的items相区分。它表示即捡即用类不进背包的道具如四种血瓶、三种宝石等。这类道具需要用到的其他属性有“即捡即用效果”、“即捡即用提示”、“碰触或使用事件”。
2. tools进背包的消耗类道具如钥匙和解药瓶、便携式血瓶蓝瓶生命魔杖、破震炸飞和跳鞋等。这类道具需要用到的其他属性有“道具描述”、“不显示在道具栏”、“回放不绘制道具栏”、“碰触或使用事件”、“使用效果”、“能否使用”。
3. constants进背包的永久道具每件在背包的数量要么为1要么为0如手册、楼传、幸运金币、十字架、护符、二倍斩等这类道具需要用到的其他属性和tools一致。
4. equips装备它需要用到的其他属性有“道具描述”、“道具的装备属性”、“能否装备”。
所以如果您想把四种血瓶和三种宝石改为便携式就只需把其道具类别改为tools当然楼层属性中的宝石血瓶效果一项也就失效了
如果想把大黄门钥匙变为钥匙盒红黄蓝钥匙各一把只需把其道具类别从tools改为items.如果想把剑盾变成装备,只需把其道具类别改为`equips`.
2. 道具描述:对除即捡即用类外的道具都有效。一个字符串,为道具在道具栏里的描述,也作为首次捡到时的提示信息的一部分(如果全塔属性中开启了这一提示功能的话)。支持使用`${表达式计算}`语法(如四种血瓶和三种宝石那样,但不支持中文替换),此语法的详细规则见“显示文章正文的转义序列”,和“值块和冒号缩写量”。
3. 不显示在道具栏对tools和constants有效勾选此项后该道具在背包中将不显示出来。常用于不能主动使用或已有专门的使用按钮的道具来节省显示篇幅如手册、楼传、幸运金币、十字架、护符和钥匙等。
4. 回放不绘制道具栏:勾选此项后,录像回放中使用此道具将不显示黑黑的道具栏。常用于频繁使用的道具,如楼传、技能和冰冻徽章等。
5. 即捡即用效果如题该项会被eval一般为一行下述的代码
`core.status.hero.xxx += yyy * core.status.thisMap.ratio`
其中xxx为勇士的某种状态如生命hp、生命上限hpmax、魔力mana、魔力上限manamax、护盾mef、攻防和金经yyy为此道具的基础效果如四种血瓶和三种宝石的基础效果定义在了全塔属性中而最后的ratio则是指该道具所在楼层的“楼层属性”最下面的“宝石血瓶效果”。
6. 即捡即用提示:实际显示时会被接在“获得
xxx”后面所以该项总是一个以逗号开头的字符串同样支持`${表达式计算}`语法。
7. 碰触或使用事件对除equips外都有效。该项用于代替“即捡即用效果”但会使勇士停下脚步且会晚于afterGetItem事件被执行和“使用效果”如样板中的黄宝石和生命魔杖。如果您的js语法基础薄弱那么它将是您的不二之选。
8. 使用效果对tools和constants有效。该项会被eval一般为一个js函数较为简单的使用效果如解药瓶也可能是一行代码破炸冰的目标个数请直接在该项中修改。总的来说因为事件比起脚本更容易实现异步特效且录像安全性更好所以如非必要不建议用此项。
9. 能否使用对tools和constants有效。该项也会被eval一般为一个js函数较为简单的使用条件如解药瓶也可能是一行形如`core.hasFlag('xxx')`的代码。如果该道具在任何情况下都不能主动使用请留null并最好勾选“不显示在道具栏”以节约显示篇幅如果该道具在任何情况下都可以使用请填“true”如果使用条件较为复杂也推荐直接填“true”先斩后奏在使用效果中再行判定并在使用失败的场合使用`core.addItem('xxx')`静默返还一件该道具,如样板中的破墙镐和炸弹。
10. 能否装备对equips有效请注意在装上装备后如果条件不再满足也不会自动卸下。和“能否使用”不同此项留null表示任何情况下都可以装备。
11. 道具的装备属性在介绍此项之前请先留意一下“全塔属性”中的“装备孔”一项。该项为一个字符串数组最多允许6项13×13样板或8项15×15样板。每一项为装备的类型名称建议是两个汉字如“武器”、“防具”。类型允许重复如可以让勇士最多同时装备两块盾牌。
接下来介绍道具的装备属性,点击“编辑”按钮进入其图形化编辑模式。该项分为以下几个方面:
1. 类型一个自然数和前面的“装备孔”对应如0表示武器1表示防具。如果装备孔有重复的名称则这里也直接写名称不用加引号穿戴时会自动尝试寻找第一个同类型的空闲装备位没有空闲的话会提示玩家先卸下一件。
2. 普攻动画:`project\animates`文件夹中任何一个文件的名称(不带后缀,但需要在全塔属性中注册过),只对第一个装备孔有效。普攻动画会播放在和勇士战斗的怪物位置处,如果是强制战斗的天降怪物,则会播放在勇士身上并跟随,请自行注意。详见“文件注册”使用动画。
3. 数值提升项若干个键值对表示该装备增加属性的常数值支持负数。7个常用属性可以通过下拉框选取自定义的新属性也可以手动输入。
4. 百分比提升项:若干个键值对,表示该装备增加属性的百分比(支持负数,如填$-$10就表示减少10%),修改方法同上。
装备对属性的影响原理是:在穿脱装备时,会根据数值提升项和百分比提升项,分别调用`core.status.hero.xxx += yyy和core.addBuff('xxx', yyy)`[^10]这两个API衰弱的附加和解除同理而状态栏的显示值和战斗中的使用值则是`core.getStatus('xxx')`和buff值相乘再向下取整所得。
PC端按下Ctrl+0—9可以保存当前套装Alt+0—9快速更换套装。
道具相关API请阅读libs\items.js双击默认会运行请用文本编辑器打开
### 怪物属性
1. 手册映射ID如前所述npc48提供了“行走图朝向”来实现多朝向而怪物则没有这么好的待遇。如果您制作了四种面朝不同方向但属性完全一致的怪物那么您可以将其中三种怪物的“手册映射ID”填写为剩下一种怪物的ID这样手册中确切地说`core.getCurrentEnemys()`函数的因变量)就会统一显示为剩下那一种怪物。
2. 生命、攻防、金经如题注意金经必须在“全塔属性”快捷键B中的“状态栏显示项”中也勾选才能真正被启用。持有幸运金币时打怪获得的金币翻倍附加诅咒状态时打怪不获得金经。
3. 加点若全塔属性勾选了“加点”则此项为正数时将作为与该怪物每场战斗胜利后传递给“公共事件——加点事件”的参数即那里的flag:arg1默认表示加点的倍率您可以自行修改该事件。
4. 不可炸勾选后该怪物不会成为炸弹的目标有阻击怪在场的情况下请务必给有战后事件的怪物如机关门守卫和boss勾选此项否则玩家可能会偷梁换柱地炸掉该怪物并把阻击怪推过去打死来触发战后事件。
5. 特殊属性:一个由正整数组成的一维数组,您可以点击“勾选框编辑”按钮来修改它。所有特殊属性都定义在“脚本编辑——怪物特殊属性”,您可以在那里追加新的。它们大体分为四类:
1. 手册中属性值的修正:(按照结算顺序)模仿、坚固、光环,修正后的属性也将被用于战斗,详见“脚本编辑——怪物真实属性”。
2. 战损的修正这类最多先攻、魔攻、连击次数为n、破甲比例为defValue、反击比例为atkValue回合数为勇士的攻击回合数、净化倍数为n1表示单纯无视护盾、吸血比例为value是否加到自身为add、仇恨每场战斗的仇恨增值由全塔属性指定、无敌、固伤数值为damage、支援。其中又以仇恨和固伤不能被护盾直接抵消而和无敌较为特殊详见“脚本编辑——战斗伤害信息”。
3. 战后的影响中毒、衰弱、诅咒、仇恨的累加和减半、自爆、退化扣减值分别为atkValue和defValue、重生详见“脚本编辑——战后脚本”和“公共事件——毒衰咒处理”。
4. 阻激夹域捕即对主角行走的妨害详见“脚本编辑——阻激夹域伤害”该函数也负责了血网图块ID为lavaNet请勿修改的伤害。
阻激域的伤害都为value且在夹击之前结算领域的形状和半径与光环一致。
如果需要更复杂的形状(如米字形激光),请自行研究该函数。
请勿给同一种怪物设置阻击和捕捉,否则其阻击只会变得类似固伤。
可以看到怪物属性中有很多值是彼此互相冲突的。请自行注意比如分散给各项而不要都吊死在三个value上。最后介绍一些和怪物相关的API
``` js ``` js
"equipName": ["武器","防具","首饰","魔杖"] core.status.hero.flags.no_repulse = true; // 禁用阻击,包括伤害和后退效果
core.status.hero.flags.no_laser = true; // 禁用激光
core.status.hero.flags.no_betweenAttack = true; // 禁用夹击
core.status.hero.flags.no_zone = true; // 禁用领域
core.status.hero.flags.no_ambush = true; // 禁用捕捉
core.getItem('amulet'); // 禁用血网等路障
core.setEnemy('greenSlime', 'name', '绿史莱姆'); // 设置怪物属性,并计入存档
core.getDamageString(enemy, x, y, floorId); // 获取某只怪的地图显伤字符串和颜色
core.getCurrentEnemys(floorId); // 获取某层楼的(映射后)怪物列表,按战损递增排列
core.hasEnemyLeft(enemyId, floorId); // 漏怪检测,两个参数都允许使用一维数组
core.hasSpecial(src, n); // 检测src是否含有编号为n的特殊属性src分为以下几种情况
``` ```
如果src为一个数组检查n是否在其中。为一个数字检查是否和n全等
这么定义好后装备类型即为每个装备孔的索引从0开始 为字符串视为怪物ID去检查。为对象将其special域作为src递归检查
武器的装备类型是0防御的装备类型是1首饰的装备类型是2魔杖的装备类型是3。 如果您想在数据区的表格中追加新的属性项,或修改已有项的格式、范围和长短注释,请点击数据区顶部的“配置表格”按钮,并参照已有的项去追加和修改,具体可查阅@zhaouv撰写的另一篇文档。
## 楼层属性快捷键V
![image](img/v2.7/floorsV.png)
1. 楼层IDproject\\floors中的文件名不允许使用中文也不能直接修改。修改方法见上图底部修改后必须立即刷新浏览器页面。
2. 楼层名:楼层在楼传、上下楼黑屏和浏览地图界面的名称。
3. 状态栏显示:勇士在此楼层时状态栏左上角上楼梯图标右边的文字,允许使用中文,但请注意控制字数。
4. 宽度和高度:如题,
如果地图被加宽或加高,则“偏移”表示右移或下移的格子数(左边缘或上边缘用空格子填补)。
### 设置每个装备的属性 如果地图被减窄或减矮,则“偏移”表示左移或上移的格子数(被移出左边缘或上边缘的图块将丢失)。
5. 几个勾选框:
1. 可楼传:如果不勾选,则此楼层禁止成为楼传的目标楼层,勇士在此楼层也禁止使用楼传。
2. 快捷商店:如果不勾选,则勇士在此楼层禁止快捷使用商店。事件中的“启用全局商店同时打开”不受影响,详见“插件编写——全局商店”。
3. 不可浏览如果勾选则此楼层无法通过PageUp/PageDown键浏览也不会计入B键数据统计。
4. 不可瞬移如果勾选则勇士在此楼层无法用E键和单击瞬移常用于用自动事件去监听勇士坐标时。
5. 是否是地下层:如果勾选,则非平面模式下勇士在此楼层原地使用楼传会传送到上楼点,详见“脚本编辑——楼层飞行”。
6. 首次到达事件、每次到达事件:如题,详见“脚本编辑——切换楼层后”。
7. 并行处理脚本一个字符串为勇士在此楼层时浏览器每帧都会执行一次eval的脚本最快每秒60次。一般用来制作一些定时特效如bgs、bgv详见“脚本编辑——并行脚本”。
8. 上下楼点:两个自然数构成的一维数组,将作为“楼层转换”事件(在地图上以图块左下角出现绿色小方块作为标记)和“楼层切换”指令中“上下楼梯”以及非平面楼传的目标坐标。如果不设置,则在传送时会尝试从地图中搜索上下楼梯图块。因此当某个楼层没有楼梯或有多个楼梯时(如《[新新魔塔](http://ckcz123.com/games/xinxin/editor.html)》),请务必设置这个属性。点击“编辑”按钮从地图选点即可。
9. 楼传落点:格式和设置方法同上。如果设置了此项,则楼传在此层的落点将强制变为该点,无视平面模式下的离开点和上面的上下楼点以及该层实际的楼梯位置。
10. 地面图块可以填写任何一个图块ID此项也会作为手册和剧情对话中的帧动画背景。
11. 色调一行四列的数组前三项为小于256的自然数分别表示红、绿、蓝最后一项为$[0,1]$的浮点数表示不透明度可以点击“编辑”按钮用取色器调色见样板的主塔40层。值得一提的是很多事件也以颜色作为参数这些都是可以使用取色器调色的。
如果要将一个道具设置为装备,首先需要将其`cls`设为`equips`。 与RPG Maker不同HTML5 canvas的色调合成公式是“此值×不透明度 +
原值×(1$-$不透明度)”,所以即使给此项的红绿蓝填写相等的值也无法实现完美的灰色。如有需求,请使用[插件库](http://h5mota.com/plugins)的“仿RM光照”。
12. 天气一行两列的数组第一项为字符串“rain”、“snow”或“fog”第二项为不大于10的正整数分别表示1—10级的雨天见样板的主塔40层、雪天由大小不一的白色实心圆组成详见样板1层和雾天由project\\materials\\fog.png放大后随时间加入不规则扰动得到
然后在图块属性的`equip`一项中设置装备的具体属性。从V2.7起,该项通过事件编辑器编辑。分为以下几项: 色调层在天气层上方、UI层下方如不透明色调会遮盖天气浏览地图看不到色调关于图层的详细说明参见“个性化”
1. 类型:自然数或字符串常量,和前面的 `equipName` 对应,填字符串一般是因为 `equipName` 中有重复项(比如可以装备两件饰品什么的)。 13. 背景音乐:如题,当在游戏中触发楼层切换时(包括读档),如果
2. 普攻动画:一个已注册的 `.animate` 文件名(这里不再写后缀),只对第一个装备位才有效。具体可参见[动画和天气系统](#动画和天气系统)。 `core.status.hero.flags.__color__、__weather__、__bgm__`没有值,游戏当时的画面色调、天气、背景音乐就会变为楼层属性中的这三个设置项,详见“脚本编辑——切换楼层中”。
3. 数值提升项:若干个键值对,表示该装备增加属性的常数值(支持负数,会影响 `core.getStatus()` 的结果,可以用 `core.getEquippedStatus()` 来获取7个常用属性可以通过下拉框选取自定义的新属性也可以手动输入。 14. 宝石血瓶效果如题必须填写且必须为非负数。此项的用法为core.status.thisMap.ratio请参考四种血瓶和三种宝石的捡拾效果。
4. 百分比提升项:若干个键值对,表示该装备增加属性的百分比(支持负数,会影响 `core.getRealStatus()` 的结果,可以用 `core.getBuff()` 来获取。最终的状态栏属性向下取整,百分比之间用加法叠加,且晚于常数结算),修改方法同上,精确到千分之一。
### 检测是否存在装备
可以使用`core.hasEquip(itemId)`来检测是否装上某个装备。 您还可以将其用于其他各种场合作为系数,如血网的伤害、中毒后每步的损血等。
15. 楼层贴图至此我们会发现图块只有32×32px和32×48px两种尺寸且后者只能画在事件层每个图块最多只能有4帧。
使用`core.hasItem(itemId)`来检测是否存在一个未装上的装备。 所以您可以在npcs.png中看到魔龙和章鱼被大卸八块使用起来非常不方便
使用`core.getEquip(equipType)`来获得某个装备类型的当前装备。 所幸样板提供了“楼层贴图”,该项允许您使用任何尺寸、任何帧数的素材,
更多相关API详见[附录API列表](api)。 唯一的缺点是不支持伸缩、移动跳跃和淡入淡出效果
### 多重装备 点击“编辑”按钮进入事件编辑器,每张图片的写法为(可从入口方块拖出,然后双击预览第一帧的效果):
1. 图片名name如题图片需要放在project\images文件夹并注册。
2. 翻转(:x/:y/:o您可以对贴图的每帧进行三种翻转当然帧顺序在原图中依然是从左到右的。
3. 图层bg/fg/auto此项决定贴图绘制在哪个图层您可以全部画在背景层或前景层。也可以选择“自适配”让贴图的上半部分画在前景层下半部分画在背景层比如树木等。如果选择了自适配最好让下面的绘制坐标和宽高都是32的倍数。
4. 绘制坐标xy贴图在地图中的左上角像素坐标譬如x和y都填32则表示贴图左上角和“地图左上角格子的右下角”重合。
5. 初始禁用Y/N如果勾选了此项则此贴图初始时不显示您可以在事件中再将其显示出来。
6. 裁剪起点坐标xy和宽高wh此项规定了贴图在按帧切分前从原图中取哪一部分x和y为所取部分在原图中的左上角坐标不填视为两个0w和h为所取部分的宽高不填表示一直取到右下角
7. 帧数frame不填视为1如果填写了大于1的整数就会把上述裁剪得到的结果再从左到右等分为若干份并在实际绘制时从左到右逐帧可能还带有翻转循环绘制每帧的持续时间和其他图块一致。
从V2.5.4开始,允许支持多重装备,即有若干的装备可共用若干的格子(例如永不复还那样)。 总之,每张贴图是按照“裁剪”—“左右等分”—“逐帧翻转”的顺序得到的
要实现这一点,上面的写法有所改变。 贴图本身只具有观赏性您仍然需要使用空气墙等手段去控制其绘制区域各个点的通行性。在使用贴图来表现魔龙和章鱼这类大型怪物时可以预先注册两种一样属性的怪物。一种透明另一种为缩小到32×32px且只有两到四帧的版本。将前者画在地图上怪物属性的“手册映射ID”填后者最后在该点的战后事件中隐藏贴图即可。最后附上贴图和图块绘制顺序的修改方法libs\maps.js
<br>在全塔属性中的`equipName`项写法不变,不过可以写重复的装备孔名称。(但仍然最多只能写 6 或 8 个)
``` js ``` js
"equipName": ["武器", "武器", "武器", "防具", "防具", "首饰"] ////// 绘制背景层 //////
maps.prototype.drawBg = function (floorId, ctx) {
var onMap = ctx == null;
if (onMap) {
ctx = core.canvas.bg;
core.clearMap(ctx);
}
this._drawBg_drawBackground(floorId, ctx);
// ------ 调整这两行的顺序来控制是先绘制贴图还是先绘制背景图块
this._drawFloorImages(floorId, ctx, 'bg');
this._drawBgFgMap(floorId, ctx, 'bg', onMap);
} // 后绘制的覆盖先绘制的。
``` ```
## 全塔属性快捷键B
全塔属性共分为四部分:文件注册、初始勇士、全局数值、系统开关,您可以随时折叠其中任何一个部分。
![image](img/v2.7/firstDataB.png)
### 文件注册
这部分基本上都是经由多选框半自动完成的,下面逐一讲解:
1. 楼层列表project\floors文件夹中的文件名不含后缀此数组的顺序决定了楼传和上下楼器fly、upFly、downFly的顺序。
然后对于某个装备,将其`type`(装备类型)写对应的装备孔名称即可。 如果您不慎将勇士的出生楼层注销了或不慎删除了某些楼层的js文件导致编辑器页面打开后一片白屏请手动打开project\data.js去小心地修改floorIds以和实际的文件名相匹配并将出生楼层改为一个存在的楼层
这样写的话,则所有该名称的装备孔均可装上此装备。 其他更复杂的白屏请在控制台根据报错信息安卓手机则使用ES文件浏览器查看日志去小心地修改文件如某个楼层文件有问题则可以注销它如果难以独立解决欢迎加QQ群959329661寻求帮助。
2. 使用图片project\images文件夹中的文件名需要后缀必须全英数单击“编辑”按钮编辑器会自动扫描文件系统中格式合适的图片如jpg、png和gif
当尝试装上此装备时,会取最小的一个空的装备孔进行装备。如果没有空闲的装备孔,则会提示“请先卸下装备”。 您可以预览并将需要的图片勾选。请注意勇士的初始行走图必须在这里注册。另外winskin.png只许替换为相同规格的图片而不要注销否则道具商店插件无法正常绘制。
3. 额外素材project\tilesets中的文件名需要后缀只支持png
注册方法同上,最大的区别在于这个数组的顺序必须保持好。如果随意调换其中的顺序,或注销不在数组末尾的图片,就会导致地图上最终呈现的素材发生错位。因此,新勾选的图片总会被自动追加到数组的末尾。
装备动画仍然会取第一个装备类型为0的装备的`animate`项,即使装备了多个有动画的武器。 比起常规素材,额外素材最大的好处有几点:
1. 图片没有数量限制。常规素材的总数量最多只允许不到一千个,而额外素材每张图片上的图块数量最多允许一千个。
2. 查看和绘制更为方便。常规素材每个图块独占一行,每列为一帧,导致不方便观察,且用多个图块拼图必须逐图块绘制。额外素材都是静止的,所以每个图块只占一格,多个图块可以在准备素材时就直接以相邻的样子绘制在同一张图片上,绘制地图时直接从素材区拖动来批量框选,再在地图区单击成片绘制或拖动平铺。
3. 批量替换也更为方便。譬如您如果想制作形如“一场大战/天灾过后/多年以后,村庄/城镇化为了一片废墟”的效果,可以预先准备两张甚至更多张相同规格的额外素材图片,然后在适当的时候遍历某个/某些楼层的图块ID将以“X1”开头的图块统一替换为“X2”开头等。发布单机版游戏时您也可以提供多张相同规格的额外素材图片供玩家直接替换。当然使用这类做法的话就没法再使用“额外素材合并”了。
## 门 当您即将发布您的游戏时可以使用“额外素材合并”工具将用到的额外素材图块重新拼成更少的图片以减少游戏体积和加快在线游戏的加载。执行此操作后额外素材的图块ID和数字包括第一位都将被打乱因此请勿在制作中以任何方式直接引用其ID和数字。如确有此需求请间接引用、等量代换如“将$(x_1,y_1)$处的图块设置为和$(x_2,y_2)$处一样”、“判断$(x_3,y_3)$和$(x_4,y_4)$处的图块是否相同”。
样板自带6种门黄蓝红绿铁花。前四种门需要有对应的钥匙打开花门只能通过调用 `openDoor` 事件进行打开。铁门是否需要钥匙,由全塔属性的 `steelDoorWithoutKey` 开关控制,详见“万能铁门钥匙”道具的拾取效果。<br> 4. 使用动画project\\animates文件夹中的文件名不含后缀请注意与`animates.png`相区分)。
开门后可触发该点的 `afterOpenDoor` 事件,有关事件的详细介绍请参见[事件](event)。<br>
如果要新增自己的门支持32×48尺寸请参见[新增门和对应的钥匙](personalization#新增门和对应的钥匙)。
## 暗墙 要使用动画您可以使用“RM动画导出”工具从RPG Maker XP
样板支持暗墙。要制作一个暗墙非常简单:在该点直接放一个普通墙壁,然后事件写“开门”,坐标为该点就行。 1.03及其制作的游戏中导出动画也可以用动画编辑器修改已有的动画或用图片新建。但这些办法都只适用于Windows系统非Windows系统建议直接从我们的官网下载他人的作品取用其中的动画。
``` json
// 该点画一个普通的墙壁,比如`yellowWall`
// 在该点的事件events中: 动画不支持在编辑器中预览Windows系统可以使用“动画编辑器”预览但没有音效。
[{"type": "openDoor"}] // 直接使用开门事件,坐标可忽略表示当前点
``` RPG Maker的动画存储方式是将用到的图片独立存放而所有动画的帧信息包括第几帧该用什么音效会闪烁整个画面或当前图块会集结在同一个文件中。
系统会自动调用animates中的开暗墙动画。样板自带如下ID支持以这种方式开门
``` text 而我们的存储方式则不同是对每个动画将其用到的各张图片直接以base64硬编码进同一个animate文件每个动画为一个animate文件。
yellowDoor, blueDoor, redDoor, greenDoor, specialDoor, steelDoor,
yellowWall, blueWall, whiteWall 这样做的缺点是如果多个动画使用了相同的图片那么图片会被重复存储,优点则是跨作品迁移动画更加方便。
animate文件为文本文件文件末尾记录了动画的帧信息文件开头则记录了动画的伸缩比和唯一音效会和动画同时开播
在导出动画时会出现一个输入框并提示动画的唯一音效名。不管该文件名是什么语种请直接点击下一步。音效文件会被尝试自动复制随后您只需手动注册该动画和音效并将音效文件名改为全英数。如果复制失败则需要您手动去该RPG
Maker XP 1.03项目的SE文件夹中将这个文件复制出来所以刚才最好记一下这个名字放在您的H5魔塔项目的project\sounds文件夹中并改名为全英数然后手动注册该动画和音效。
如果要查看或修改一个动画和音效的对应关系(比如从官网上别的作品扒来的动画),请直接在注册时预览并修改。
动画的播放速度为20FPS即每帧50毫秒。这里给出几个相关API
``` js
core.drawAnimate(name, x, y, alignWindow, callback);
// 播放一个动画name为不带后缀的动画文件名x和y为播放的格子坐标。
// alignWindow表示该坐标在大地图中是绝对坐标还是相对坐标填true表示相对坐标。
// 相对坐标模式下坐标应填写为小于13或15的自然数譬如对13×13样板来说
// 填两个6就会强制播放在视野中心。
// callback为动画播放完毕后(和音效无关)的回调函数,因为动画播放本身是异步的。
core.drawHeroAnimate(name, callback); // 和上面类似,但该动画会跟随勇士移动。
// 每场战斗后,都会根据怪物坐标尝试用前者播放普攻动画。若坐标不存在
// (天降强制战斗),则会尝试用后者播放。看上去就像勇士在打自己,请自行注意。
``` ```
详见“脚本编辑——战后脚本”。上述两个函数都会返回一个每次不同的正整数id您可以使用`core.stopAnimate(id, doCallback)`函数来立即停止一个正在播放的动画其中doCallback为true表示停止时执行原动画的回调。
1. 使用音乐project\bgms文件夹中的文件名需要后缀默认只支持wav、mp3和ogg
## 怪物 如果玩家使用的是手机且没有连接WiFiiOS和部分浏览器无法获知网络状态将始终视为流量党那么背景音乐默认不会开启可以在标题画面点击右下角的圆形按钮来开启。
样板自带的怪物列表参见 `project\enemys.js` 。其与 `images\enemys.png` 素材按顺序一一对应。<br>
如有自己的怪物素材需求请参见[自定义素材](personalization#自定义素材)的内容。
怪物可以有特殊属性,每个怪物可以有多个自定义属性。 发布到官网的作品还可以从<https://h5mota.com/music/>远程加载背景音乐您可以点击此链接试听和下载其他作品的背景音乐。是否启用远程加载、以及启用时远程加载的根目录由main.js指定。因此从官网下载其他作品的离线版本后请先关闭远程加载功能才能正常加载本地注册的音乐。
怪物的特殊属性所对应的数字special在脚本编辑中的`getSpecials`中定义,请勿对已有的属性进行修改。 使用core.material.bgms可以查看所有的背景音乐如果需要同时播放多个背景音乐并独立控制时刻和音量请直接对它们使用play()方法并修改其currentTime可读和volume属性。
<br>多属性可直接从图块属性勾选。怪物可以负伤,由全塔属性的系统开关 `enableNegativeDamage` 指定。<br> 2. 使用音效project\sounds文件夹中的文件名写法同上。和动画不同
打败怪物后可以进行加点操作。有关加点塔的制作可参见[加点事件](event#加点事件)。
<br>如果全塔属性中的“显示经验值”未勾选,即不启用经验的话,怪物手册里将不显示怪物的经验值,打败怪物也不获得任何经验。<br>
拿到幸运金币后,打怪获得的金币将翻倍。如果怪物勾选了 `notBomb` ,则这个种类的怪物均不可被炸。<br>
N连击怪物的special是6且我们可以为它定义n代表实际连击数。参见样板中剑王的写法。
<br>吸血怪需要给怪物设置value代表吸血的比例。可以给吸血怪勾选 `add` 来将吸血的数值加到自身上。<br>但这样做以后,红色的预估伤害往往带有误导性,这点还务请注意!<br>
中毒怪让勇士中毒后,每步扣减的生命值由全塔属性中的 `poisonDamage` 定义。<br>
衰弱怪让勇士衰弱后,攻防会下降一定比例或固定数值(直到衰弱状态解除恢复);由全塔属性中的 `weakValue` 定义。<br>
诅咒怪将让勇士陷入诅咒状态,诅咒状态下杀怪不获得金币和经验值。
<br>领域怪需要需要给怪物设置 `value` 代表领域伤害的数值。如果勇士生命值扣减到0则直接死亡触发 `lose` 事件。<br>
领域是锯齿形状还是正方形由 `zoneSquare` 设定,如勾选则为正方形,不勾选则为锯齿形状。<br>
领域怪还可以设置`range`选项代表该领域怪的范围不写则默认为1。
<br>**将 `flags.no_zone` 设置为 `true` 可以免疫领域效果。**<br>
阻击怪同样需要设置value代表阻击伤害的数值。如果勇士生命值扣减到0则直接死亡触发lose事件。
<br>**将`flags.no_repulse`设置为true可以免疫阻击效果包括伤害和移动。**<br>
!> 阻击怪后退的地点不能有任何事件层图块,否则不会后退。另外它会无视可通行方向,请自行注意悬崖效果的影响!<br>
激光怪同样需要设置value代表激光伤害的数值。
<br>请注意如果吸血、领域、阻击、激光、生命光环中任何两个同时存在,则 `value` 会冲突。**因此请勿将吸血、领域、阻击、激光或生命光环放置在同一个怪物身上。退化和攻防光环、吸血加到自身和光环叠加同理!<br>**
**将 `flags.no_laser` 设置为 `true` 可以免疫激光效果。将 `flags.no_ambush` 设置为 `true` 可以免疫捕捉效果。**<br>
退化怪和光环怪需要设置'atkValue'和'defValue'表示退化或增幅的数值也可以不设置默认为0。
<br>**将`flags.no_betweenAttack`设置为true可以免疫夹击效果在全塔属性中还有一个系统开关 `betweenAttackMax` 可以控制夹击伤害是否封顶至夹击怪的战斗伤害。**<br>
固伤怪则需要设置`damage`选项,代表战前扣血数值。
如有额外需求,可参见[自定义怪物属性](personalization#自定义自定义怪物属性),里面讲了如何设置一个新的怪物属性 音效的播放不支持回调,只支持提前停止,而且一停就会停止所有的。
## 怪物和NPC的朝向问题 音效的音量是固定的无法调节。此外样板没有背景音效bgs、bgv的默认实现。如有需求请使用并行脚本处理。
从V2.5.2开始对于人形怪物和NPC的朝向问题已经有着比较好的解决方式。 音乐和音效在使用多选框注册时都支持试听您可以看到它们的总时长和已播时长精确到秒从而指定音乐的开播秒数或配合使用“等待n毫秒”事件或并行脚本处理。
3. 使用字体project\fonts文件夹中的文件名只支持ttf格式不写后缀
首先明确一点的是和RM不同H5中即使是对同一个怪物/NPC的不同朝向也需要分别将其各个朝向素材追加对应的图片上并进行注册。 不建议给在线游戏版本添加中文字体,因为文件真的很大……
4. 文件映射:如前所述,样板所有需要加载的文件名都必须是全英数。
### 怪物的朝向问题 这一项允许你给文件取别名,别名可以使用任何语言的文字。
5. 装备孔:见“道具的装备属性”。
6. 标题音乐:如题,请注意部分浏览器不会在刚打开某个页面时就播放音频,必须用户操作一下才行。
7. 主样式一些css设置项单击“编辑”按钮可以看到具体含义和用法这里不再赘述横竖屏标题画面背景支持gif动图
8. 游戏名:标题画面和网页选项卡上显示的名字,可以和官网别的作品重名。
9. 唯一英文标识符:必须修改,且不得和官网别的作品重名。只能使用全英数,如果您不确定一个标识符是否已被别的作品使用,请输入 ckcz123.com/games/xxx 如出现404就说明xxx未被使用。
10. 游戏版本当您的游戏发生版本更迭后旧版本的存档直接读取可能会出现bug.因此届时您可以修改此项来让旧存档无法直接读取,只能回放其录像。
11. 难度分歧:单击“编辑”按钮进入事件编辑器,每个难度分为以下几项。
1. 名称:标题界面单击“开始游戏”后出现的二级菜单中的文字。
对于同一个怪物的不同朝向,需要对每个朝向创建一个怪物(属性完全相同),这样就可以在地图上绘制不同朝向的怪物。 一般为该难度的最简要的介绍,如减伤比例、初始福利等
但是这样会存在一个问题,就是怪物手册中怪物的每个朝向都会显示成一个单独的怪物。 2. 简写横屏状态栏左下角竖屏右下角也作为数字键切换按钮和存读档界面缩略图上的文字也会出现在在线游戏排行榜和旧版官网的作品卡片上。允许使用中文但请注意控制字数用core.status.hard表示。
3. 变量hard值若同一结局有多个难度有人通关则上述排行榜只统计此值最高的难度。
4. 颜色:上述“简写”的颜色,用`core.status.hero.flags.__hardColor__`表示,默认为红色。详见“脚本编辑——更新状态栏”。
5. 事件:此事件比下述的“开场剧情”更早执行,一般用来设置初始福利。
如果将难度分歧数组留空那么标题界面单击“开始游戏”就会直接进入开场剧情。即core.hideStartAnimate(core.startGame)
为了避免这种情况的发生,在怪物的属性中存在一个`displayIdInBook`项,**我们可以指定该项来控制每个怪物在怪物手册中中显示成的怪物。** ### 初始勇士
1. 初始楼层、朝向和坐标:如题,请注意初始楼层必须在上述的“楼层列表”中。初始坐标一般通过右击地图上的空地快速绑定,但您也可以手动在这里填写负数或超出初始楼层宽高的值。然后使用“无视地形移动勇士”或“跳跃勇士”等改变勇士位置的事件指令,做出“勇士从地图外进入”的演出效果。
举个例子假设我现在有个怪物其向下的行走图ID是`E300`其向左的行走图ID是`E301`向右的行走图ID是`E302`。分别对这几个怪物填写完全相同的怪物属性。 如需根据难度分歧或用户选项来改变它们请在“开场剧情”中修改core.firstData.floorId和core.firstData.hero.loc
2. 行走图如题必须在“使用图片”中注册过。宽高必须为4的倍数宽度至少为128px即每帧32px。高度不限剧情对话中和状态栏中会尝试保持比例压缩到每帧32px宽。
如果我在地图上同时绘制向下、向左和向右的该怪物,则确实能在地图上显示出来不同的朝向,但是在怪物手册中会同时显示这三种类型的怪物,观感较差。 在游戏中勇士当前的行走图文件名用core.status.hero.flags.heroIcon表示只读
3. 帧动画:勾选此项后,勇士在剧情对话中(朝上视为朝下)和原地不动时会循环播放四帧踏步动画,一般用于长翅膀的勇士。
4. 勇士名:如题,也会作为剧情对话中`\t[hero]`的默认标题。
5. 初始等级:如果开启了自动进阶功能,请不要修改此项。
6. 生命上限、魔力上限、初始生命/魔力/攻防/护盾/金经:如题。
我们可以给`E301`和`E302`怪物属性中的`displayIdInBook`项填写为`"E300"`。 注意生命上限和金经需要在系统开关中勾选后才会启用,魔力上限填负数代表没有上限。
7. 初始装备、游戏变量建议留空事件中的变量初始时都会视为0脚本中也有办法做到
8. 永久道具、消耗道具、初始拥有装备个数:点击“注释”按钮,按照提示进行修改。
9. 标题事件:需要配合系统开关中勾选“标题开启事件化”来使用,可以在“开始游戏”、“读取存档”之余添加一些额外的功能。如成就系统、音像和回想鉴赏,但这并不是唯一的方法,请自行研究。
10. 开场剧情:会在难度分歧事件之后执行,可以在这里设置各种变量的初始值、穿上初始拥有的装备、隐藏勇士和一些初始不希望显示的图层块、追加跟随者等。
11. 全局商店详见“QTE与全局商店”。
12. 等级提升:需要配合系统开关中勾选“等级”、“经验”和“升级”来使用,每个等级分为以下几项:
1. 需求:刷新状态栏时,如果勇士当前等级是此等级的前一级,且经验值大于等于此需求,就会触发升级。
这样的话在怪物手册中所有的E301和E302均会被视为E300并进行合并。即使只有一只朝向左的怪物E301怪物手册仍然会按E300进行显示。 因此如果您想设计“低难度初始等级较高”,请直接增加经验。
<br>从而完美解决了同种怪物不同朝向在怪物手册的显示问题。此做法不兼容夹击属性,漏怪检测也以映射后的怪物为准。
### NPC的朝向问题
和怪物不同的是NPC朝向问题更复杂一点。 触发升级后会再次检查下一个等级,直到经验不足或等级已满。
在NPC的图块属性中存在一个`faceIds`的项目可以用其来绑定一个图块所对应的其他朝向的图块ID。 所以您不必担心一次获得太多经验连续触发升级会出bug.
举个例子假设我存在一个NPC其向上的图块ID是N333向下的图块ID是N334向左的图块ID是N335不存在向右的图块ID。 2. 称号状态栏显示的等级默认是个正整数会尝试替换为这里的称号调用core.getLvName()函数),请注意控制字数。
3. 是否扣除经验:如果勾选了此项,则触发升级时经验值会扣除需求值。
4. 事件:触发升级时执行的事件,如全面提升属性。
则可以在这几个图块属性中的`faceIds`中写:`{"up": "N333", "down": "N334", "left": "N335"}`。 ### 全局数值
<br>当勇士从左边撞上此NPC后将从该图块的图块属性中的 `faceIds` 中寻求 `left` 所对应的ID。 ![image](img/v2.7/values&flagsB.png)
如果存在定义如N335则会在触发对话事件前改变当前图块为N335看起来就是在对话前进行了转向面向勇士。<br> 这个类型的数值会保存在core.values中可以直接在游戏中修改。
对话中,`\t[this]` 效果的图像也会尝试选用该NPC的当前朝向朝上不好看会自动改为用朝下的<br> 1. 血网伤害和中毒伤害:如题,如果不想用常数,请修改“脚本编辑”的“阻激夹域伤害”和“每步后操作”。
!> 请注意,在对话结束后朝向不会切换回来,因此如果有必要切换朝向请在事件结束前调用转变图块事件。 2. 衰弱效果填小于1的正数代表扣减的比例否则为扣减的常数。
<br>从v2.7起也提供了“事件转向”指令来执行这种转变图块从而省去了手动填写ID的不便。<br>
同理使用移动事件让NPC在行走时不同朝向的行走会自动调用`faceIds`中不同朝向的ID所对应的行走图看起来就是在行走时也可以不断转向了。
从而完美解决了NPC的朝向问题碰触时面向勇士、行走时改变朝向 扣减和恢复的原理和装备相同,详见“公共事件——毒衰咒处理”、解衰药水和万能药水的使用效果。
3. 三种宝石和四种血瓶的值如题此值为基础值。实际效果还需乘以楼层属性最下面的“宝石血瓶效果”限即捡即用类详见这七种道具的属性。此外B键数据统计是按照此值乘以“宝石血瓶效果”统计的与道具的实际效果无关请自行注意。
4. 反击、破甲、净化比例如果反击、破甲、净化怪物没有指定atkValue、defValue和n就会用这三个值。请注意反击的总回合数是勇士的攻击回合数净化比例填1表示单纯无视护盾。
5. 仇恨增值每进行一场战斗core.status.hero.flags.hatred的增加量。如果不想用常数请修改“脚本编辑——战后脚本”。
6. 全局帧动画时间即怪物和NPC的振动速度建议改为300毫秒。
7. 竖状态栏自绘行数需要配合系统开关“开启自绘状态栏”使用建议改为4.
## 路障,楼梯,传送门 ### 系统开关
这个类型的开关会保存在core.flags中只读请注意和core.status.hero.flags相区分。如需在游戏中修改请使用“设置系统开关”事件。
1. 状态栏显示项如题总个数请控制在12个以内否则竖屏可能塞不下。
血网的伤害数值、中毒后每步伤害数值、衰弱时暂时攻防下降的数值都在全塔属性的values内定义。 多说一句,这些项的图标都在`project\materials\icons.png`中。
<br>如果有个性化需求,可以自行修改路障的图块属性 `script`、脚本编辑“阻激夹域伤害、每步后操作”和公共事件“毒衰咒处理”。<br>
路障同样会尽量被自动寻路绕过目前后三种路障在已主角附加对应debuff的情况下依然会绕过
<br>有关楼梯和传送门,必须在该点的 `changeFloor` 事件里指定传送点的目标。![生成地图](./img/changeFloorBlockly.png)<br>
楼层ID指定的是目标楼层的唯一标识符ID也可以在第一个下拉框中选择“前一楼”和“后一楼”。<br>
第二个下拉框可以选择传送到哪个楼梯,或选择三种对称位置,或显式指定坐标(比如目标楼层有多个楼梯时)。<br>
“朝向”为勇士上下楼后面对的方向从V2.7起,支持三种相对转向),不填则不改变。“动画时间”为上下楼的黑屏时间,不填则使用玩家设定值。<br>“穿透性”表示鼠标或触屏寻路时勇士能否穿过此传送点,在转不开身的狭窄区域建议设为可穿透。<br>
**从v2.1.1开始,楼层属性中提供了 `upFloor``downFloor` 两项。如果设置此项(比如`"upFloor": [2,3]`从V2.7起支持地图选点法设置则写传送到哪个楼梯或者楼传器的落点将用此点来替换楼梯位置即类似于RMXP中的上箭头。**
## 剧情文本控制与对话框效果
在写剧情文本时,可以: 该文件夹下也提供了一个`icons_old.png`可供替换。
- 使用`\t[...]`来给文字加上标题和图标。如`\t[老人,man]`。 “血限”、“金币”和“经验”必须勾选才会启用(指会处理生命溢出、金经会显示在手册、打怪也会掉落),
- 使用`\b[...]`来制作对话框效果,如`\b[up,3,2]`。
- 使用`\r[...]`来动态修改局部文本的颜色,如`\r[red]`。
- 使用`${}`来计算一个表达式的值,如`${status:atk+status:def}`。
- 使用`\f[...]`来同时插入一张立绘图,如`\f[1.png,100,200]`。
- 使用`\\i[...]`来在对话框中绘制一个图标,如`\\i[fly]`。
- 使用`\\c[...]`来修改字体大小,如`\\c[16]`。
- 使用`\\d`来加粗或者取消粗体。
- 使用`\\e`来加斜体或取消斜体。
- 使用`\\z[...]`来添加打字中的暂停效果。
从V2.5.2开始,也允许绘制一张头像图在对话框中,只要通过`\t[1.png]`或`\t[标题,1.png]`的写法 必须勾选“升级”才会启用自动进阶“升级扣除模式”如果不勾选就会同时显示下一级的需求NEXT和当前经验EXP如果勾选了的话否则会只显示两者的差依然用NEXT图标
**使用`\\i,\\c,\\d,\\e,\\z`时请注意:在事件块中,允许只写一个反斜杠`\`,系统会自动转义成`\\`;但是在脚本中必须两个反斜杠都写上!** 如果同时勾选了“钥匙”和“绿钥”,则每种钥匙的数量都会被缩小尺寸显示,因此如非必要请不要勾选“绿钥”。
2. 楼传需在楼梯边:如果勾选了此项,则只有勇士在楼梯旁边(如果开启了下述的平面模式则还包括四种三帧箭头旁边)时才允许使用楼传。
详细信息请参见[剧情文本控制](event#text显示一段文字剧情)中的说明。 请注意,此项是在楼传道具使用条件之外额外进行的判定,目的是给出不同的提示信息。因此如果您要修改楼传的使用条件(指总的使用条件,具体能否飞到某层的条件则在“脚本编辑——楼层飞行”),则可能需要一并取消此勾选。
3. 楼传开平面模式:如果勾选了此项,则勇士在使用楼传飞往某层时会落在上次离开该层的位置。此外,上述“在楼梯边”也会包括“在四种三帧箭头旁边”。
4. 铁门不消耗钥匙:如果勾选了此项,则铁门无需钥匙也能撞开。
从V2.5.2开始可以用一张WindowSkin图片作为对话框的背景皮肤。 勾选后您可以将铁门的开门动画ps为墙壁状来批量制作暗道。
<br>使用时需要将图片放在images目录下并在全塔属性中予以注册。已有的 `winskin.png` 请勿删除,否则会影响道具商店插件的使用。<br>
可以使用[设置剧情文本的属性](setText设置剧情文本的属性)事件将对话框背景设置为需要的皮肤。
!> 关于对话框效果请注意现在是采用WindowSkin的右下角两个32x32的图片作为对话框尖角进行绘制。因此请尽量使用群文件或网盘的常用素材中给出的WindowSkin素材均已进行对话框适配。如需使用来自第三方的WindowSkin素材请自行注意对话框的尖角问题或弃用`\b`效果。 直接把三色墙等的图块的“触发器”改为openDoor也是可以的。
5. 首次道具进行提示勾选后首次捡到非即捡即用类道具都会弹窗提示晚于afterGetItem事件被执行
6. 状态栏装备按钮:勾选后,状态栏的楼传按钮会变为装备栏按钮,但玩家仍然可以双击道具栏来呼出装备栏。
7. 加点和负伤前者勾选后怪物的加点值会在“脚本编辑——战后脚本”中作为参数core.status.hero.flags.arg1被传递给“公共事件——加点事件”。
另外一点是V2.5.2以后,对话框`\b`可以根据文字长度来自动控制文本框宽度,其基本控制原理如下: 后者勾选后,战斗结束时如果勇士的护盾没有完全被打破,则剩余的护盾值会加到其生命上。所以勾选此项后,护盾可以这样“间接”抵消掉仇恨伤害和固伤。
- 如果用户存在手动换行`\n`,则选取**最长的一段话**作为文本框宽度。 8. 夹击不超伤害值:勾选此项后,夹击伤害将封顶至夹击怪的战损。
- 如果用户不存在手动换行则会将文本框宽度调整为X行半的最佳宽度。
- 文本框宽度存在上下界,最终宽度一定会控制在该范围内。
- 从V2.7开始,自动换行增加了标点禁则,成对标点的左部不会出现在行尾,右部和不成对标点不会出现在行首。
该自动调整仅对`\b`的对话框效果有效。非对话框仍然会绘制整个界面的宽度。 同时被四只怪夹击时,取两个战损中较小的。
9. 二分临界我们知道打败怪物所需的回合数取决于勇士的攻击减去怪物的防御。这个值并非每增大1都能使回合数减少因而有了“临界”的说法即“再至少增加多少攻击力才能减少回合数”。然而当您修改“脚本编辑——战斗伤害信息”函数后攻击力的增加可能反而导致回合数也增加于是临界值计算出错。您可以勾选此开关来修复代价是游戏可能较卡请自行权衡。
10. 标题开启事件化:勾选此项后,标题画面将改为执行前述的“标题事件”,请自行研究。
11. 开启自绘状态栏:勾选此项后,状态栏将改用“脚本编辑——自绘状态栏”来绘制,同时“脚本编辑——点击状态栏”也将启用,请自行研究。
12. 三个显伤:略,玩家依然可以在设置菜单中开关之。
13. 允许轻按:勾选此项后,玩家可以按下空格/大键盘数字7/双击勇士来拾取相邻的唯一道具,或面前的道具。
14. 允许穿透楼梯:在狭窄的区域拦路放置一个可通行的“楼层转换”事件时(图块左下角出现绿色标记),玩家可能希望勇士能直接走过去。您可以逐个去设置其能否被这样走过,或者让其依据本勾选项。
## 大地图 值得注意的是,当玩家从允许穿透的楼梯向一个不可走的方向(如旁边是墙,或不勾选下一个开关时的致命领域)手动寻路时,可以停在楼梯上(进而再轻按拾取周围物品等)。不建议您利用这类极端情况去迫使玩家进行非常规操作,毕竟穿透楼梯和不能踏入致命领域的本意是方便玩家,不是么?
15. 允许将死领域“脚本编辑——阻激夹域伤害”会将地图中每个点的阻激夹域和血网伤害加总如果不勾选此开关则当勇士生命小于等于相邻空格子的总伤害没有则视为0勇士无法走向该格子。
从V2.4开始H5魔塔开始支持大地图。 值得注意的是这种判定方式并没有考虑“走这一步后、结算该点伤害前”可能的加血或该点伤害变化因此您可能需要根据“脚本编辑——每步后操作”去修改core.canMoveHero()函数。
16. 允许瞬移:若不勾选此开关,将全程禁用瞬移功能。一般只建议在需要的楼层逐层勾选禁止瞬移(主要为了用自动事件去监听勇士的坐标),详见`core.maps._canMoveDirectly_checkGlobal()`函数。
17. 伤害禁用商店勾选此项后每当勇士踩到阻激夹域和血网并受到伤害时所有全局商店都将被禁用需要重新去启用譬如勇士去撞击该商店的实体NPC。详见`core.control._checkBlock_disableQuickShop()`函数。
18. 虚化前景层:前景层会遮挡事件层,这对魔塔来说有时可能不太友好。
大地图在创建时可以指定宽高,要求**宽和高都不得小于1315x15版本则是不小于15且宽高之积不超过1000**。 勾选此项后,事件层有东西(如道具)时将虚化该格子的前景层,使得该东西以半透明状态可见。
<br>您也可以在楼层属性的最下面修改宽高,还可以指定偏移量。
## 动画和天气系统
现在我们的H5魔塔支持播放动画也支持天气系统了。
<br>要播放动画你可以先使用“RM动画导出器”将 `RPG Maker XP 1.03` 的动画导出放在animates目录下然后在全塔属性的animates中定义。
``` json
// 在此存放所有可能使用的动画必须是animate格式在这里不写后缀名
// 动画必须放在animates目录下文件名不能使用中文不能带空格或特殊字符
"animates": ["hand", "sword", "zone", "yongchang", "thunder"]
```
目前不支持用浏览器预览动画Windows系统请使用“动画编辑器”预览然而预览不会播放音效。<br>
!> 动画必须是animate格式名称不能使用中文不能带空格或特殊字符。
导出动画时可能会进行一些压缩譬如把本来是128×128尺寸的动画压缩为64×64播放时再临时放大以节省流量因此清晰度可能不如原版。
从2.3.2开始,动画可以同时导出所用的音效。**如果导出音效,请确保将所用到的音效复制到了`sounds`目录下,并且在全塔属性中注册过。**
<br>确切地说,动画文件中记录着第几帧该用什么音效的文件名,您可以用记事本等文本编辑器打开动画文件并手动修改用到的音效文件名(原本可能是中文甚至日文),以和实际的文件名相匹配
动画播放时是按照每秒20帧的速度即50ms/帧)。
定义完毕后,我们可以调用`animate`事件来播放该动画,有关事件的详细介绍请参见[事件](event)。
!> 播放录像时,将默认忽略所有动画。
<br>目前天气系统支持雨、雪和雾三种天气。在每层楼的楼层属性中存在一个weather选项表示该层楼的默认天气。
``` json
// 该层的默认天气。本项可忽略表示晴天,如果写则第一项为"rain""snow"或"fog"代表雨雪雾第二项为1-10之间的数代表强度。
"weather": ["snow",5]
```
我们也可以使用`setWeather`事件来设置当前天气,有关事件的详细介绍请参见[事件](event)。
## 背景音乐
样板支持BGM和SE的播放。要播放音乐和音效你需要将对应的文件放在sounds目录下然后在全塔属性中进行定义
``` json
// 在此存放所有的bgm和文件名一致。
// 音频名不能使用中文,不能带空格或特殊字符;可以直接改名拼音就好
"bgms": ["bgm.mp3"]
// 在此存放所有的SE和文件名一致
"sounds": ["floor.mp3", "attack.mp3", "door.mp3", "item.mp3", "zone.mp3"]
```
!> 音频名不能使用中文,不能带空格或特殊字符。
<br>目前BGM支持主流的音乐格式`wav, mp3, ogg`,不支持 `mid` 格式的播放。<br>`iOS` 系统对 `ogg` 的支持性较差,但 `ogg``mp3` 体积小,请注意权衡。<br>
定义完毕后,我们可以调用`playBgm`/`playSound`事件来播放对应的音乐/音效,有关事件的详细介绍请参见[事件](event)。
**另外,考虑到用户的流量问题,将遵循如下规则:**
- **如果用户当前使用的电脑则默认开启音乐效果并播放默认BGM**
- **如果用户当前使用的手机且处于Wifi状态则默认开启音乐效果并播放默认BGM**
- **其他情况,将默认关闭音乐效果,只有在用户在菜单栏中点击“音乐开关”后才会播放音乐**
!> iOS平台以及部分浏览器不支持获得当前网络状态此时即使在使用Wifi也必须要用户点击“音乐开关”才能播放音乐。
从V2.5.3开始,可以使用`loadBgm`事件来预加载一个bgm这样到播放时无需等待直接播放。
同时BGM将使用LRU算法增加缓存机制。默认最多缓存4个BGM在core.js的musicStatus.cachedBgmCount控制
<br>系统会自动释放最久未使用的BGM。也可以使用 `freeBgm` 事件来手动释放一个无需再用的bgm
## 录像
HTML5魔塔一大亮点就是存在录像系统可以很方便进行录像回放。
当你在游戏的过程中,随着你的操作,录像也会被依次记录。游戏结束后将提示是否下载录像,上传成绩时也会上传你的录像信息。
在菜单栏-同步存档中,可以直接对当前录像进行下载。
!> 录像记录的是你当前的路线(本质上是模拟键盘操作),是一个纯文本文件,占用空间很小!
录像的回放主要有两种方式:
1. 保存成的录像文件(.h5route文件):在标题界面点录像回放,再选择文件即可。
2. 游戏过程中时的当前录像随时按R可以进行回放手机端则可调出虚拟键盘再按R。
录像播放过程中,可以进行如下操作:
- **步进:** 暂停状态下,按 `N` 键可以单步执行录像,常用于调试。
- **暂停/播放:** 按空格可以随时暂停或播放录像。
- **加速:** 按X可以加速录像播放最高可达6倍速。
- **减速:** 按Z可以减速录像播放最低可达0.3倍速。
- **停止:** 按ESC可以立刻停止录像播放并返回正常游戏。
- **回退:** 按A可以回退到上一个录像节点录像播放过程中每50步存一个录像节点
- **存档:** 按S可以在录像播放过程中进行存档。
- **查看手册:** 按C可以在录像播放过程中查看怪物手册。
- **浏览地图:** 按PgUp/PgDn可以在录像播放过程中浏览地图。
如果录像出现问题,请加 QQ 群 [959329661](https://jq.qq.com/?_wv=1027&k=5C87qeQ) 找小艾反馈Bug。
## 操作说明
![](img/keyboard.png)
<!--
本塔主要支持鼠标(触摸屏)操作和键盘操作。
鼠标(触摸屏)操作说明如下:
- **点状态栏中图标:** 进行对应的操作
- **点任意块:** 寻路并移动
- **点任意块并拖动:** 指定寻路路线
- **单击勇士:** 转向
- **双击勇士:** 轻按(仅在轻按开关打开时有效)
- **长按任意位置:** 打开虚拟键盘
键盘操作快捷键如下:
- **[CTRL]** 跳过对话
- **[Z]** 转向
- **[X]** 打开/关闭怪物手册
- **[G]** 打开/关闭楼层传送器
- **[A]** 读取自动存档
- **[S/D]** 打开/关闭存/读档页面
- **[V]** 打开/关闭快捷商店选择列表
- **[T]** 打开/关闭工具栏
- **[Q]** 打开/关闭装备栏
- **[ESC]** 打开/关闭系统菜单
- **[B]** 打开数据统计
- **[H]** 打开帮助页面
- **[R]** 回放录像
- **[E]** 显示光标
- **[SPACE]** 轻按(仅在轻按开关打开时有效)
- **[PgUp/PgDn]** 浏览地图
- **[1]** 快捷使用破墙镐
- **[2]** 快捷使用炸弹/圣锤
- **[3]** 快捷使用中心对称飞行器
- **[4]** 快捷使用其他道具
- **[Alt+0~9]** 快捷换装
以上快捷键也能在游戏菜单中的操作说明中看到。
-->
&nbsp;
&nbsp;
上面就是整个样板中的各个元件说明。通过这种方式,你就已经可以做出一部没有任何事件的塔了。 上面就是整个样板中的各个元件说明。通过这种方式,你就已经可以做出一部没有任何事件的塔了。

File diff suppressed because it is too large Load Diff

BIN
_docs/img/v2.7/blockly.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
_docs/img/v2.7/compare.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 KiB

BIN
_docs/img/v2.7/console.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
_docs/img/v2.7/drawTip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
_docs/img/v2.7/editor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

BIN
_docs/img/v2.7/eventsX.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

BIN
_docs/img/v2.7/floorsV.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
_docs/img/v2.7/flowCtrl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

BIN
_docs/img/v2.7/keyboard.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

BIN
_docs/img/v2.7/mapsC.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

BIN
_docs/img/v2.7/parabola.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

BIN
_docs/img/v2.7/server.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
_docs/img/v2.7/uievent.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

View File

@ -1,16 +1,22 @@
# HTML5 魔塔样板说明文档 # HTML5 魔塔样板说明文档
?> 目前版本**v2.7**,上次更新时间:* {docsify-updated} * ?> 目前版本**v2.7**,上次更新时间:* {docsify-updated} *
<br>当您打开这份帮助文档的瞬间,相信您一定是抱着幼年时的游戏开发梦想前来的。<br> 当您打开这份帮助文档的瞬间,相信您一定是抱着幼年时的游戏开发梦想前来的。众所周知,即时游戏的开发要比非即时游戏难上许多,像素级游戏的开发又要比网格地图游戏难上许多。
众所周知,即时制游戏的开发要比非即时游戏难上许多,像素级游戏的开发又要比网格地图游戏难上许多。<br>在非即时的网格地图游戏譬如策略战棋有一类游戏叫做“固定数值RPG”或者简称“魔塔”。<br>这是一种基于运筹学的数学优化建模游戏,虽然小众,却不失有自己的圈子。
当下魔塔的趋势是向移动端发展网络上也常常能见到“求手机魔塔”的提问。然而现有的工具中NekoRPG有着比较大的局限性游戏感较差更是完全没法在iOS上运行。而一些APP的魔塔譬如《魔塔盛宴》和一些登陆了TapTap的魔塔以及最新的由RPG Maker MV制作的《盖伦排位记》等虽然可用但是必须要下载安装对于Android和iOS还必须开发不同的版本非常麻烦 非即时网格地图游戏譬如策略战棋有一类叫做“固定数值RPG”简称“魔塔”。这是一种基于运筹学的数学优化建模游戏虽然小众却不失有自己的圈子
但是现在我们有了HTML5。 HTML5的画布canvas以及它被Android/iOS内置浏览器所支持的特性可以让我们做出真正意义上的全平台覆盖的魔塔 在当下魔塔的趋势是向移动端发展网络上也常常能见到“求手机魔塔”的提问。然而现有的工具中NekoRPG有着比较大的局限性游戏感较差更是完全没法在iOS运行。而一些APP的魔塔虽然可用但是必须要下载安装对于安卓和苹果还必须开发不同的版本非常麻烦
然而一般而言使用非RPG Maker制作魔塔往往需要一定的编程技术HTML5魔塔自然也不例外。但是为了能让大家更加注重于“做塔”本身而不用考虑做塔以外的各种脚本问题@艾之葵GitHub ckcz123特意制作了这样一部HTML5的魔塔样板。 但是现在我们有了HTML5。
> 这个魔塔样板可以让你在完全不懂任何编程语言的情况下做出自己的H5魔塔。不会代码没关系只要你想做就能做出来 HTML5的画布canvas以及它被Android/iOS内置浏览器所支持的特性可以让我们做出真正意义上的全平台覆盖的魔塔。
然而一般而言使用非RPG
Maker制作魔塔往往需要一定的编程技术HTML5魔塔自然也不例外。但是为了能让大家更加注重于“做塔”本身而不用考虑做塔以外的各种脚本问题@艾之葵GitHub
ckcz123特意制作了这样一部HTML5魔塔样板。
这个魔塔样板可以让你在完全不懂任何编程语言的情况下做出自己的H5魔塔。不会代码没关系只要你想做就能做出来
继续查看文档的详细介绍让你学会如何使用这一个样板来制作属于自己的HTML5魔塔或者……任何非即时的网格地图游戏。
继续查看文档的详细介绍让你学会如何使用这一个样板来制作属于自己的HTML5魔塔或者……任何非即时的网格地图游戏。<br>
本说明文档配有较为过时的B站视频教程可供参考[https://www.bilibili.com/video/av32781473/](https://www.bilibili.com/video/av32781473/)。 本说明文档配有较为过时的B站视频教程可供参考[https://www.bilibili.com/video/av32781473/](https://www.bilibili.com/video/av32781473/)。
========================================================================================== ==========================================================================================

867
_docs/instruction.md Normal file
View File

@ -0,0 +1,867 @@
# 事件指令
?> 目前版本**v2.7**,上次更新时间:* {docsify-updated} *
本样板之所以敢宣称“零编程基础的您也能大展身手”就是因为它搭载了强大的图形化json编辑器blockly
熟悉Antlr语法的读者可以根据@zhaouv的另一篇文档去自行修改`_server\MotaAction.g4`等文件去扩展其功能。
json代码本身则可以作为core.insertAction()函数的自变量,去执行临时事件。
## 指令的分类(注意区分块的颜色和地图的七彩点)
尽管本章的标题暗示了事件指令和`core.events._action_xxx()`函数是一一对应的但它们进一步调用的底层函数却分布在libs文件夹的不同文件中。
大致上显示文字类严格来说需要玩家操作的事件还涉及到actions.js和UI绘制类在ui.js数据相关类这类也有不少道具相关在items.js和特效声音类在control.js地图处理类在maps.js事件控制类或许应该叫流程控制类则在events.js请注意区分libs和project的同名文件。
另一种分类方法则是按照同步和异步,分成以下几类:
1. 瞬间就能执行完的如UI绘制、设置XX属性、显隐和转变图层块等。
2. 阻塞直到玩家操作的:如显示文章/选择项/确认框、接受用户输入、等待用户操作、呼出xxx等。
3. 阻塞一段固定时间的:如开关门、显示动画、移动跳跃、淡入淡出等。
4. 耗时但不阻塞的:如播放音效、显示提示等,会和后面的指令同时执行。
上述第3类指令都可以勾选“不等待执行完毕”即前面提到的异步事件变为第4类从而实现诸如同步开关多个门的效果。
在json区每条指令的格式为`{"type": "xxx", "param1": ..., "param2": ..., ......}`
实际执行的函数为`core.events._action_xxx(data, x, y, prefix)`
data为整个指令对象x和y为当前点坐标prefix为独立开关的楼层前缀。
您可以自行在libs\events.js中追加这样的函数这样就可以自定义新指令啦。
如果需要把新指令做成像已有的指令一样有类别、名称、取色器、勾选框、下拉框、输入框等部件,请查阅@zhaouv撰写的另一篇文档。
![image](img/v2.7/images&textY.png)
## 显示文字类(黄色)
这个类别的指令会负责UI层图文的处理如图片的移动和淡入淡出游戏的胜败和重启等。
### 显示文章
最基本的就是最灵活的。本指令的讲解将占用大量篇幅,请做好准备。
上述函数中,第一个自变量为字符串数组或单个字符串,每个字符串为一段需要玩家按下确认键或点击屏幕才会消失的剧情文本,第二个自变量(可选)为全部文本消失后的回调函数。
每条显示文章分为五部分:标题、图像、对话框效果、正文、立绘。
写成一个字符串就是“\t[标题,图像]\b[对话框效果]\f[立绘]正文”。
1. 标题可选一般填说话人的名字。如果不填则尝试根据图像取中文名道具除外如图像填hero但不填标题则以勇士名字作为标题。还可以填null强制不显示标题。
2. 图像可选可以填hero勇士行走图如果勇士开了帧动画则会取当前朝向但朝上会视为朝下或任何图块ID或者填this来尝试取当前点图块。也可以填一个png格式的图片文件名需要后缀甚至还可以填null来避免以图块ID为标题被解释成图像。
3. 对话框效果:可选,填法非常灵活,如下。
1. up,x,y对话框显示在点xy上方尖角朝下指着这个点绝对坐标具体指的高度取决于图像。没有图像则判断该点是32×32px还是32×48px的图块该点没有图块则没有尖角
2. down,x,y对话框显示在点xy下方尖角朝上指着这个点。比起上面这个没有高度问题不过该点没有图块的话则还是没有尖角。
上述两种写法中如果把坐标换成hero则显示在勇士上方或下方。
上方时如果没有图像则勇士高度视为32×32px.
3. this,x,y在大地图中xy可能位于视野上半部分也可能位于下半部分写this就能让对话框自动适配上下来防止越界。
4. hero在大地图上下边缘或小地图勇士可能在上半或下半场只写hero也能自动适配。
5. hero,nn为正整数显示给勇士的第n名跟随者自动适配上下。
6. up,null显示在屏幕最上方同理up换成down则为最下方。
7. center强制显示在屏幕中央宽度为视野宽度。
除最后两种外,其余写法都会给对话框进行宽度自适配:
如果正文没有自动换行,则会先尝试取一个让文本总行数最接近“几行半”的宽度,可能会再适当加宽来防止标题出界。
如果正文有自动换行,则会尝试连同标题在内取最长的一行作为宽度。
最终绘制时会尽量让尖角居中,除非尖角所指的点实在太靠左或太靠右。
值得注意的是使用project\images\winskin.png或类似的图片作为文章背景时尖角的绘制用的是用图片右下角64×32的两格进行的所以往往需要您自己准备好。
4. 正文:双击指令块,进入多行编辑。正文中允许使用很多转义序列,当您键入一个\字符时就会提示补全,后面逐一介绍。
5. 立绘:显示文章的同时可以绘制一张或多张立绘图,请双击预览各张图的效果。每张立绘由一大堆参数组成:
\f[name(:x/:y/:o,sx,sy,sw,sh,)x,y(,w,h,alpha,angle)]
1. 文件名需要放在project\images文件夹中并注册这里需要带后缀。
2. 翻转和楼层贴图一样支持三种翻转在json代码中以文件的后缀名之后追加“:x、:y、:o”来表示。
3. 绘制坐标:立绘在视野中的左上角像素坐标,后面的参数一旦省略其中一个则必须省略其后所有。
4. 绘制的宽高:立绘被伸缩后在视野中实际显示的宽高,必须同时填写,不填则不伸缩。
5. 裁剪坐标和宽高:必须同时填写,为从原图中裁剪区域的左上角坐标和区域宽高,不填则取全图。
6. 不透明度和旋转角度可选前者填一个不大于1的正数请自行双击预览。
立绘是画在UI层的下一个指令执行前就会擦除。如需持续显示请使用“显示图片”指令另外立绘会被“图像”遮挡。
### 显示文章正文的转义序列
除变色和换行外,使用其余转义序列(`\\c, \\d, \\e, \\i, \\z`)时请注意:
1. 表达式计算:使用`${}`可以计算一个js表达式式子中允许使用所有的冒号缩写量和API详见core.calValue()函数。此语法也可以用于“道具描述”和“即捡即用提示”,只不过那里就不支持中文替换了。
如“勇士当前的攻防相乘是\${状态:攻击\*状态:防御}”(中文替换),
“持有三色钥匙共\${item:yellowKey+item:blueKey+item:redKey}把。”json
2. 局部文字变色:使用\r[颜色英文名]或\r[\#RrGgBb](十六进制)来将这之后的文本变为另一种颜色。
最常用的17种颜色提供了自动补全十六进制颜色可以随便找个有颜色参数的指令呼出调色器去自己调配。只使用\r不带方括号则变回默认颜色。
3. 局部字号调节:使用`\\c[正整数]`改变这之后文本的字号,只使用`\\c`不加方括号则恢复默认字号。
4. 手动换行、局部加粗和斜体:退出多行编辑后,手动换行写作\n另外可以使用`\\d`将局部文本加粗或取消加粗,使用`\\e`将局部文本变为斜体或取消斜体。
5. 32×32px图标的绘制使用`\\i[图标ID]`绘制一个32×32px的图块的第一帧或系统图标您可以使用core.statusBar.icons查看所有的系统图标。
6. 打字速度调节:开启打字机效果后,文本的打字速度总是匀速的。
所以样板提供了名为“时间占位符”的转义序列,使用`\\z[正整数]`可以暂停相当于打这么多个字的时间。
### 其他文字类指令
1. 自动剧情文本:和上面的显示文章基本相同,只不过不是由玩家按下确认键或点击屏幕,而是一定毫秒后自动消失,录像回放中则忽略。
比起那个这个不能通过长按Ctrl键或长按屏幕快进大量使用时一般用来搭配语音。否则对魔塔这种快餐游戏来说可能会非常不友好建议统一塞进“显示确认框”指令的场合之一。
2. 滚动剧情文本将一段文字从屏幕最下方滚动到最上方不支持自动换行常用于op和ed.
3. 显示提示:即诸如打败怪物、捡到道具、打不开门时左上角的提示,只支持`${表达式计算}`。
可以填写一个图标ID显示在提示文本的左侧支持32×48px但只画靠上的2/3也可以使用系统图标
此指令对应core.drawTip(text, icon, frame)函数这里text就不支持`${}`表达式计算了。自然数frame表示绘制第几帧默认为0表示第一帧。
帧参数在事件中默认没有提供,图中那个是小秋橙自己加的。加的方法也非常简单,在@zhaouv撰写的另一篇文档中有讲解。只不过那篇文档中的两个例子更为复杂所以小秋橙决定在这里亲自讲一下这个例子。
首先,事件编辑器和事件执行的原理是:
1. 点击数据区表格的“编辑”按钮如果这一项是json类型就会跳转到事件编辑器并根据初始的json内容解析出初始的blockly指令块。
这一步由`_server\MotaActionParser.js`完成每次修改完json区点击变黄的“解析”按钮时也是如此。
2. 拖拽拼接并填写blockly指令块实时同步到json区。
这一步由`_server\MotaAction.g4`完成刚打开事件编辑器时初始解析出的指令块也会立即再同步到json区所以可能和表格中看到的不一样。
3. 最后事件的执行就和blockly没有任何关系了。所有`{"type": "xxx"}`的事件都是由`libs\events.js的core.events._action_xxx(data, x, y, prefix)`函数执行的其中data就是json指令对象。
![image](img/v2.7/drawTip.png)
搞清楚这个以后就可以开始动手修改了。首先打开上面所说的events.js搜索`_action_tip`鼠标悬停在其中的drawTip一词上就能查看这个API的参数注解。可以看到有第三个参数frame没有使用于是补上一项data.frame蓝色选中区
接下来要去修改`_server\MotaAction.g4`搜索“显示提示”。可以看到指令块的参数有很多类型比如EvalString支持`${}`表达式计算的文本、IdString填写图块ID、Bool勾选框、expression值块而我们需要的是类型是Int整数
于是补写在指令文本中同时还要修改下面的default默认模板和最后的json拼接式子。
这个式子比较难改,要注意双引号的匹配和冒号、逗号的位置。
在这个例子中需要追加蓝色选中区以及两个红框中的内容。
最后要去修改`_server\MotaActionParser.js`,搜索“`case "tip":`”,简单地追加蓝色选中区的内容。
4. 游戏胜败和重启游戏胜败分别对应“脚本编辑”快捷键N的win和lose函数在线游戏排行榜中每个结局的每个难度都有一张榜。
但同一结局只有最高难度有效您可以勾选“不计入榜单”来让这个本来有效的结局也无效。还可以勾选“不结束游戏”来先停止录制再演出ed.
重启游戏对应的函数为core.showStartAnimate()
5. 设置剧情文本的属性:
可用core.status.textAttribute获取当前的剧情文本属性只读。各项含义
1. 位置:“显示文章”不使用\b对话框效果时文本的位置默认为屏幕中央。如果您有大量集中的剧情文本都欲使用“up,null”的对话框效果则可以直接将此项设置为“顶部”而将剩余的个别剧情文本使用“center”或“down,null”的对话框效果反之亦然。
2. 偏移像素:上面的“位置”选择“顶部”或“底部”时和屏幕上下边缘的距离,也作为滚动剧情文本和左边缘的距离。
3. 对齐:默认为左对齐,可以修改此项来让显示文章的标题和正文都居中或都右对齐。
4. 标题色:准确地说是“标题和图像边框色”,格式和楼层画面色调一致,可以点击调色器按钮呼出调色器调色。
5. 正文色:如题,修改方法同上,从而避免频繁使用\r进行局部文本变色。
6. 背景色如题修改方法同上。但比起前两个这个也允许填写一个类似winskin.png的图片文件名。
7. 标题和正文字号:如题,正文字号推荐设置为偶数。
8. 行距和字符间距:如题,单位都是像素,行距推荐为正文字号的一倍半。
9. 粗体Y/N文本是否默认加粗推荐在大量粗体文本中穿插少量细体文本时使用以免频繁的`\\d`切换。
10. 打字间隔0表示不启用打字机效果而是一次显示完正整数表示每打一个字的毫秒数也作为`\\z`暂停的单位时间。
### 图片类指令
1. 显示图片和立绘的语法基本类似只不过多了编号1—50和淡入时间。
可以双击预览效果,还可以勾选“不等待执行完毕”来和后面的指令同时执行,比如同时淡入两张图片,或者淡入一张同时淡出/移动另一张。
编号较大的图片会遮盖较小的1—24号图片会被色调层遮盖25—40号图片会遮盖UI层41—50号图片会遮盖UI层。
此指令对应core.showImage()函数,编号真正的意义,详见“个性化”
2. 清除图片:如题,需要指定要清除的图片编号和淡出时间。
此指令对应core.hideImage(code, time, callback)
3. 图片移动:其实还包括了透明度渐变,“终点像素位置”指移动结束后的图片在视野中的左上角像素坐标(不填则表示单纯的透明度渐变),“不透明度”指渐变结束后的新的不透明度(不填表示单纯的移动),移动和透明度渐变都是匀速直线进行的。对应`core.moveImage(code, to, opacityVal, time, callback)`
4. 显示或清除动图:需要填写动图的文件名(带.gif后缀“起点像素位置”含义如前且必须填写可以双击指令块来预览第一帧的效果。
动图不支持淡入淡出和伸缩移动,如果不填任何参数则清除所有动图。
该指令对应core.showGif(name, x, y)函数。
5. 显示图片化文本这是您唯一显示镜像文字或旋转180°文字的机会。
显示出来后就会视为一张通常的图片,可以被清除和移动。
该指令对应core.drawScrollText(content, time, lineHeight, callback)
### QTE与全局商店
QTE即快速反应事件。一般表现为需要玩家在收到某信号后尽快做出正确操作如新新魔塔2中面对白银史莱姆王的猜拳战斗就需要根据其出拳的颜色尽快按下相克的数字键。
样板同样支持这类事件,一共有三种,这里先介绍两种。
一是“显示确认框”,它会显示一段支持`${表达式求值}`但不支持自动换行和其他转义序列的文字。然后要求玩家在一定毫秒数内选择“确定”或“取消”之一,如果超时就视为哪个都没选,直接继续执行后面的事件。\
您可以指定闪烁光标的初始停留位置是确定还是取消还可以指定超时毫秒数为0表示不限时间但玩家必须做出二选一。
此指令对应core.drawConfirmBox(text, yesCallback, noCallback)函数其中两个Callback分别为选择确定和取消后的回调函数。
二是“显示选择项”和RPG Maker不同我们的选择项不会和它之前的“显示文章”同时出现可以直接配上除对话框和打字机外的所有文字效果。
此指令对应core.drawChoices(content, choices)函数其中content为提示文字choices为各子选项文字组成的字符串数组。是的比起上面的函数这个不直接支持回调。
在没有提示文字的情况下一次能同时显示的子选项最多为13或15个。
和确认框一样选择项的超时值填0表示不限时间但玩家必须从中选择一个。
大于0的话超时视为什么都没选直接继续执行后面的事件。
每个子选项的文字只支持`${表达式求值}`和整行变色,请注意控制字数。
文字左侧也支持追加一个图标(多帧图块取第一帧),支持系统图标。
每个子选项还可以指定“出现条件”(不指定则一定出现),条件的写法和自动事件的触发条件一样,从而做出形如“怒气值满才显示大招选项”的效果。
如果实际执行时所有子选项都不满足出现条件,则直接跳过。
当然,如果非要做出“显示但选了没反应”的禁用项也不是不可以,
只不过往往需要套在一个死循环里并让其他子选项负责跳出这个循环。
为了方便地做出这种效果,样板提供了“全局商店”。
![image](img/v2.7/quickShops.png)
在“全塔属性——全局商店”中可以编辑各个商店,商店一共有三种:
1. 公共事件商店:最简单的一种商店,或者应该叫做给玩家准备的快捷功能更合适,因为它的内容完全不一定非得是个做买卖做交易的“商店”,也可以是诸如“开启或关闭主动技能”、“快速换上最强套装”之类的便捷功能。
多说一句鉴于全局商店列表最多只能同时显示12或14项还有一项是关闭列表因此您也可以准备一些永久道具设置适当的使用条件并在使用效果事件中去实现这些给玩家的快捷功能。当然全局商店的使用条件更加统一请自行权衡。
公共事件商店在用法上和一般的“插入公共事件”并无二致,同样可以提供一个参数列表。
2. 道具商店这种商店也很简单由第三种QTE指令实现但没有限时。
您可以在其中随意填写买卖的道具ID、存量、买卖价和出现条件。
存量不填视为无限,买入价不填视为只能卖(回收),卖出价不填视为只能买,出现条件的含义和选择项一致。
如果需要在游戏中对买卖价和对存量进行读写请读写core.status.shops
请注意使用道具商店的话务必保留project\images\winskin.png及其注册信息可以换成相同规格的同名图片。
3. 新版商店:用法非常灵活的一种商店,其外形酷似“显示选择项”但有一些不同。
首先和其他两种商店一样它多出了“商店id、快捷名称、未开启不显示”。
商店id只能使用全英数且必须两两不同。
“快捷名称”为显示在V键快捷菜单的名称请注意控制字数最好也两两不同以免玩家混淆。
勾选“未开启不显示”则此商店在开启前或禁用后不会出现在V键菜单中当商店总个数超过12或14个且随着游戏流程进度依次开新的关旧的时这个勾选项就很有必要了。
其次和其他两种商店不同您可以允许玩家预览它前提是V键菜单中显示了这对魔塔这种倡导完全信息的游戏来说非常有意义。
最后,比起常规的“显示选择项”,它不能指定超时毫秒数,每个子选项除“出现条件”外还多出一个“使用条件”。
实际执行中在所有子选项的最后会自动追加一个“离开”选项,选择其他子选项并执行后商店并不会立即关闭而是停在那个界面。就像胖老鼠和两部新新魔塔一样,只不过不支持长按连续购买。
“出现条件”和“使用条件”相搭配,让您能够很轻松地做出形如“消耗金币和各种材料的装备合成路线”这样的设定。
在预览模式下除“离开”外的子选项、以及交易模式下不满足“使用条件”的子选项,都会显示为灰色。
子选项的执行内容中需要手动处理扣费等问题此外在制作像两部新新魔塔一样会涨价的商店时您也需要自己准备变量变量名不必与商店id相同去记录已购次数或者直接记录价格并手动处理涨价问题。
有关全局商店的详细实现请参见“插件编写”句号键project\plugin.js
其中还提供了一个core.canUseQuickShop(id)函数来控制勇士什么时候可以通过V键菜单快捷使用哪些商店自变量id为商店id.
本质上,新版商店是套在一个死循环里的。您可以在子选项的执行内容中使用“跳出当前循环”指令来打断该子选项剩余的未执行内容而强制离开商店,
或使用“提前结束本轮循环”来打断未执行内容而强制重启商店。
同理公共事件包括公共事件商店和自动事件本质上是“一次性”的条件为false的后置条件循环因此使用这两个指令都能跳出它们。
## 数据相关类(绿色)
![image](img/v2.7/control&itemsG.png)
这类的指令会设置各种数据(如怪物属性、楼层属性、全塔属性、六大可读写块),处理弹窗输入和开关全局商店,以及控制玩家最最关心的勇士的各种行为。
### 设置各种数据的指令
1. 数值操作:最简单的就是最灵活的,本指令能够修改六大可读写块(状态、物品、变量、独立开关、临时变量、全局存储)的值。
修改的运算符有八种,“设为”会将右块的值代入左块,
“增加、减少、乘以、除以”则是对左块的值进行增减和扩大缩小,
除法如想只保留整数商(向零靠近)则改用“除以并取商”,
如想要余数(例如想取勇士生命值的后两位)则使用“除以并取余”,
“乘方”指的是将若干个(不一定是正整数)左块连乘起来的积代入左块。
如将黄钥匙数量变为其立方3则4把黄钥匙会变成64把4×4×4
指令的右块为一表达式可以使用任何值块和运算块甚至直接使用API.
如果需要连续使用本指令,建议除最后一个外都勾选“不刷新状态栏”,
以免意外触发自动事件、生命和魔力溢出甚至死亡生命小于等于0
2. 设置怪物属性:可以设置怪物的任何一项属性并计入存档。
怪物ID在blockly块中也可以填中文要求没有重复有的话请在事件编辑器顶部关闭“中文替换”功能需要设置的属性项在下拉框中选取。通过配置表格自行新增的属性下拉框里没有但可以写在json区再单击变黄的“解析”按钮或修改`_server\MotaAction.g4`文件最后的部分去追加。
本指令对应core.setEnemy(id, name, value)函数,完全等价。
最后的“值”和“数值操作”的右块写法一致(只支持写变化后的结果值,下同),注意设置怪物名字、映射名等字符串类型需要加引号。
3. 设置楼层属性:除了贴图和两个到达事件,其他属性都可以方便地修改。
楼层ID不填则视为当前楼层可以去“地图选点”浏览各楼层并复制ID.
注意修改“楼层中文名”、“状态栏中名称”、“默认地面ID”、“背景音乐”需要后缀名这些字符串类型都需要加引号几个“能否/是否”只支持修改为true或false三个坐标和天气、色调这些数组类型都需要加方括弧。本指令对应`core.events.setFloorInfo(name, value, floorId, prefix)`
4. 设置全局属性:即全塔属性中的“主样式”(无需再加引号)和装备孔列表。
修改装备孔列表时请注意,如果装备的道具属性中填写的装备类型是自然数,则可以【在列表结尾】随着游戏流程的推进解锁新的装备孔或移除装备孔(请先将身上的此类装备脱下)。
而如果装备的道具属性中填写的装备类型是装备孔名称,则可以随着游戏流程的推进修改装备孔的类型组成,如本来是两把剑一块盾改成一把剑两块盾(同样需要注意已经穿上的装备问题)。
总的来说进行这种修改后快速换装功能Ctrl/Alt+大键盘数字键)可能会出问题,请注意提醒玩家。
本指令对应core.events.setGlobalAttribute(name, value)函数。
5. 设置全局数值:如题,可以修改四种宝石和三种血瓶的基础值等。
如需使用脚本请直接修改core.values完全等价。
6. 设置系统开关:如题,可以用来随着游戏流程的推进解锁/移除状态栏的显示项或改动其他开关。
比如中途开关生命上限、加点和负伤,中途显隐魔力、技能、绿钥匙和破炸飞毒衰咒。
在游戏胜利时会将生命值作为分数上传到在线游戏排行榜,因此请在胜利前关闭生命上限再修改生命,比如根据钥匙等道具的持有情况进行加分。
请注意,即使您在游戏中途才将楼传变为平面塔模式,访问过的楼层依然已经记录了最后离开的位置。
如果想制作万能铁门钥匙,可以在适当的时候修改“铁门是否需要钥匙”。
本指令对应core.setGlobalFlag(name, value)函数实际会修改core.flags
### 导致勇士位置core.status.hero.loc变化的指令
这类指令都支持填写负坐标、超出地图宽高的坐标或小数坐标,
当勇士在这些异常坐标时【除第一个指令外】都可以正常执行。
可以用于一些特殊演出,但请记得在事件结束(玩家恢复行动)前改回正常。
1. 勇士前进一格或撞击:如题,会让勇士像自由行动时一样尝试前进一格。
如果可以前进但前方不可被踏入如门、怪物、箱子、NPC则会撞击并触发事件走到道具、踩灯或路障或用普通事件制作的陷阱等也会触发。
本指令可以正常触发跑毒和阻激夹域捕,滑冰事件就是在冰上执行了它。
本指令对应core.moveAction(callback)函数,请勿直接调用它。
2. 无视地形移动勇士:“动画时间”为每步的时间,不填则取玩家设定值。
可以勾选“不等待执行完毕”来和后面的指令同时执行比如让勇士和一个NPC肩并肩走。
本指令不会触发跑毒和阻激夹域捕,且会无视地形可进出性、可通行性,
不会触发任何事件就像“变量debug”为true时按住Ctrl键移动一样。
debug模式下勇士不会因为Ctrl键走出地图但本指令可以做到。
指令的最后一个参数为步伐口诀支持“上下左右前后”六种移动方向。连续的相同字可以合并如“上上”可以写作“上2”。勇士后退时跟随者们会照常前进。数不清楚格子时记得善用地图选点功能浏览地图。\
本指令对应core.eventMoveHero(steps, time, callback)函数,请注意不是`core.moveHero()`
3. 跳跃勇士:可以填写目标点坐标(支持双击从地图选点),
可以用带有冒号缩写量甚至API的表达式比如`["core.nextX(2)", "core.nextY(2)"]`json表示勇士越过面前一格即道具“跳跃靴”的效果。
跳跃高度和距离有关,原地跳跃的高度只有半格(可在下述函数中修改)。跳跃过程中跟随者消失,跳跃结束时跟随者聚集。
跳跃也支持异步效果如和NPC一起跳对应core.jumpHero(ex, ey, time, callback)函数其中callback为异步跳跃完毕的回调函数。
跳跃默认没有音效,您可以自行像支援怪和道具“跳跃靴”一样配上音效。
和无视地形移动勇士一样,勇士跳跃也会无视目标点的地形和阻激击域捕,不会触发目标点的任何事件。
4. 楼层切换:和前面的“楼梯、传送门”事件用法完全一样,但不可穿透。
此指令同样支持双击从地图选点坐标支持表达式和在json区填写传送的目标点图块ID在目标层唯一再点击变黄的“解析”按钮。
另外,正如本小节开头提到的,本指令比起“楼梯、传送门”事件更多地用于演出,因此您可以填写异常坐标。
5. 位置朝向切换:“跳跃勇士”不会改变勇士朝向,“楼层切换”又会导致重生怪复活。且这两个都会导致跟随者聚集,所以同楼层内改变勇士位置可以使用本指令(坐标和跳跃一样支持双击从地图选点以及表达式)。
本指令还可以用来让勇士原地转身不填坐标这样也不会聚集跟随者支持4种绝对朝向和4种相对转向。
### “数据相关”类的其他杂牌指令
以下杂牌指令负责弹窗输入、显伤战斗、道具装备、全局商店、行走图和队伍:
1. 接受用户输入:弹窗请求用户输入一个自然数或字符串,提示文字允许使用`${表达式计算}`。
请求输入自然数支持十六进制负整数会被取绝对值。小数会被向0取整其他非法输入会变为0.
请求输入字符串时,玩家点击取消则视为输入了空字符串。
输入的结果会保存在值块“变量input”中可供后续处理。
比如样板的生命魔杖就是一个例子,它允许玩家一次使用多个同种道具。
2. 更新状态栏和地图显伤:如题,可以勾选“不检查自动事件”来不检查。
本指令实际执行“脚本编辑——更新状态栏”即core.updateStatusBar()
3. 强制战斗点名和天降怪物指定ID中文替换只支持不重复的中文名强制战斗不会从地图删除图块也不会触发各点的战后事件黄点
此指令一般用于覆盖触发器的boss可以制作战前剧情然后强制战斗。
战后boss不立即消失可以继续进行一些演出如51层魔塔四区骑士队长的逃跑效果。
值得注意的是,因为是天降怪物(没有坐标),所以对这只怪物在属性修正以及战损计算等处涉及到怪物坐标的代码一律不起作用(比如它不会受局部光环的加成,也不会被任何怪支援)。
另一种强制战斗指令在“地图处理类”指定的是坐标而不是怪物ID.
4. 尝试使用道具和穿脱装备使用道具和穿戴装备需要指定ID中文替换规则和强制战斗一样
不能使用怪物手册请使用“特效声音类”的“呼出怪物手册”指令和楼层传送器如果“覆盖楼传事件”则没有关系使用中心对称飞行器则会跳过确认画面。实际对应core.useItem(itemId)函数。
穿脱装备对应core.loadEquip(equipId)和core.unloadEquip(type)函数。
道具使用失败或穿不上装备(比如没有或不满足条件)时会提示。
脱下装备需要指定类型,这里只能写自然数不能写名称。
5. 开关全局商店:本指令可以设置一个全局商店的启用和禁用状态,设为启用时也支持立即打开。
一般用于商店的实体NPC处再配合独立开关可以让勇士首次接触时先进行一些对话然后启用并打开全局商店。
6. 更改角色行走图:如题,文件名必须填写(支持双击选文件)。
文件必须放在project\images文件夹并注册且规格必须符合要求4帧总宽度至少128px高度不限。宽高必须为4的倍数
如果勾选“不重绘”就不会立即刷新从而避免大地图视角重置到以勇士为中心。本指令对应core.setHeroIcon(image,
noDraw)函数。
7. 跟随者入队和离队您可以用这一对指令来让跟随者入队和离队同样支持双击选文件。本指令对应core.follow()和core.unfollow()函数。
行走图和勇士的规格要求(尺寸不需要一样)、文件位置和注册方法相同。
离队可以不填文件名表示解散队伍只留勇士,如果填写文件名则尝试踢出队伍中第一个以此为行走图的跟随者。
入队成功后、以及尝试离队后队伍都会聚拢,大地图视角也会重置。
## 地图处理类(浅蓝)
![image](img/v2.7/maps&waits&raw.png)
这个类型的指令会影响三层地图矩阵的阵元,如果您觉得三层还不够用,“插件编写”(句号键)五图层插件欢迎您。
开始介绍前,首先明确一点:改变阵元不会立即影响事件的进程(自动事件除外)。
比如因为踩灯、路障和阻激夹域捕怪的分布变化导致勇士行走被妨害的区域发生变化,但不会立即触发妨害效果,而是要等到勇士下次行走。
在勇士所在点转变成(显示)一个门/怪物/道具/箱子/楼梯什么的(包括在脚下转变成/显示冰面)都不会立即触发事件,把这些图块移动/跳跃到勇士身上也是。
反之“隐藏事件”转变图块为0也不会立即中止当前的事件处理只是下次不会触发。
1. 强制战斗定点这是另一种强制战斗它指定坐标而不是怪物ID.
可以双击从地图选点(只能选当前楼层的,不填则取当前点),也可以用表达式指定坐标,坐标一次只能写【一个点】。
战斗后会自动从地图删除该点的怪物,并尝试插入该点的战后事件(黄点),成功触发时会改变当前点坐标到该点。
2. 开关门坐标写法同上限1个点同层开门时楼层ID可以略去不写。
关门的位置必须是空地“需要钥匙”只对同层开门有效。跨层开门请自己加判定本指令对应core.openDoor(x, y, needKey, callback)函数。
这对指令支持所有完整填写了“门信息”的四帧图块(自动元件除外),比如样板自带的三色墙和六色门。
可以勾选“不等待执行完毕”来实现异步效果(如同时开关多个门,具体速度取决于门信息)。
和上面的强制战斗一样,开门后将尝试插入该点的开门后事件(紫点),成功触发时会改变当前点坐标到该点。
3. 显隐事件和图层块这两对指令可以令三层地图矩阵的某些阵元在0与非0之间切换。
还以51层魔塔为例二楼右下角的小偷在游戏开始时是不显示的勇士进入四区后才出现。
也就是说这个小偷是一个“普通事件”内容是一些对话和打开35层魔龙处的暗道只不过没有勾选“启用”。
在适当的时候这个例子中是和29楼小偷对话后执行一个“显示MT2层1212点处的事件”指令就能显示出二楼的小偷。
同理勇士接触此小偷并处理事件事件结束前执行一个“隐藏同时删除当前点事件500毫秒”指令小偷就会从画面中淡出勇士可以任意在小偷存在过的位置走来走去而不会再触发什么。
所以,一次性陷阱(走到某个地方关上墙/机关门、冒出埋伏怪在触发后一定要及时隐藏。不然就会反复触发样板1层有例子可供参考。
“显隐事件”都可以双击从地图选点但是这样只能选一个点只想要楼层ID的话可以点击“复制楼层ID”按钮。在指令块中可以使用表达式作为坐标甚至可以将若干个点的横坐标依次填在x处而纵坐标对应填在y处json中写作多行两列的二维数组从而同时显隐多个点。
楼层ID省略则取当前楼层“动画时间”用于同层显隐从而表现出淡入淡出的效果。
“不等待执行完毕”的含义如前,您可以淡入一些点同时淡出另一些点。
值得注意的是,“隐藏事件”还提供了一个“同时删除”勾选框,勾选后无法再用“显示事件”指令显示出来。
删除后该点本身依然是启用状态,您可以把该点安全地直接转变为别的图块或让别的图块移动/跳跃到此点,比如把箱子/阻击怪推过来。
其他两个图层的图块也支持显隐,对游戏性的影响主要体现在显隐背景层的滑冰图块以及两个图层的单向通行箭头。
坐标和楼层ID的填法同上只不过这两个就没有淡入淡出效果了。
因为其他两个图层的图块不支持什么初始隐藏,如有需要,可以在“开场剧情”中统一提前隐藏。
显隐事件对应core.showBlock(x, y, floorId)和core.hideBlock(x, y, floorId)
同时删除对应core.removeBlock(x, y, floorId)函数,
显隐图层块对应`core.maps._triggerFloorImage(type, loc, floorId, callback)`
4. 转变图块和图层块、事件转向:这组指令可以修改三层地图矩阵的阵元。
先说图层块吧(前景、背景),坐标和楼层的填法同上,不支持淡入淡出。
转变图层块后,块的显隐状态不变,原来是隐藏还是隐藏。
接着说事件层,坐标和楼层的填法同上。有几个注意事项:
1. 新图块为0时“动画时间”全部用来淡出用于没有普通事件和“楼梯、传送门”的点会视为删除。
2. 转变图块也不影响显隐状态,该点原来是隐藏还是隐藏。
3. 同层把一种非0图块转变为另一种非0图块“动画时间”的前一半用来淡出原图块后一半用来淡入新图块。
4. 同层把0图块转变为非0图块“动画时间”全部用来淡入。
这对指令可以填写新图块的ID也可以填写数字如17是空气墙201起是怪物
如需让绑定了“行走图朝向”的npc48转向也可以直接使用“事件转向”指令和勇士一样支持7种转法从而避免一个个手写行走图ID的麻烦。
转变图块和图层块对应core.setBlock(number, x, y, floorId)和
`core.maps._triggerBgFgMap(type, name, loc, floorId, callback)`
5. 显隐贴图:这个指令可以用来显隐之前在“楼层属性”中介绍的楼层贴图。
显隐贴图不支持淡入淡出坐标为贴图左上角的【像素坐标】楼层ID不填则取当前层。实际执行`core.maps._triggerFloorImage(type, loc, floorId, callback)`
6. 移动和跳跃事件:这两个指令可以将地图一点的图块转移到另一点。
首先明确一点,这两个指令转移的【仅仅是图块】。起点的七彩事件不会被一同转移,终点的七彩事件也不会被覆盖。
从游戏性上讲,最终的效果是起点被“隐藏事件+同时删除”,勾选“不消失”时终点被“转变图块+显示事件”(终点原来的图块被覆盖)。
比如,阻击怪是“移动后不消失”,捕捉怪是“移动后消失”,支援怪是“跳跃后消失”。
这两个指令一次只能转移一个图块,双击从地图选点选择的是移动的起点和跳跃的终点(跳跃的起点请右击选取)。
任何一个坐标不填都视为当前点,比如“跳跃事件”什么坐标都不填就会让当前点图块原地跳跃。
和无视地形移动勇士一样,“移动事件”也没有碰撞效果,移动过程中会穿过勇士和一切地形。
“动画时间”为每步移动的时间和跳跃的用时,以及不勾选“不消失”时淡出的时间。
和“跳跃勇士”一样,“跳跃事件”默认也没有音效,可以自己搭配。
移动和跳跃实际对应core.moveBlock(x, y, steps, time, keep, callback)和core.jumpBlock(sx, sy, ex, ey, time, keep, callback)函数。
“移动事件”的步伐口诀只支持“上下左右”四个方向不支持“前后”即使是绑定了行走图朝向的NPC48也一样。
“不等待执行完毕”的用法如前,但几个图块再加上勇士以各异的速度和总步数移动时安排起来很麻烦,需要用到下述的“等待三姐妹”。
### 等待三姐妹、注释和原生js/json
在讲解“事件控制”(流程控制)类指令之前,这里插播几个比较杂牌的指令。
1. 等待固定时间:如题,可以用来实现复杂的集体移动效果。
比如说51层魔塔一区结尾的骷髅埋伏圈就是九只骷髅和四扇机关门组成的复杂演出。
每只骷髅开始移动时都不等待执行完毕,但又需要等待一小段时间再让下一只骷髅开始移动。
本指令还提供了一个勾选项“不可被Ctrl跳过”如果不勾选此项且当前【没有】正在执行的异步事件动画不算则Ctrl可以跳过等待。
2. 等待所有异步事件执行完毕:让我们来想象这样一个情景。
您使用了“移动事件”来移动一只怪物到勇士面前,并且“不等待执行完毕”。而下一条指令是“勇士前进一格或撞击”,以期触发战斗。
然而因为怪物移动需要时间,两个指令同时执行,所以战斗没法触发。
类似地,如果您在一个异步事件执行完毕之前就结束了整个事件流,让勇士恢复行动,那么可能这些异步事件还没来得及在游戏性方面生效,导致接下来会发生的事取决于玩家操作的时机和勇士的移速。
尽管这在RPG Maker中很正常怪物在地图上走来走去主角要躲着走但在我们的作品中是致命的。因为我们有录像系统在录像回放时很多耗时的东西和所有需要用户响应的东西会被跳过。
勇士的移速又可以很快(倍速播放),导致回放结果和原游戏不一致。
总之,当您希望确保一些异步事件完全生效后再开始执行新的指令或结束事件流,“等待所有异步事件执行完毕”就是您的不二之选了,事件编辑器也会在发现缺少本指令时弹窗警告。
3. 等待用户操作并获得键鼠信息前面提到三种QTE指令这是最后一种。
此指令的下一条指令为“清除所有动图”的话,会先清除再开始等待。
之前提到的“确认框”和“选择项”可以复现RPG Maker的回合制战斗
但没法做出更复杂的交互界面,比如技能/天赋树,以及样板的道具商店。
本指令会阻塞事件的执行直到玩家按下键盘上的某个键滚轮视为PageUp/PageDown键、或点击【视野】中的某个点、或经过了超时毫秒数不设置则不限时
解除阻塞后,下列值块可能发生变化:
1. “变量type”解除的原因0表示按键1表示点击-1表示超时。
2. “变量keycode”按键情况下的键值48—57为大键盘0—965—90为字母键A—Z其他键自己搜一下。
3. “变量x”和“变量y”点击情况下所点格子的相对坐标一定在0—12或0—14范围。
4. “变量px”和“变量py”点击情况下所点像素的相对坐标一定在0—415或0—479范围。
您可以根据这些值块去做流程控制,较为简单的场合(如几个键执行同一段指令,或横平竖直的单个矩形点击区)也可直接使用图中的场合块。
其中点击的场合块还支持双击预览判定区,用半透明的红色标出。
4. 添加注释:在上述的场合块里您还可以看到两个注释块。
注释块在游戏中会被忽略,一般用来帮您记住写的指令是用来做什么的。
请注意,右击块加注释的功能有问题用不了,请忽略那个功能。
5. 原生js/json脚本自带的指令毕竟有限但事件可以与脚本任意联动。
原生脚本分为两种原生js和原生json.其中后者会实际执行您自定义的`core.events._action_xxx(data, x, y, callback)`函数请注意这类函数在执行结束前务必调用core.doAction()函数去继续执行下一条指令。
如果学有余力,还可根据@zhaouv撰写的另一篇文档自定义新的blockly指令块来代替原生json就可以使用调色器、地图选点、选文件等功能啦。
原生js的用法就更广了首先它可以做一些事件做不到的事比如
core.addItem(itemId, n); // 静默增加n个道具n可为负数不填视为1
如果用事件增加道具的话就会有提示和音效,而这有时不是我们需要的,
尤其是在设计新道具时将“能否使用”填“true”并在使用效果事件中使用失败的场合返还道具时。
其次受制于Antlr—blockly的数据类型很多指令的参数只能写常数比如楼层ID.
这时我们就需要在原生js中使用万能的core.insertAction()大法,来突破这些限制。
比如说我们有一座20层高的塔楼层ID为MT0—MT19
某个事件中我们想让勇士随机传送到某个楼层,坐标不变。
那么就可以使用下列原生js
`core.insertAction({"type": "changeFloor", "floorId": "MT" + core.rand2(20)})`
连续使用多条json指令时请先声明一个空的指令数组`let todo = [];`)然后将需要的指令逐条追加到其末尾(`todo.push({"type": "xxx", ...});`最后再一次性core.insertAction(todo)
上述core.rand2(20)表示随机获取一个小于20的自然数另外您可能会问
既然都用js了为什么不直接用之前提到的core.changeFloor()函数呢?
这是因为原生js在不勾选“不自动执行下一个事件”的情况下
只能使用瞬间完成的函数或者drawTip、动画和音效这种虽然耗时但不影响游戏性的不能使用任何异步函数包括阻塞直到玩家操作的
系统常见可能会被造塔用到的API都在runtime.d.ts中给出
一般而言异步API的最后一个自变量都叫callback回调
在勾选“不自动执行下一个事件”的情况下原生js可以使用一个异步API只需将其callback参数填core.doAction请谨慎使用。
比如说我们知道天降强制战斗没有坐标所以不受光环等影响也无法触发战后事件那捕捉怪的战斗是怎么实现的呢答案是在原生js中使用了异步的core.battle(id, x, y, force, callback)函数这里force填true表示强制战斗callback填core.doAction表示战斗结束后继续处理事件。
熟练运用后还可以使用多个异步API每个以下一个作为回调。
## 事件控制类(深蓝)
![image](img/v2.7/flowCtrl.png)
在三个QTE指令中我们已经初见了流程控制的端倪。
只不过,它们的流程走向是由玩家的选择直接左右的。
能否通过对值块的比较等操作自动走向不同的流程分支呢?答案是肯定的。
1. 条件分歧:和“显示确认框”很相似,只不过这个是自动的。
和js的`if (...) {...;} else {...;}`完全等价,本指令需要内嵌一个值块(可以填逻辑表达式,常常是两个值块的比较,比如某道具是否足够)。
当此值块的值不为“false、0、null、undefined、NaN和空字符串”时
执行“如果:”和“否则:”之间的指令。
当此值块的值为这六个值之一时,执行“否则:”后面的指令。
2. 多重分歧本指令和js的switch语句有一定差别即使您有js基础也请仔细阅读接下来的说明。
事件执行到多重分歧指令时会先计算一次“判别值”结果记作key.
然后准备一个空的指令数组记作list.接下来从上到下扫描每个场合块,
如果一个场合块的“值”为default或计算结果和key相等
就把这个场合的指令组追加到list的末尾`core.push(list, [...])`
每次成功追加后,如果被追加的此场合块未勾选“不跳出”,
则无视下面的所有场合块直接结束扫描,否则继续扫描下一个场合块。
扫描完全结束后调用core.insertAction(list)付诸执行。
所以各场合块的顺序一定要安排好比如default可以没有此场合如果不勾选“不跳出”则一定要放在最后。
多重分歧常见的用法是判别值填常量各场合块填未知量且都勾选“不跳出”。把所有相等的场合筛选出来依次执行类似js的filter语法。
或者判别值填未知量所有场合块都不勾选“不跳出”且“值”填写为两两不同的常量如果有相同的则只有第一个有效。从而执行唯一的相等场合没有的话还可以补一个default场合类似js的else
if语法。
3. 循环遍历计数使用临时变量A—Z事件流结束时会和arg+纯数字的变量一起被清空)可以进行循环遍历,它们都属于前置条件循环。
循环遍历有两种,第一种是计数型。“从”和“到”之间的框填写临时变量的初始值,“到”和“步增”之间的框填写临时变量允许的边界值。
每轮循环开始前会【重新计算】边界值和步增,如果临时变量位于界外(减去边界值后和步增同号)则跳出循环。
每轮循环结束时,临时变量会加上步增值(可以为负数,请注意变号问题)。
4. 循环遍历(迭代):这是另一种循环遍历,可以迭代一个列表。
每轮循环前,会检查列表是否已空。已空则跳出循环,否则将列表的第一项【移除并代入】临时变量。
使用此项时请注意,列表中的字符串不会被自动解释为冒号缩写量。
显示文章等处如有需求,请使用`${core.calValue(temp:A-Z)}`来计算。
分歧和循环都可以嵌套,嵌套循环遍历请给内外层使用不同的临时变量。
此指令对应的js语法为`for (let term of list) {...;}`
5. 前/后置条件循环在《仙剑奇侠传1》中有一个非常经典的场景。
男主角李逍遥在扬州封城期间抓小偷不成反被失主诬告县太爷命令衙役刑讯逼供。在游戏中就表现为玩家需要对一个确认框选择“NO”如果选择“YES”就会再次弹出同一个确认框如此往复。
当然,这一节的流程控制都是自动的,不会这样欺负玩家。
客观上,前置条件循环和一个没有“否则”分支的条件分歧很相似,区别仅仅在于每次执行完分支内容后都会【跳转】回到条件检测之前,从而再次检测条件,还满足就再执行,如此往复。
而后置条件循环比起前置,区别在于第一轮循环是无视条件强制执行的。
它们对应的js语法分别为`while (...) {...;}和do {...;} while(...);`
6. 跳出当前循环如题遇到此指令时将检测当前是否在某个循环中还包括自动事件、公共事件、全局商店并跳出所在的【最内层】循环。如果不在任何循环中则什么也不做。大致相当于js的break;
7. 提前结束本轮循环:生效范围同上,不过是结束最内层的【本轮】循环。
换言之,对一般的前/后置条件循环会立刻跳转到下次检测条件前,
对循环遍历(计数)会立刻跳转到下次计算边界和步增并累加前,
对循环遍历(迭代)会立刻跳转到下次检查列表是否为空前。
还可用来“重启新版商店或道具商店”。若不在任何循环中,则什么也不做。
完全等价于js的continue;
8. 立刻结束当前事件:此指令将清空临时变量(以@temp开头和参数变量arg+纯数字),清空事件列表,中断一切事件处理,恢复勇士行动。
9. 触发系统事件:模拟勇士撞击/踩踏本楼层的某个点把触发的事件包括图块属性的script不包括阻激夹域捕和血网插队到当前事件列表中。
譬如该点是道具则会捡起来,是怪物则会强制战斗,是门则会尝试开门,
还会连带触发对应的afterXxx事件。实际执行core.trigger(x, y, callback)
而如果该点是楼梯则会直接触发传送(目标点是“保持不变”或三种对称点也以勇士位置而不是楼梯位置计算),是路障则会触发对应的毒衰咒(血网除外,它的原理是把伤害加到了阻激夹域里所以只有真实的行走才能触发)。是踩灯则会把勇士脚下变成踩过的灯,是普通事件(红)则会触发。滑冰在背景层,所以无法触发。至于推箱子...请自行探索。
10. 插入公共事件如题“参数列表”为一数组其各项会被依次代入值块“变量arg1”、“变量arg2”...而“变量arg0”会记录公共事件的名称。
实际执行core.insertCommonEvent(name, args, x, y, callback, addToLast)
11. 插入事件此指令可以无视目标点启用与否跨楼层插入任何点的普通事件或afterXxx事件执行。
这本是两年前公共事件尚未问世的权宜之计楼层ID不填视为当前楼层。参数列表意义同上只不过“变量arg0”这次是坐标。
其中“触发系统事件”和“插入事件”支持双击从地图选点。
## 特效声音类(褐色)
![image](img/v2.7/blockly.png)
这个类别的指令会负责动画、视角、色调、天气、音频等其他一些细节。
1. 画面震动会让画面左右震动时间必须为500毫秒的倍数且至少1秒。
实际执行core.vibrate(time, callback)函数。
2. 显示动画:如题,可以双击选文件并预览(预览的坐标锁定为视野中心)和试听/修改音效。
如需从地图选点请右击指令块坐标也可写hero令动画跟随勇士移动。
坐标不写则取当前点如果勾选“相对窗口坐标”则坐标应填写为0—12或0—14表示视野中的相对坐标如13×13样板填两个6表示视野中心
另外,即使勾选了“不等待执行完毕”,此指令也不会被视为通常意义上的异步事件,换言之没有其他异步事件的风险。
如果不勾选“不等待执行完毕”则等待的实际时长只取决于动画和音效无关同时开播。实际调用core.drawAnimate(name, x, y, alignWindow, callback)和core.drawHeroAnimate(name, callback)
3. 设置和移动视角:设置视角支持双击从地图选点,不填坐标则重置视角。
移动视角的动画时间为每动一格的时间,步伐数组只支持“上下左右”。
请注意勇士重绘时core.drawHero()函数视角也会随之重置。所以视角变化后勇士的坐标、朝向、显隐、行走图事件和API都提供了不重绘参数和跟随者情况暂时都不要动。
实际调用core.setViewport(x, y)和`core.moveViewport(steps, time, callback)`
其中前者的自变量为【像素坐标】且不必为32的倍数必要时可作为原生js使用来实现特殊的演出。
4. 显隐状态栏:如题,如果隐藏状态栏期间勇士需要恢复行动,则建议不隐藏竖屏工具栏以方便手机玩家。
实际调用core.showStatusBar()和core.hideStatusBar(showToolbox)
5. 显隐勇士:如题,动画时间为淡入淡出时间,异步勾选框用法如前。
实际调用core.triggerHero(type, time, callback)
6. 更改画面色调:色调可以用调色器调配,“动画时间”为渐变的总时间。
请注意渐变是在RGBA颜色空间中匀速直线运动因此效果可能不好画面闪烁同理。
7. 恢复画面色调:指将更改后的色调恢复到楼层的默认色调。
8. 画面闪烁“单次时间”必须为3的倍数前1/3时间用于将画面色调转变为目标色调后2/3时间用于恢复当前色调执行次数如题。
实际调用screenFlash(color, time, times, callback)
9. 更改天气如题可以选择“无、雨、雪、雾”之一强度需填小于等于10的正整数。
10. 播放背景音乐:如题,可以双击选文件并试听,并指定开始播放的秒数。
如前所述,当在游戏中触发楼层切换时(包括读档),如果 `flag:__color__、flag:__weather__、flag:__bgm__`这三个值块没有值,游戏当时的画面色调、天气、背景音乐就会变为楼层属性中的这三个设置项。
以上几个指令都提供了“持续到下个本事件”勾选框,勾选后,本次设置的值将会计入这三个值块。它们的拦截行为在“脚本编辑——切换楼层中”。
若不勾选,或恢复画面色调、设置天气为无(晴),就会清除对应的值块。您也可以随时对这三个值块进行手动干预。
11. 暂停和恢复背景音乐:如题,暂停时会记录暂停在了第几秒,恢复时可以选择从这个秒数继续或从头重播。
12. 预加载背景音乐和释放其缓存:在线游戏使用,前者的原理是静音播放。
最多同时缓存四首背景音乐由libs\core.js控制会自动释放最久未使用的但您也可以手动释放。
13. 播放音效和停止所有音效:如题,开播一个音效的同时可以停止其他的。
14. 设置音量只对背景音乐有效音量为小于等于100的自然数玩家设置值其实被开了平方渐变时间如题。
15. 呼出怪物手册和SL界面呼出手册只在勇士持有手册时生效关闭手册后事件继续。
呼出存档界面最多只能存一个档然后事件继续(读档后事件现场会恢复)
呼出读档界面如果不读档则事件继续,录像回放中这组指令被忽略。
16. 自动存档:读档后也会恢复事件现场,录像回放中会照常存档。
如不勾选“不提示”则会core.drawTip(“已自动存档”),此指令一般用于选择项/确认框之前。
## UI绘制类瞬间
![image](img/v2.7/uievent.png)
这个类别的指令全部是瞬间完成的有一一对应的API请放心使用除“绘制多行文本”外都可以逐个双击预览。游戏中这些指令都是画在uievent层的。
1. UI绘制并预览您可以把一堆UI绘制类指令塞进去然后双击黄框整体预览
请注意,“绘制多行文本”双击是多行编辑,必须塞到这里才能预览。
2. 清除画布擦除uievent层的一部分x和y为左上角坐标。
四个参数都支持使用表达式任何一个参数不填都会删除整个uievent层。
实际调用core.clearMap(“uievent”,x,y,width,height)和core.deleteCanvas(“uievent”),熟练后对其他画布使用也是可以的。
3. 设置画布属性:
1. 字体:`italic和bold`表示斜体和加粗,可省略,字号和字体用于绘制文本。
2. 填充样式:绘制实心图形时的默认填色,可用调色器调配。
3. 边框样式:绘制空心图形时的默认边框颜色,可用调色器调配。
4. 线宽度:绘制线段、箭头和空心图形时的默认线宽,单位为像素。
5. 不透明度不大于1的非负数此项为“画笔”的不透明度。
只影响接下来画的内容,已经画上去的不受影响。
6. 对齐:绘制单行文本的对齐方式,左对齐、左右居中、右对齐。
7. 基准线:绘制单行文本的基准线,有六种写法。
绘制单行文本的坐标其实是文本的基准点,
而对齐方式和基准线决定了基准点在单行文本矩形区的相对位置,
就像Windows“画图”的画布周围的八个拖动点一样
----------------- ------------------- -----------------
左对齐+顶部 左右居中+顶部 右对齐+顶部
----------------- ------------------- -----------------
左对齐+上下居中 左右居中+上下居中 右对齐+上下居中
----------------- ------------------- -----------------
左对齐+底部 左右居中+底部 右对齐+底部
----------------- ------------------- -----------------
基准线的“标准值”alphabet默认值比“底部”略高另外两种为“悬挂”和“表意文字”具体效果请自行双击预览。
8. $z$值初始为135$z$值较大的画布将覆盖较小的,详见“个性化”。
闪烁光标的$z$值总是比上述的值大1即默认为136.
4. 绘制文本:
单行,坐标为基准点的像素坐标,需配合上述“对齐”和“基准线”使用。
如果设置了最大宽度,那么在超出此宽度时就会保持比例压缩到这个宽度。
正文只支持`${js表达式求值}`,不支持其他一切转义序列,更不能手动换行。
实际执行core.fillText(uievent, text, x, y, style, font, maxWidth)
5. 绘制描边文本:同上,但不支持限宽,描边效果同状态栏数字的黑边。
实际原理是向四个方向各偏移1px以描边色绘制了四份一样的文本中央再以文本色覆盖一份。
本指令对应的`js函数为core.ui.fillBoldText('uievent', text, x, y, style, font)`
6. 绘制多行文本:双击进入多行编辑,预览请塞进黄框。
起点像素为左上角,只有设置了最大行宽才会对齐、居中和自动换行。
如果不设置颜色和字号,就会采用“设置剧情文本的属性”中的正文设置。
不设置行距就会采用字体大小的1.3倍建议采用偶数字号和1.5倍行距。
多行文本不支持字体样式的设置,使用的是全塔属性中的全局字体`Verdana`
如有需要,请使用“设置全局属性”指令来设置字体样式。
![image](img/v2.7/parabola.png)
7. 绘制几何图形:对应的`js函数为core.ui.fillXxx()和core.ui.strokeXxx()`
更复杂的曲线要用很多折线来拟合,譬如我想画抛物线$y=x^2/400$
`for(x=0;x<400;++x)core.ui.drawLine('uievent',x,x*x/400,x+1,(x+1)*(x+1)/400)`
图中绘制在了UI层`uievent`层也是一样的道理。
8. 绘制图片:同“显示图片”指令但功能有出入,比如这个支持旋转。
实际执行`core.drawImage('uievent',img,x,y,w,h,x1,y1,w1,h1)`
9. 绘制图标支持图块id和系统图标支持伸缩和选择哪一帧
支持32×32和32×48两种尺寸实际执行`core.drawIcon(name, id, x, y, w, h, frame)`
10. 绘制背景图背景色支持颜色数组也支持类似winskin.png的图片名。
使用图片时不透明度,纯色背景时的边框颜色,由“设置画布属性”指定。
本指令对应的`js函数为core.ui.drawBackground(left, top, right, bottom, posInfo)`
11. 绘制和清除闪烁光标:如题,光标的$z$值总是比`uievent`层大1.

View File

@ -54,251 +54,65 @@ core.fillText('test', '这是一段文字', 10, 30, '#FF0000', '16px Verdana');
更多详细API请参见[API列表](api)。 更多详细API请参见[API列表](api)。
## 自定义素材 ## 单点多事件
所有系统素材的图片都在 `project\materials` 目录下。
- `animates.png` 为所有动画效果。主要是星空熔岩,开门,毒网,传送门之类的效果。为四帧。
- `enemys.png` 为所有怪物的图片。
- `enemy48.png` 为所有48x32怪物的图片。
- `items.png` 为所有道具的图标。
- `npcs.png` 为所有NPC的图标。
- `npc48.png` 为所有48x32的NPC图标。
- `terrains.png` 为所有地形的图标。
从V2.7起,自动元件和 `tileset` 图片被分别放在了独立的文件夹中,而其余的由作者追加的图片(如动图、勇士和跟随者行走图、楼层贴图、对话皮肤)等留在了 `project\images` 文件夹。<br> 带有独立开关的商人算是一个最为简单的单点多事件的例子了,单点多事件最常用的指令就是“转变图块”(或关门)和“条件分歧”。下面以几个具体例子来进行详细说明:
系统会读取`icon.js`文件并获取每个ID对应的图标所在的位置。 1. 打怪变成门或道具、开门变成怪或道具怪物、门、道具都是系统触发器直接利用afterXxx事件。如
### 背景和前景图层
从V2.4.1开始,样板允许多个图层叠加,最多支持背景层、事件层和前景层三个图层。 战后事件:关门`yellowDoor`(原地关上了一扇黄门)
在地图编辑器中绘图时,下拉框选中“背景层”或“前景层”即可在对应的图层上绘图。 战后事件:转变图块为`yellowKey`(怪物掉落了黄钥匙)
其中背景层和前景层可以使用任何素材以及使用自动元件autotile 开门后事件:转变图块为`greenSlime或yellowKey`(开门变成了史莱姆或黄钥匙)
可以使用`showBgFgMap`, `hideBgFgMap`, `setBgFgBlock`等事件对背景和前景图层进行操作 打怪变成别的怪、开门关上别的门、门和怪来回变的,用独立开关计数
### 使用自己的图片作为某层楼的背景/前景素材 如有批量需求请使用“脚本编辑——afterXxx”函数。
2. 打怪/开门/捡道具后变成传送点或npc
由于HTML5功能素材有限导致了对很多比较复杂的素材比如房子内等无法有着较好的绘图方式。 这时的传送点就不能用“楼梯、传送门”事件了,而应该用只有一条“场景切换”指令的普通事件。
此事件不勾选“覆盖触发器”,这样怪物、门和道具的系统触发器会触发。
为了解决这个问题,我们允许用户自己放置一张或多张图片作为某一层的背景/前景素材。 在对应的afterXxx事件中“转变图块为”传送点或npc淡入效果更佳哦
要启用这个功能,我们首先需要在全塔属性中将可能的图片进行注册。 请注意因为道具是可通行的如果勇士走到道具上就会和npc重合。
``` json
"images": [ // 在此存放所有可能使用的图片
// 图片可以被作为背景/前景图,也可以直接用自定义事件进行显示。
// 图片名不能使用中文,不能带空格或特殊字符;可以直接改名拼音就好
// 建议对于较大的图片,在网上使用在线的“图片压缩工具(http://compresspng.com/zh/)”来进行压缩,以节省流量
"bg.jpg", "house.png", "bed.png"// 依次向后添加
];
```
!> 请使用网上的一些[在线图片压缩工具](http://compresspng.com/zh/)对图片进行压缩,以节省流量。 3. 懒人的选择利用“图块类别x,y”和“图块IDx,y”等值块集中处理
之后,我们可以在每层剧本的`"images"`里来定义该层的默认背景/前景层的图片素材 如果您实在搞不清楚“覆盖触发器”和“通行状态”这两项,那就干脆勾选前者并把后者设为不可通行,本希望可以通行的场合就得用“无视地形移动勇士”指令前进一步。
从V2.5.4开始贴图也允许进行帧动画。从V2.7开始,楼层贴图使用事件编辑器编辑。 用自动事件去转变图块,然后利用上述两个值块判定当前图块的状态等,再用“强制战斗”、“开门(需要钥匙)”和`core.getItem(id)`分别处理吧。
``` json
[ // canvas为贴图所在的图层可以写bg、fg或auto。"disable": true表示初始隐藏frame为总帧数
{"name": "bg.jpg", "canvas": "bg", "x": 0, "y": 0, "disable": true, "sx": 0, "sy": 0, "w": 416, "h": 416, "frame": 4},
] // x和y为绘制的左上角坐标sx和sy为裁剪的左上角坐标w和h为裁剪的宽高不支持伸缩
```
关于图层,`bg` 和 `fg` 分别表示该贴图全部画在背景层(如沼泽)或前景层(如云),被勇士遮挡或遮挡勇士。<br>`auto` 表示上部分画在前景层,下部分画在背景层。从而可以达到一个“自动调节遮挡的效果”。举例:树、房子等等。<br>
!> 如果写 `auto` 的话,最好让 `x, y` 和图片高度都是 `32` 的倍数!<br>
`frame` 为图片的帧数,可选。如果进行了设置,则会将该贴图视为帧动画,并【从左到右】切分成对应的帧数。<br>
例如假设图片是100x100的且帧数设为4则视为四帧帧动画每次绘制的图片大小实际上是25x100。
关于楼层贴图和前景、背景层的层叠覆盖关系,默认是:**地板 - 背景贴图 - 背景图块 - 事件 - 勇士 - 前景贴图 - 前景图块**。 ## 并行脚本:即时制的希望?
可以通过修改`libs/maps.js`的`drawBg`和`drawFg`函数来改变其覆盖关系。 如前所述,自动事件可以让您不用考虑可能导致各值块发生变化的缘由,而是简单地在刷新状态栏时检测这些值块是否满足某些特定的关系。
然而,自动事件依然是通过插入到当前待执行指令队列的开头,或追加到队列的结尾来执行的。换言之,它占用的是事件流本身的线程资源。
那形如bgs、bgv、飘云飘雾、地图背景旋转等即使玩家挂机也会照常执行的特效该怎么办呢
js语言其实是没有多线程的但我们可以写一些浏览器帧刷新时执行的脚本也就是“并行脚本”。
并行脚本分为两种,全塔并行和楼层并行。前者在“脚本编辑—并行脚本”,后者在楼层属性。
一般来说当您有多个楼层需要执行相同的并行脚本时建议写在前者并通过对core.status.floorId的范围进行判定来决定具体执行的内容。
并行脚本将被系统反复执行执行的时机是“浏览器帧刷新”换言之相邻两次执行的间隔取决于浏览器或设备的性能上限为60fps即每秒60次。
如果有一个bgs是1秒长的心跳声我们把它注册到了全塔属性的音效中。
假设这个bgs要被用于MT0层那么我们在MT0层的“楼层属性——并行脚本”中写这样的代码
``` js ``` js
////// 绘制背景层 ////// if (core.hasFlag('frame')) {
maps.prototype.drawBg = function (floorId, ctx) { // 剧情事件中将“变量frame”设为正整数来开启bgs设为0来关闭
var onMap = ctx == null; core.status.hero.flags.frame %= 60000; // 防止挂机太久导致溢出
if (onMap) { if (core.getFlag('frame', 0) % 60 === 0)
ctx = core.canvas.bg; core.playSound('heartBeat.wav'); // 每60帧即1秒播放一次
core.clearMap(ctx); ++core.status.hero.flags.frame; // 帧数加1
}
this._drawBg_drawBackground(floorId, ctx); } // 其他特效也是一样的用法。
// ------ 调整这两行的顺序来控制是先绘制贴图还是先绘制背景图块;后绘制的覆盖先绘制的。
this._drawFloorImages(floorId, ctx, 'bg');
this._drawBgFgMap(floorId, ctx, 'bg', onMap);
}
``` ```
楼层贴图可以被事件隐藏和显示,详见[隐藏贴图](event#hideFloorImg隐藏贴图)的写法。
**如果要让贴图的某些点不可通行则可以使用noPass或者空气墙。**
!> 小技巧:可以使用帧动画贴图来贴一些大型怪物,比如魔龙、章鱼,或者《永不复还》中的恐怖利刃等等。如果使用帧贴图来贴怪物,则可以使用一个“透明的怪物”放置在对应位置并写上具体属性数值(这样就可以进行战斗和显伤了);然后可以使用[displayIdInBook](element#怪物的朝向问题)在怪物手册中将该透明怪物映射到另一个有素材的怪物ID上。战斗完毕后使用[隐藏贴图](event#hideFloorImg隐藏贴图)事件将贴图隐藏即可。
### 使用便捷PS工具生成素材
如果我们有更多的素材要求我们可以使用“便捷PS工具”进行处理。
![便捷PS工具](img/ps.png)
我们可以打开有需求改变的素材和我们需要被替换的素材然后简单的Ctrl+C和Ctrl+V操作即可。
便捷PS工具同样支持图片色相的修改和RMXP几乎完全相同。
用这种方式,我们能极快地替换或素材,包括需要新增的怪物。
### 添加素材到游戏
在使用地图编辑器编辑的过程中我们有可能会出现“该数字和ID未被定义”的错误提示。
这是因为,该素材没有被定义,无法被游戏所识别。
!> 在V2.0中我们可以简单的在地图编辑器中新增素材以及定义新增素材的ID和数字但是仍然**强烈建议**对素材的机制进行了解。
#### 素材的机制
本塔所有的素材都拥有三个属性:**ID****索引****数字**。
- **ID** 为该素材的唯一标识符任何两个素材的ID都不能相同。
- **索引** 为该素材的在对应图片上的图标索引,即该素材是图片上的第几个。
- **数字** 为该素材的对应数字,以方便地图的生成和存储。
**`ID-索引` 对应关系定义在icons.js文件中。该文件将唯一确定一个ID在图片上所在的位置。**
**`ID-数字` 对应关系定义在maps.js文件中。该文件将唯一确定一个ID对应的数字是多少。**
在V2.0中,我们可以在地图编辑器中很方便查看每个图块的三个属性信息。
#### 注册素材
在V2.0的地图编辑器中要注册新素材我们只需要在图块属性一栏输入新素材的ID和数字。
![素材注册](./img/register.png)
ID必须由数字字母下划线组成数字在1000以内且均不能和已有的进行重复。
之后刷新编辑器即可。
我们也可以进行自动注册只需要点击“自动注册”按钮将对该栏下所有未注册的素材进行自动注册自动分配ID和数字
素材注册完毕后,即可在游戏中正常使用,也可以被地图生成器所识别(需要重开地图生成器)。
#### Autotile自动元件的注册
但是通过上面这种方式我们是没办法新增并注册Autotile的。
除了替换样板现有的几个外如果我们还需要新添加Autotile
1. 下拉框切到“追加素材”导入文件到画板然后导入一张Autotile自动元件图片。
2. 下拉框选择autotile然后点“追加”
3. 看到成功的提示后刷新编辑器即可。
### 额外素材
从V2.4.2开始HTML5魔塔样板开始支持额外素材。
具体而言通过上面的“素材导入”的方式确实可以有效地添加素材到游戏。但是如果想增加大量自定义素材需要通过便捷PS工具将这些素材全部导入到`terrains.png`中,并且全部是单列,极度不友好。这也导致了野外风的制作相对变得很困难,增加了大量素材处理的工作量。
额外素材就是为了解决这个问题而被提出。
所谓`额外素材`即用户可以自定导入任意张素材图片无需PS无需注册即可直接在游戏中使用。这一点已经十分向RM靠拢了。
要使用额外素材,请将你需要的素材图片放在 `project\tilesets` 目录下,并在`全塔属性`的`tilesets`中定义图片名。
**该素材的宽高必须都是32的倍数且图片上的总图块数不超过1000即最多有1000个32*32的图块在该图片上。**
```json
// 在全塔属性中的tilesets导入素材
"tilesets": ["1.png", "2.png"] // 导入两个额外素材文件名分别是1.png和2.png
```
刷新后,系统会自动加载该素材并添加到素材区。
额外素材无需导入,无需注册。在`tilesets`中定义了图片后即可直接使用绘图无需再注册其数字和ID。其ID、索引和数字均为系统自动分配且不允许修改。
请注意额外素材的ID、索引和数字与该图片在tilesets数组中的index及该素材在图片上的位置都有关系。
!> **因此如果对`tilesets`数组随意删除或修改顺序,可能会导致所有额外素材全部发生变化!这点请务必注意!!!**
除此之外,额外素材在游戏中的使用和正式素材都是一致的,也能在前景或背景图层绘制。
额外素材可以使用“tileset平铺”的方式进行绘制一次绘制一个矩形区域。
“辅助工具”中提供了“额外素材合并”如果使用此功能请不要对额外素材进行基于ID、索引和数字的判定和读写等操作如确有此需求可以创建一些玩家不可达也不可预览的隐藏样板层然后用等量代换的办法去从样板层取用。
## 自定义道具效果
本节中将继续介绍如何自己编辑一个道具的效果。
道具效果的具体实现都在 `project\items.js` 中。
### 即捡即用类道具cls: items
对于即捡即用类道具,如宝石、血瓶等,我们可以简单地修改全塔属性中的 `values` 一栏即可。
如果你想要同种宝石在不同层效果不同的话,可以进行如下操作:
1. 在楼层的ratio中定义宝石的比率比如1-10的写111-20层写2等
2. 修改获得道具的itemEffect函数编辑器中双击进行编辑
``` js
core.status.hero.atk += core.values.redGem * core.status.thisMap.ratio
```
如果不是倍数增加(比如线性增加)也可以类似来写
``` js
// 一个二倍线性增加的例子
core.status.hero.atk += core.values.redGem + 2*core.status.thisMap.ratio
```
### 消耗类道具cls: tools永久类道具cls: constants
如果要自己实现消耗类道具或永久类道具的使用效果,则需修改`items.js`中的canUseItem和useItem两个函数。
具体过程比较复杂需要一定的JS能力在这里就不多说了有需求可以找`艾之葵`进行了解。
从V2.6.6起,道具的“图块属性”中,提供了 `useItemEvent` 项,您可以用事件而不是脚本去书写道具的使用效果(对 `cls: items` 也有效但会打断寻路),参见样板的黄宝石和生命魔杖。
如果弄不清楚 `canUseItem` ,也可以干脆统一填写为 `"true"`,先斩后奏,并在使用效果中再行判定,如果发现其实使用失败了,就悄咪咪返还给勇士一个该道具,参见样板的破墙镐和炸弹。
### 实战!拿到神圣盾后免疫吸血、领域、夹击效果
1. 在itemEffect中修改拿到神圣盾时的效果标记一个自定义Flag。
``` js
core.status.hero.def += 100;
core.setFlag("shield5", true); // 增加一个自定义Flag已经拿到神圣盾
```
2. 免疫吸血效果在脚本编辑的getDamageInfo中编辑成如果存在神圣盾标记吸血伤害为0。
``` js
function (enemy, hero_hp, hero_atk, hero_def, hero_mdef, x, y, floorId) {
// ... 上略
// 吸血
if (this.hasSpecial(mon_special, 11)) {
var vampireDamage = hero_hp * enemy.value;
// 如果有神圣盾免疫吸血等可以在这里写
// 也可以用hasItem或hasEquip来判断装备
if (core.hasFlag("shield5")) vampireDamage = 0; // 存在神圣盾吸血伤害为0
vampireDamage = Math.floor(vampireDamage) || 0;
// 加到自身
if (enemy.add) // 如果加到自身
mon_hp += vampireDamage;
initDamage += vampireDamage;
}
// ... 下略
```
3. 免疫领域、夹击、阻击效果在2.4.1之后可以直接将flag:no_zone设为true来免疫领域效果其他几个同理。
``` json
[ // 写在获得道具后事件
// 设置不同的flag可以分别无视对应的阻激夹域效果
{"type": "setValue", "name": "flag:no_zone", "value": "true"}, // 免疫领域
{"type": "setValue", "name": "flag:no_repulse", "value": "true"}, // 免疫阻击
{"type": "setValue", "name": "flag:no_laser", "value": "true"}, // 免疫激光
{"type": "setValue", "name": "flag:no_betweenAttack", "value": "true"}, // 免疫夹击
{"type": "setValue", "name": "flag:no_ambush", "value": "true"}, // 免疫捕捉
{"type": "setValue", "name": "item:amulet", "value": "1"} // 免疫路障
]
```
4. 如果有更高的需求,例如想让吸血效果变成一半,则还是在上面这些地方进行对应的修改即可。
## 新增门和对应的钥匙
如果要新增一个门和对应的钥匙,只需要进行如下三步:
1. 在 `project\images\animates.png``npc48.png` 中添加开门的四帧动画并注册,其中第一帧也作为未开启的静止门。
2. 在图块属性中将其默认触发器改为 `openDoor`(如果依然写 `null` 则和三色墙一样可以用来制作暗墙),动画帧数填 `1` 表示门未开启时静止在第一帧。
3. 在 `doorInfo` 中填写需要哪些钥匙(可以填任何消耗类道具)各多少把,开关门时间、开关门分别播放什么音效等。
## 覆盖楼传事件 ## 覆盖楼传事件
对于特殊的塔,我们可以考虑修改楼传事件来完成一些特殊的要求,比如镜子可以按楼传来切换表里。 对于特殊的塔,我们可以考虑修改楼传事件来完成一些特殊的要求,比如镜子可以按楼传来切换表里。
@ -314,23 +128,6 @@ function (enemy, hero_hp, hero_atk, hero_def, hero_mdef, x, y, floorId) {
除了覆盖楼传事件外,对于快捷商店、虚拟键盘等等也可以进行覆盖,只不过是仿照上述代码重写对应的函数(`openQuickShop`,`openKeyBoard`)即可。 除了覆盖楼传事件外,对于快捷商店、虚拟键盘等等也可以进行覆盖,只不过是仿照上述代码重写对应的函数(`openQuickShop`,`openKeyBoard`)即可。
## 自定义怪物属性
如果你对现有的怪物不满意,想自行添加怪物属性也是可以的。具体参见脚本编辑的 `getSpecials`
你需自己指定一个special数字修改属性名和属性提示文字。提示文字可以直接写字符串或写个函数传入怪物。
如果要改动怪物在手册中的显示数值(也会被用于伤害计算,如模仿),请修改下面的 `getEnemyInfo` 函数。
如果要修改伤害计算公式,请修改下面的 `getDamageInfo` 函数。请注意,如果无法战斗,该函数必须返回`null`。
!> 如果改动了伤害计算公式,可能导致临界计算崩掉,因此建议将全塔属性中的`useLoop`置为true。
对于毒衰咒、自爆、退化怪物和加点、仇恨值累加等战斗后结算在脚本编辑中的 `afterBattle` 函数中。
对于领域、夹击、阻击、激光、捕捉怪物的检查在脚本编辑中的 `updateCheckBlock` 函数中。
如果想给怪物在血攻防之外添加新的数值项,请阅读 `@zhaouv` 撰写的另一篇文档,并配置表格来实现。
## 自定义快捷键 ## 自定义快捷键
如果需要绑定某个快捷键为处理一段事件,也是可行的。 如果需要绑定某个快捷键为处理一段事件,也是可行的。
@ -363,16 +160,6 @@ case 89: // 使用该按键的keyCode比如Y键就是89
可以使用altKey来判断Alt键是否被同时按下。 可以使用altKey来判断Alt键是否被同时按下。
## 公共事件
从V2.5.4开始,样板提供了“公共事件”下拉框,我们可以在里面用事件编辑器进行编辑,并通过`{"type":"insert"}`进行调用。
![公共事件](./img/commonEvent.png)
具体详见[插入公共事件或另一个地点的事件并执行](event#insert插入公共事件或另一个地点的事件并执行)。
当然,继续使用**插件**的写法也是可以的。
## 插件系统 ## 插件系统
在H5中提供了“插件”系统。在V2.6中提供了一个插件下拉框,用户可以自行创建和写插件。 在H5中提供了“插件”系统。在V2.6中提供了一个插件下拉框,用户可以自行创建和写插件。
@ -400,20 +187,6 @@ this.myfunc = function(x) {
详见[函数的转发](script#函数的转发)。 详见[函数的转发](script#函数的转发)。
## 标题界面事件化
从V2.5.3开始我们可以将标题界面的绘制和游戏开始用事件来完成。可以通过绘制画布、全塔属性flags中的startUsingCanvas可以决定是否开启标题界面事件化。
然后就可以使用“事件流”的形式来绘制标题界面、提供选项等等。
在这里可以调用任意事件。例如,可以贴若干个图,可以事件切换楼层到某个剧情层再执行若干事件,等等。
关于选项样板默认给出的是最简单的choices事件你也可以使用贴按钮图循环处理+等待操作来定制自己的按钮点击效果。
!> 开始游戏、读取存档、录像回放的效果已经默认给出,请不要修改或删减这些内容,以免出现问题。
标题界面事件全部处理完后将再继续执行startText事件。
## 手机端按键模式 ## 手机端按键模式
从V2.5.3以后,我们可以给手机端增加按键了,这样将非常有利于技能的释放。 从V2.5.3以后,我们可以给手机端增加按键了,这样将非常有利于技能的释放。
@ -471,14 +244,13 @@ this.myfunc = function(x) {
如果是在需要给状态栏新定义项目,则需要进行如下几个操作: 如果是在需要给状态栏新定义项目,则需要进行如下几个操作:
1. 定义ID比如攻速我就定义speed暴击可以简单的定义baoji你也可以定义其他的ID但是不能和已有的重复。这里以speed为例。 1. 定义ID比如攻速我就定义speed暴击可以简单的定义baoji你也可以定义其他的ID但是不能和已有的重复。这里以speed为例。
2. 在index.html的statusBar中46行起进行该状态栏项的定义。仿照其他几项插在其应当显示的位置注意替换掉相应的ID。 2. 在index.html的statusBar中进行该状态栏项的定义。仿照其他几项插在其应当显示的位置注意替换掉相应的ID。
``` html ``` html
<div class="status" id="speedCol"> <div class="status" id="speedCol">
<img id="img-speed"> <img id="img-speed">
<p class='statusLabel' id='speed'></p> <p class='statusLabel' id='speed'></p>
</div> </div>
``` ```
3. 在editor.html中的statusBar383行起仿照第二点同样添加这一项如果不进行则会地图编辑器报错。editor-mobile.html同理。
4. 使用便捷PS工具打开project/icons.png新增一行并将魔力的图标P上去记下其索引比如37从0开始数 4. 使用便捷PS工具打开project/icons.png新增一行并将魔力的图标P上去记下其索引比如37从0开始数
5. 在main.js的this.statusBar中增加图片、图标和内容的定义。 5. 在main.js的this.statusBar中增加图片、图标和内容的定义。
``` js ``` js
@ -502,7 +274,7 @@ core.statusBar.speed.innerHTML = core.getStatus('speed');
// 设置其显示内容为flag:speed值无需额外进行定义。 // 设置其显示内容为flag:speed值无需额外进行定义。
core.statusBar.speed.innerHTML = core.getFlag('speed', 0); core.statusBar.speed.innerHTML = core.getFlag('speed', 0);
``` ```
总的来说不建议这样做,因为 `main.js`几个 `html` 文件不在 `project` 文件夹,会导致随样板更新迁移接档变得困难。 总的来说不建议这样做,因为 `main.js``html` 文件不在 `project` 文件夹,会导致随样板更新迁移接档变得困难。
## 技能塔的支持 ## 技能塔的支持
从V2.5开始,内置了"二倍斩"技能,可以仿照其制作自己的技能。要支持技能塔,可能需要如下几个方面: 从V2.5开始,内置了"二倍斩"技能,可以仿照其制作自己的技能。要支持技能塔,可能需要如下几个方面:
- 魔力(和上限)的添加;技能的定义 - 魔力(和上限)的添加;技能的定义

View File

@ -3,276 +3,86 @@
在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔! 在这一节中,将详细介绍做一部塔的流程。现在,让我们来做一部单层塔!
## 前置需求 ## 前置需求
你需要满足如下条件才能进行制作: 你需要满足如下条件才能进行制作:[样板下载地址](https://github.com/ckcz123/mota-js/releases)。
- Windows 8 以上操作系统Windows 7 需要安装 .Net Framework 4.0。(能打开同目录下的“启动服务.exe”即可 1. 操作系统:
- 其他电脑则需安装 [python 3.8.2](https://www.python.org/getit/) 或更高版本能打开server.py即可 Windows 也可以这样做)。 - Win8或更高版本Win7则需要安装 .Net Framework
- 安卓手机端需要下载最新版的 [HTML5安卓造塔器](https://h5mota.com/games/_client/H5motaMaker.apk)。 4.0(能打开根目录的“启动服务.exe”即可
- [Chrome浏览器](https://www.google.cn/chrome/)。其他浏览器可能会导致本地服务器产生闪退等现象。 - 其他电脑则需安装[python
- 强烈推荐安装一个很好的文本编辑器:[VSCode](https://code.visualstudio.com/download)。在某些需要直接修改文件的场合,可能会非常重要。 3.8.3](https://www.python.org/downloads/)或更高版本能运行根目录的server.py即可Windows也可以这样做
- 安卓手机需要安装[HTML5安卓造塔器](http://h5mota.com/games/_client/H5motaMaker.apk)推荐搭配ES文件浏览器。
2. [chrome浏览器](http://google.cn/chrome):其他浏览器可能导致本地服务闪退。
3. (强烈推荐)[VScode](http://code.visualstudio.com/download)最适合HTML5项目的文本编辑器能进行跨文件的正则搜索和替换也能完整发挥根目录的runtime.d.ts文件的作用。
只要满足了上述条件,你就可以开始做自己的塔啦! 只要满足了上述条件,你就可以开始做自己的塔啦!
## 启动HTTP服务 ## 启动HTTP服务
与编辑器闭源的 RPG Maker MV 不同,本样板对文件的绝大部分修改是通过网页编辑器经由本地 HTTP 服务完成的,这样做也有助于编辑器跨平台并最大限度地复用运行时代码,还可以让玩家在在线游戏时查看游戏工程。<br> 与编辑器闭源的RPG Maker
在根目录下有一个“启动服务.exe”运行之。非 Windows 电脑则需使用命令行运行 server.py手机端则使用造塔APP。 MV不同本样板对文件的绝大部分修改是通过网页编辑器经由本地HTTP服务完成的这样做也有助于编辑器跨平台并最大限度地复用运行时代码还可以让玩家在在线游戏时查看游戏工程。
![启动服务](img/server.png)
* “启动游戏”按钮将打开一个网页(您也可以手动在浏览器中键入 127.0.0.1:1055/index.html 同时开启多个启动服务则1056、1057顺延你能在里面看到现在游戏的效果。 在根目录下有一个“启动服务.exe”运行之。非Windows电脑则需使用命令行运行server.py安卓手机则使用造塔器
* “地图编辑器”允许你以可视化的方式进行编辑游戏(这个名称为历史遗留,两年前它真的只能编辑地图)。您也可以手动在浏览器中键入 127.0.0.1:1055/editor.html
* 以下为 Windows 专用的一些辅助工具由C#编写: ![image](img/v2.7/server.png)
* “便捷PS工具”能让你很方便的对自定义素材进行添加。参见[自定义素材](personalization#自定义素材)。 1. 启动游戏打开127.0.0.1:1055/index.html同时开启多个启动服务则1056、1057顺延下同。你能在里面看到现在游戏的效果。
* “地图生成器”能让你从已有的截图如RMXP项目中立刻生成可被本样板识别的地图数据。 2. 地图编辑器打开127.0.0.1:1055/editor.html竖屏则为editor-mobile.html这是您整个制作流程的核心页面。\
* “怪物数据导出”能让你从RMXPRPG Maker XP 1.03下同中导出怪物数据而被HTML5魔塔使用。 以下为Windows专用的一些辅助工具位于“辅助工具”文件夹由C#编写:
* “RM动画导出”能让你从RMXP中导出动画而被HTML5魔塔使用。 3. 便捷PS工具能方便地替换和新增素材。
* “JS代码压缩”能对JS代码和音像素材进行压缩从而减少IO请求数和文件大小。 4. 地图生成器识别RPG Maker魔塔的地图截图生成HTML5魔塔的地图数据。
* “额外素材合并”能将用到的tileset素材重新拼成更少的图片并更新对应的地图矩阵。 5. 怪物数据导出从RPG Maker XP
* “伤害和临界值计算器”是一个很便捷的小工具,能对怪物的伤害和临界值进行计算。 1.03游戏导出怪物数据用于HTML5魔塔或使用excel查看。
* “动画编辑器”能让你编辑已有的animate动画文件或自己利用图片制作全新的动画。 6. RM动画导出从RPG Maker XP 1.03游戏导出动画用于HTML5魔塔。
* “[怪物数据生成机](https://pan.baidu.com/s/1w-JMg-ZPRvbsqbbtOwORGA#list/path=%2F 7. JS代码压缩对js代码和音像素材背景音乐除外进行压缩从而减小文件体积加快在线游戏的加载。
)”能够借助AI生成适当强度的怪物此工具需要手动下载。 8. 额外素材合并:将`project\tilesets`文件夹中的图片中用到的图块重新拼成更少的图片,并更新对应的地图矩阵。
9. 动画编辑器:编辑`project\animates`文件夹中的动画文件,或利用图片制作全新的动画。
10. 伤害和临界值计算器、帮助文档:如题,后者会打开本文档。
!> **整个造塔过程中,启动服务必须全程处于开启状态!切不可手滑关闭,否则做的都是无用功!** !> **整个造塔过程中,启动服务必须全程处于开启状态!切不可手滑关闭,否则做的都是无用功!**
## 编辑器页面的结构
![image](img/v2.7/editor.png)
-------------------------------
如上图,编辑器页面的结构分为三大部分。左边叫数据区,中央叫地图区,右侧叫素材区,竖屏状态下同时只能显示其中一个,需要经常来回切换。
## 绘制地图 请尤其注意中央下方的下拉框您可以随时按下Z、X、…、句号键字母键第三行让数据区在这些模式之间切换。更多键鼠快捷操作请按下H键查看这里列出一部分
1. Alt+0—9、0—9给素材区的图块绑定数字快捷键并使用。您也可以用中央下方的“最近/最常使用图块”和置顶来代替)
有两种绘制地图的方式从头绘制地图从RMXP中导入已有的地图。 2. WASD、或单击/长按四个箭头按钮:滚动大地图,还可以单击“大地图”按钮观看全景。
3. Ctrl+W/A/S/Z/X/C/V/Y关闭、全选、保存、撤销、剪切、复制、粘贴、重做绘图等操作。
### 从头绘制地图 4. PageUp/PageDown或滚轮切换楼层。
5. ESC、Delete取消选中并保存、删除选中点的图块和事件。需要保存时“保存地图”按钮也会变色提示
我们直接打开“地图编辑器”可以看到一个可视化的UI界面。 6. 地图上单击、双击、右击:地图选点、选中该点的素材并自动定位到素材区、弹出菜单(您可以进行出生点、机关门、上下楼的快速绑定等操作)
7. 地图上左键或右键拖动交换两个点的图块和事件、框选一些点供Ctrl+X/C/V剪切复制。
楼层切换到MT0层然后可以开始任意绘制地图。 8. 素材区最右侧的tileset区域左键拖动框选一批素材供在地图区单击批量绘制或左键拖动平铺。
9. 事件编辑器中Ctrl+S/Z/X/C/V/Y、右击、双击等执行相应操作如双击可以进入多行编辑或UI绘制预览。
![绘制地图](./img/drawmap.jpg)
如果提示“该素材未被定义”或有红色问号框,请参见[素材注册](#素材注册)。
<br>绘制地图时可以右键弹出菜单,复制、交换、删除图块、选中素材、更改出生点或快速创建常用事件。<br>从V2.4.2开始,可以使用 `Alt+0~9` 对一个图块素材快速保存,大键盘 `0~9` 来快速选用。<br>
从V2.6.6开始,最近使用的图块也会直接显示在地图下方,您可以随时选取或清空它们。
<br>从V2.7开始,除最近使用的图块外,还显示了最常使用的图块,您可以右击它们来置顶和取消置顶。
您还可以用右键在地图上拖动或用左键在素材区 `tileset` 区域拖动来批量选中图块,从而进行复制和平铺绘制。
### 从RMXP导入已有的地图
!> 注现在已经不推荐此方法如需从RMXP复刻魔塔请观看 [RM转H5刻塔器使用教程](https://www.bilibili.com/video/av43125840) 进行操作。<br>
从V2.7起RM转H5刻塔器被废弃导出结果仅供阅读仍需手动翻译成新样板的合适写法。<br>
如果我们想复刻一个现有的已经被RMXP所制作的塔也有很便捷的方式那就是用到我们的“地图生成器”。
首先我们打开RMXP和对应的项目可以看到它的地图。
![绘制地图](./img/rmxp2.png)
我们打开地图编辑器创建一个地图宽高需要和RM中的地图一致。
<br>之后,我们打开 Windows 10 自带的“截图工具”(非 Windows 10 请使用 Print Screen 键全屏截图后粘贴到“画图”中裁剪,或使用微信/QQ等自带的截图功能并将整个地图有效区域截图下来复制到剪切板。
![绘制地图](./img/rmxp3.png)
截图时请注意:**只截取有效游戏空间内数据并且有效空间内的范围必须是创建的地图的大小至少为13x13。**
确认地图的图片文件已经复制到剪切板后我们打开“地图生成器”并点“加载图片”。大约1-2秒后可以得到地图的数据。
![生成地图](./img/map1.png)
然后点击“复制地图”,即可将地图数据复制到剪切板,然后再地图编辑器中切换到“地图编辑”,并在左边的框进行粘贴。
!> **地图生成器默认只支持已被定义的素材。如果有自定义素材需求例如原版的1层小塔那种素材请先[导入并注册素材](#素材注册)后再进行操作。**
!> **请确保截图范围为你创建的地图大小并且保证每个位置的像素都是32x32譬如48×48的RPG Maker MV就需要缩小到2/3比例再截图。**
!> **如果宽度超过13地图生成器将无法显示完全但是仍然可以粘贴到地图编辑器中进行修改。**
!> **地图生成器靠左上角来确定偏移量,如果左上角是全黑或者星空之类的素材可能导致识别不准,此时请在左上角放置一个岩浆后再进行截图识别。**
![岩浆](./img/rmxp4.jpg)
## 编辑属性
当地图绘制完毕后,我们可能需要进行属性的编辑。属性编辑有四类:楼层属性、怪物属性、道具属性、全塔属性。
### 楼层属性快捷键V
我们切换到楼层属性,并进行一项项的编辑。将鼠标放在中间有具体的每一项注释,这里不再细说。
<br>从V2.7起,表格的注释被大幅度精简,因此没有下图中显示的那么冗长,上下楼点属性可以通过地图选点指定。<br>
另外,地面图块被改为了允许使用任何图块(不一定非要是 `terrains.png` 中的)。<br>
色调的设置提供了颜色选择器,贴图的设置则通过事件编辑器实现,地图的宽高也可以修改了。<br>
“宝石血瓶效果”的标识符进行了改动请参考4种血瓶和3种宝石的拾取效果。
![楼层属性](./img/floor.png)
### 怪物属性
我们点击右边的怪物图块,可以在左边的框内设置该怪物的各项属性。将鼠标放在中间有具体的每一项注释,这里不再细说。
<br>从V2.7起怪物特殊属性的格式强制为数组即不再允许写单项之前的单项0也要改为空数组`[]`,在编辑器中通过勾选框的方式启用。游戏作者在“脚本编辑”`getSpecials`中新追加的特殊属性也将在刷新浏览器页面后出现。<br>
有关怪物的更详细信息可参见[元件说明:怪物](element#怪物)。
![怪物属性](./img/enemy.png)
### 道具属性
同理,点击道具可以对道具属性进行编辑。
<br>从V2.6.6起,即捡即用类道具的捡拾效果和其他非装备的使用效果可以通过 `useItemEvent` 项用事件而不是脚本来书写。<br>
从V2.7起定义道具属性的js文件被大幅度重构`text` 和 `tip` 不再通过 `eval` 而是通过模板字符串 `${}` 实现。<br>
道具子类 `cls` 中的 `keys` 被移除,原本的黄蓝红钥匙的子类被改为 `tools`<br>
道具属性中追加了一项“不显示在道具栏”可供您利用,例如制作一些隐藏的剧情物品。<br>
此外,部分道具的素材被重制,如地震卷轴、怪物手册、楼层传送器、四种解药瓶、金钱袋和两种鞋。<br>
目前大多数道具都已有默认效果。更多信息可参见[元件说明:道具](element#道具)。
### 全塔属性快捷键B
我们切换到全塔属性,并进行一项项的编辑。同样鼠标放在中间可以查看注释。
<br>我们可以在这里定义一些全局的属性,比如开始剧情、宝石血瓶数值,破甲反击净化的比例,以及一些系统开关比如是否启用加点,是否允许负伤害等等。<br>
!> **注name作为游戏的唯一标识符必须进行修改否则可能会导致存档等出现问题。**
<br>从V2.7起,全塔属性被大幅度重构,同时几类属性之间支持折叠。具体有如下变动:
1. 音像素材的注册半自动化:现在编辑器会自动读取文件系统,将支持的格式的文件列出,还可以预览/试听。具体支持的格式类型,可以通过点击左上角的“配置表格”来查阅和修改(关于“配置表格”的详细用法,请阅读 `@zhaouv` 撰写的另一篇文档)。
2. 支持个性化字体:请将`.ttf` 格式的字体文件放在 `project\fonts` 文件夹。
3. 部分素材目录变动:背景音乐从 `project\sounds` 移到了 `project\bgms`,主角行走图和对话框皮肤图以外的图片从 `project\images` 被移到了 `project\materials`,自动元件和 `tileset` 类素材从 `project\images` 被移到了专门提供的新文件夹 `project\autotiles``project\tilesets`,且对后者的追加总会追加在末尾。
4. “难度分歧”现在由事件编辑器编写,分为“名称、简写、`flag:hard`值、颜色和事件”五项,含义分别为:
1. 名称:标题界面点击“开始游戏”后弹出的二级菜单中的名称,您可以简要介绍一下该难度的差异(如减伤比例、初始属性变化)。
2. 简写:即游戏中 `core.status.hard` 的值,将作为横屏状态栏左下角(竖屏状态栏右下角,该位置也作为数字键盘切换按钮,故无难度分歧的情况下推荐在这里注明此功能)、存读档界面和在线游戏排行榜中显示的难度名称。该值也允许使用中文,但请注意控制字数。
3. `flag:hard`同一个名称的游戏结局有多个难度有人通关时在线游戏排行榜中只统计此flag值最大的难度。
4. 颜色:`flag:__hardColor__` 的值,将作为上述“简写”在状态栏和存读档界面的文字颜色。习惯上低难度用冷色,高难度用暖色。
5. 事件:在全塔属性 `startText` 之前执行的事件,可以设置一些初始属性和道具。
5. css设置项被合并现在叫“主样式”由事件编辑器编辑同时横竖屏的标题画面支持用不同的图片啦~
6. 编辑器和游戏中的所有“魔防”都已改名为“护盾”,所有 `experience` 都已改为 `exp`
7. 主角的初始行走图(包括文件名)可以直接修改了,同时还支持了踏步动画(可以用于剧情对话中,但朝上会自动改为朝下否则不好看),这在表现长翅膀的主角时非常有用。
8. 第一代全局商店被彻底重构,不再支持长按连续购买。需要自行处理扣钱和涨价问题,但用法也更灵活了,功能也更自由了。
9. 全局开关被大幅度重构,形如“状态栏是否显示某某项”的开关被合并。其他一些影响道具属性的开关被删除(破炸冰的目标个数请直接在使用效果中指定),检查控制台和夹击上下整也被删除。
上述属性全部修改完毕后,保存,然后点启动服务的“开始游戏”,就可以看到我们写的游戏效果啦!
## 新建和删除楼层、调节尺寸
如果要新建楼层请切换到“地图编辑”输入新的楼层ID并新建空白地图然后刷新编辑器。
请注意楼层ID必须是由字母、数字和下划线组成且不能以数字开头不能和任何已有的楼层ID重复。
你也可以删除当前楼层(比如几个样板层),只需要点击删除楼层再刷新就行。删除楼层并不会删除文件,只是不再被游戏所引入而已。
你可以在全塔属性 - floorIds中看到所有的楼层。其顺序将影响到楼传器的顺序、浏览地图的顺序和上下楼器等的顺序。您可以在这里对它们进行顺序的调换和批量删除只要注意别把出生楼层删了<br>
从V2.6.1起支持修改楼层ID修改按钮在楼层属性最下面修改后请立即刷新浏览器页面。<br>
从V2.7起还支持调节地图尺寸。调节按钮的位置同上“偏移”允许你做出“给13×13地图加一圈外墙”、“截取20×20地图的右下角13×13部分”这样的操作。
## 事件编辑
我们点击任意一个图块,都可以进入事件编辑模式。
![地图选点](./img/point.png)
从上至下有若干项,分别代表该点的一些事件。有关事件的详细信息请参见[事件](event)。
如果一个点存在事件,则在地图编辑器中该点的左下角会有一个小方框表示。
<br>红色为普通事件,橙色为自动事件,黄色为战后事件,绿色为楼层转换,青色为拾获道具后事件,靛色为不可通行性(不是事件),粉(紫)色为开门后事件。
## 自定义素材的添加与注册
有关素材的更多详细信息,包括素材的机制等内容,请参见[自定义素材](personalization#自定义素材)。
这里只对如何导入(新增)素材以及注册素材进行简要介绍。
### 新素材的添加
如果我们需要新增加一些素材,比如样板中没有的怪物等。
<br>我们可以从启动服务打开便捷PS工具然后选择对应的图片进行添加。非Windows系统请使用“追加素材”功能。
![便捷PS工具](img/ps.png)
在左边选择你要导入到的文件比如怪物就是enemys.png道具就是items.png等等再在右边导入你的新素材图片。<br>
之后就可以简单的使用 C 和 V 来复制粘贴了。<br>
保存后,刷新地图编辑器即可生效。
### 素材注册
当我们使用新素材后,可能会出现素材不存在的情况,此时绘图时会存在红色问号方框。
![素材注册](./img/register.png)
出现这种情况,是因为我们没有将该素材定义到游戏中,也无法进行使用。
<br>要解决这个问题只需要在左边的图块属性中定义新的图块ID和图块数字即可。ID必须由数字字母下划线组成ID不允许使用纯数字。图块数字在1000以内ID和图块数字均不能和已有的重复。<br>
有关图块的ID和数字定义请参见[素材的机制](personalization#素材的机制)。
之后刷新编辑器即可。
<br>也可以进行自动注册只需要点击“自动注册”按钮将对该栏下所有未注册的素材进行自动注册自动分配ID和数字随后强烈建议立即手动修改ID<br>
素材注册完毕后,即可在游戏中正常使用,也可以被地图生成器所识别(需要重开地图生成器)。
### 额外素材
从2.4.2开始H5魔塔样板支持额外素材你可以导入任意个类似RM中的tilesets文件且无需注册即可使用。
要使用额外素材,请在`全塔属性`中的`tilesets`项添加额外素材的图片名称从V2.7起,额外素材的图片文件要放在 `project\tilestes` 文件夹),刷新后即可在地图编辑器中使用。
额外素材不可注册其数字、ID和索引都是和该图块在图片上的位置相关不可编辑。
有关额外素材的更多说明参见[额外素材](personalization#额外素材)
## 快速上手
针对红海塔作者,这里给出一个极简版的造塔流程,您可以据此造出一座没有任何事件(包括但不限于难度分歧、老人、木牌、商人和商店等)的塔:
1. 编辑勇士的出生点和初始属性:
1. 滚轮切换到主塔0层右击地图任意位置绑定出生点为此点会有一个大大的白色S字母显示出来
2. 按下B键切换到“全塔属性”填写core.firstData.hero中勇士的各项初始属性以及一些全局的数值如四种血瓶和三种宝石的效果、破甲反击净化的比例等注意“唯一英文标识符”一定要修改
3. 在数据区使用滚轮向下翻(您可以随时折叠全塔属性的几大部分),按需编辑下面的大量勾选框(主要就是状态栏的那些显示项)。
2. 从素材区选择各种各样的非NPC图块绘制在地图上如门、怪物、道具、楼梯、路障、箭头、踩灯、箱子等。每当选中一个素材时数据区就进入了“图块属性”模式您可以去填写道具的一些说明、以及修改其他一些图块的可通行性等。注意滑冰触发器为ski要画在背景层。如果您需要制作机关门请简单地将机关门和守卫不支持阻击怪和炸弹画在地图上再右击机关门快速绑定即可。看到机关门左下角出现橙色小方块、守卫们左下角出现黄色小方块即说明绑定成功
3. 如果您需要制作多个楼层只需按下Z键将数据区切换到“地图编辑”模式然后“新建空白地图”即可不同楼层之间简单地通过楼梯来往返您可以将楼梯画在地图上再右击快速绑定即可。看到楼梯左下角出现绿色小方块即说明绑定成功各个楼层的属性可以通过按下V键将数据区切换到“楼层属性”模式来填写如能否使用楼传、是否为地下层、画面色调、宝石血瓶倍率等。
4. 从素材区选择您所使用的各种怪物,在数据区填写它们的各项属性,其中“特殊属性”是通过多选框来编辑的。
5. 游戏胜利的触发滚轮切换到样板1层单击地图上的公主按下Ctrl+C复制。滚轮切换回您的boss层记得给boss设置不可被炸哦单击boss身后的任何一个空格子按下Ctrl+V粘贴即可。这样玩家触碰到公主游戏就会胜利。
## 控制台调试 ## 控制台调试
HTML5游戏都是可以进行控制台调试的。<br> ![image](img/v2.7/console.png)
当我们使用Chrome进入游戏后可以按 `Ctrl+Shift+I` F12并找到 `Console` 控制台。 ---------------------------------
![控制台](./img/console.png) HTML5项目都是可以进行控制台调试的下面以edge浏览器为例介绍其部分操作
在控制台中,我们可以输入一些命令对游戏进行调试,常见的命令有: 首先按下F12键部分键盘没有此键或需与Fn键一起按或Ctrl+Shift+I打开开发人员界面。
- `core.status.floorId` 获得当前层的floorId。
- `core.status.thisMap` 获得当前地图信息。例如`core.status.thisMap.blocks`可以获得当前层所有图块。
- `core.floors` 获得所有剧本的信息。例如`core.floors[core.status.floorId].events`可以获得当前层所有事件。
- `core.status.hero` 获得当前勇士状态信息。例如`core.status.hero.atk`就是当前勇士的攻击力数值。
- `core.material.enemys` 获得所有怪物信息。例如`core.material.enemys.greenSlime`就是获得绿色史莱姆的属性数据。
- `core.material.items` 获得所有道具的信息。例如`core.material.items.pickaxe`就是获得破墙镐的信息。
- `flags.debug = true` 开启调试模式;此模式下可以按住 `Ctrl` 键进行穿墙。
- `core.updateStatusBar()` 立刻更新状态栏和地图显伤,并检查自动事件。
- `core.setStatus('atk', 1000)` 直接设置勇士的某项属性。本句等价于 `core.status.hero.atk = 1000`
- `core.getStatus('atk')` 返回勇士当前某项属性数值。本句等价于 `core.status.hero.atk`
- `core.setItem('pickaxe', 10)` 直接设置勇士某个道具的个数。这里可以需要写道具的ID。
- `core.getItem('pickaxe', 2)` 令勇士获得两个破墙镐。
- `core.itemCount('pickaxe')` 返回勇士某个道具的个数。
- `core.hasItem('pickaxe')` 返回勇士是否拥有某个道具。等价于`core.itemCount('pickaxe') > 0`。
- `core.getEquip(0)` 返回0号装备类型武器的当前装备的itemId不存在则返回null
- `core.hasEquip('sword1')` 返回某个装备当前是否处于被装备状态
- `core.setFlag('xxx', 1)` 设置某个flag/自定义变量的值。
- `core.getFlag('xxx', 10)` 获得某个flag/自定义变量的值;如果该项不存在(未被定义),则返回第二个参数的值。
- `core.hasFlag('xxx')` 返回是否存在某个变量且不为六种广义 `false` 。等价于 `!!core.getFlag('xxx')`
- `core.setFlag('xxx')` 删除某个flag/自定义变量
- `core.insertAction(list)` 执行一个公共事件或一段自定义事件。比如 `core.insertAction(["剧情文本"])` 将执行一个剧情文本显示事件。
- `core.changeFloor('MT2', 'downFloor')` 立刻执行楼层切换到MT2层的下楼点位置。
- `core.changeFloor('MT5', null, {'x': 4, 'y': 7})` 立刻切换楼层到MT5层的(4,7)点。
- `core.getBlock(3, 5, 'MT1')` 获得当前地图上某一个块的信息。第三个参数为floorId可省略表示当前楼层。
- `core.getBlockId(3, 5, 'MT1')` 获得当前地图上某一个点的图块ID。第三个参数为floorId可省略表示当前楼层。
- `core.resetMap()` 重置当前层地图。
- ……
更多API和详细参数介绍可参见[API列表](api)。
## 编辑器的基本操作
- **H** 查看所有快捷键
- **Alt+0~9, 0~9** 保存和读取当前选中图块V2.7起,也可以用最常/最近使用图块置顶来代替)
- **W/A/S/D** 移动大地图
- **Ctrl+Z** 撤销上次绘图
- **Ctrl+Y** 重做上次绘图
- **PgUp/PgDn或滚轮** 切换楼层
- **Ctrl+S** 保存事件编辑器/脚本编辑器
- **地图上单击** 选中该点
- **DELETE键** 删除选中点的事件和图块
- **地图上双击** 选中该点图块
- **ESC键** 取消选中的点
- **地图上右键** 弹出菜单栏,包括选中、复制、交换、清除、更改出生点、快速绑定等操作
- **地图上右键按住并拖动** 批量框选图块,然后可以 `ctrl+C/V` 复制到别处
- **素材区tileset区域左键按住并拖动** 批量框选素材,然后可以单击地图批量绘制、在地图上拉框平铺
- **事件编辑器中Ctrl+C, Ctrl+X, 右键, 双击等** 执行相应操作如进入多行编辑、UI绘制预览等
## 报错处理
有时候刷新后可能地图编辑器页面变成空白,即无法正确加载,游戏也无法正常进入。
出现这种问题的原因往往是如下几种:
- 手动直接打开并错误编辑了文件
- 文件不存在(被误删等)
- 楼层floorId不合法必须是字母数字下划线组成且不能以数字开头
- 楼层floorId定义存在重复比如定义了两个MT0层
- 初始楼层ID不存在比如修改了全塔属性中的初始楼层ID但是实际的该ID不存在也会出错
- ……(可能各种奇怪的报错问题)
出现这种问题在Chrome浏览器中请按Ctrl+Shift+I打开控制台并找到Console查看报错。
一般都会具体到哪个楼层文件出错。
解决方式哪个楼层文件出错请使用VSCode等打开project目录下的data.js文件并将出错的那个楼层定义删除。
例如下面这个问题:
![检查错误](./img/chrome.png)
那么使用VSCode打开data.js文件并将 "floorIds": [..., "MT1"] 这里对它的楼层定义删除,再刷新即可。
![删除ID](./img/floorid.png)
请注意手动删除楼层时一定要确保“初始楼层ID”是一个有效且存在的floorId
<br>如有任何无法解决的问题,欢迎加 QQ 群 [959329661](https://jq.qq.com/?_wv=1027&k=5C87qeQ) 寻求帮助。
可以看到它分为“元素”、“控制台”、“调试程序”、“性能”等多个部分:
1. 元素您可以在这里对游戏和编辑器的各HTML和css元素进行查看和临时的修改譬如您想观察游戏在竖屏的表现只需将窗口拉到瘦高。
2. 性能:您可以在这里对游戏的任何一段脚本进行性能分析,观察其中各行的执行频率和耗时,从而确定优化的方向。
3. 调试程序您可以在这里查看游戏的源码包括project文件夹的functions.js和plugin.js脚本编辑和插件编写以及整个libs文件夹并进行断点调试。
4. 控制台最常使用的部分当编辑器或游戏打不开、卡死、或者不按您的预想运作时您就需要查看这里的报错信息。这里也是各种API输入的地方譬如上图中您可以看到全部的插件函数。这里介绍几个最基本的命令更多通用命令请前往[菜鸟教程](http://www.runoob.com/js)或[w3school](http://w3school.com.cn/js/index.asp)学习更多样板API请查阅runtime.d.ts这是个文本文件不是音频。手机打不开的话请将后缀名改为txt
``` js
alert('Hello world!'); // 弹窗警告,请勿放在正常游戏流程中可以触发的地方
console.log('Hello world'); // 在控制台打印一条信息,可用于游戏流程的任何部分
Math.xxx(); // 执行一个数学函数计算如Math.random()会得到一个小于1的随机正数
// 以上是所有网页通用的命令下面介绍HTML5魔塔样板特有的两个API.
// 样板API都是以core.xxx开头的比如
core.material; // 查看游戏的所有元件(只读),如动画、音频、图片、道具和怪物等
core.status; // 查看游戏的所有状态其中又以core.status.hero为核心
core.getItem('yellowKey', n); // 获得n个某道具支持即捡即用类n不写视为1提示并播放音效
```
========================================================================================== ==========================================================================================
[继续阅读下一章:元件说明](element) [继续阅读下一章:元件说明](element)