From e21ed4877c0939b2bfab3b5ad8750cb361d7f869 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Fri, 13 Aug 2021 15:34:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3=20&=20?= =?UTF-8?q?=E9=9F=B3=E5=83=8F=E5=A4=84=E7=90=86=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _docs/element.md | 15 +++++++++++---- _docs/event.md | 2 ++ _docs/instruction.md | 20 ++++++++++++-------- _docs/start.md | 2 +- _server/MotaAction.g4 | 29 +++++++++++++++++++---------- _server/editor_blocklyconfig.js | 30 ++++++++++++++++-------------- libs/events.js | 16 ++++++++++++++-- 7 files changed, 75 insertions(+), 39 deletions(-) diff --git a/_docs/element.md b/_docs/element.md index d3c553ff..22e2a058 100644 --- a/_docs/element.md +++ b/_docs/element.md @@ -102,7 +102,8 @@ V2.8起,图块支持“(注销并)删除”操作,执行后将(对已 * 对该图块执行“显隐事件、转变图块、开关门(npc48)、不透明度设置和渐变、移动跳跃”都会直接操作大贴图,这比起2.7.x的楼层贴图要好用许多! * 但是,如果您有一张图片希望分成16小格,但是每行对应完全独立的四个图块而不具有行走图朝向关系,该怎么做呢? * “插件编写”的第一项init中,提供了“资源加载后的操作”,您可以在里面用`splitImage`将该图的四行提前裁剪成四张图片并重新命名,就可以使用啦! - * 切分出的新图片无法通过弹窗选取,必须手动填写,敬请谅解。 + * 手动使用脚本切分出的新图片无法通过弹窗选取,必须手动填写,敬请谅解。 + * 如果希望能够弹窗选取,可以使用全塔属性中的“图片切分”功能。 ``` js this._afterLoadResources = function () { // 这是一个将4by4.png(假设为384*384)按行拆分成四个图片并保存的样例, @@ -125,7 +126,7 @@ V2.8起,图块支持“(注销并)删除”操作,执行后将(对已 * 例如:如果您想把四种血瓶和三种宝石改为便携式,只需把其道具类别改为tools(当然,楼层属性中的ratio一项也就失效了)。 * 如果想把大黄门钥匙变为钥匙盒(红黄蓝钥匙各一把),只需把其道具类别从tools改为items * 如果想把剑盾变成装备,只需把其道具类别改为`equips`; - * 如果想修改破墙镐/炸弹/冰冻徽章的目标个数(V2.8支持改为八方向,使用`core.utils.scan2`即可)或让炸弹能够触发战后事件,请修改它们的使用效果。 + * 如果想修改破墙镐/炸弹/冰冻徽章的目标个数(V2.8支持改为八方向,使用`core.utils.scan2`即可)或让炸弹能够获得金经/触发战后事件,请修改它们的使用效果。 2. **道具描述:**对除即捡即用类外的道具都有效。一个字符串,为道具在道具栏里的描述,也作为首次捡到时的提示信息的一部分(如果全塔属性中开启了这一提示功能的话)。支持使用`${表达式计算}`语法(如四种血瓶和三种宝石那样,但不支持中文替换),此语法的详细规则见“显示文章正文的转义序列”,和“值块和冒号缩写量”。 3. **不显示在道具栏:**对tools和constants有效,勾选此项后,该道具在背包中将不显示出来。常用于不能主动使用或已有专门的使用按钮的道具来节省显示篇幅,如手册、楼传、幸运金币、十字架、护符和钥匙等。该属性的详细原理,见“脚本编辑(N键)”最下面的“道具栏显示项”。 4. **回放不绘制道具栏:**勾选此项后,录像回放中使用此道具将不显示黑黑的道具栏。常用于频繁使用的道具,如楼传、技能和冰冻徽章等。 @@ -298,8 +299,12 @@ V2.8.1新增了怪物的大贴图绑定,编辑器1:1模式下大贴图会被 * 其他更复杂的白屏请在控制台根据报错信息(安卓手机则使用ES文件浏览器查看日志)去小心地修改文件(如某个楼层文件有问题则可以注销它),如果难以独立解决,欢迎加QQ群959329661寻求帮助。 2. **分区指定:**一行两列的数组,可以使用事件编辑器编辑,每行表示塔的一个区域,该行的两列分别表示该区域的第一层和最后一层(后者不填表示到塔顶),不在任何区域的楼层组成公区。 * 游戏中,除了公区和勇士当前所在区以外的地图都将处于冻结状态,无法被浏览、无法被飞到、无法触发其自动事件、地图中的图块无法被读写。冻结状态的地图不会存入存档,从而节约了存档大小并加快了存读档速度,上百层的高层塔必备! -3. **使用图片:**`project/images`文件夹中的文件名(需要后缀,必须全英数),单击“编辑”按钮,编辑器会自动扫描文件系统中格式合适的图片(如jpg、png和gif)。 +3. **使用图片、图片切分:**`project/images`文件夹中的文件名(需要后缀,必须全英数),单击“编辑”按钮,编辑器会自动扫描文件系统中格式合适的图片(如jpg、png和gif)。 * 您可以预览并将需要的图片勾选。请注意,勇士的初始行走图必须在这里注册。另外,`winskin.png`只许替换为相同规格的图片而不要注销,否则道具商店等插件无法正常绘制。 + * V2.8.1起,新增了“图片切分”功能,用于代替插件init中的“资源加载后操作”函数。 + * 该项最核心的用法就是将4行4列共16块的大型行走图切成4行,绑定给没有朝向关系的独立图块。 + * 具体用法是,指定一张宽高分别为mw和nh的图片(限png格式),按照w和h的单位宽高裁剪,就会得到mn个小图。 + * 每个小图会被重命名为您指定的前缀+数字(从0起),按正常的Z字形文本顺序逐行从左到右编号。 4. **额外素材:**`project/tilesets`中的文件名(需要后缀,只支持png)。 * 注册方法同上,最大的区别在于这个数组的顺序必须保持好。如果随意调换其中的顺序,或注销不在数组末尾的图片,就会导致地图上最终呈现的素材发生错位。因此,新勾选的图片总会被自动追加到数组的末尾。 * 比起常规素材,额外素材最大的好处有几点: @@ -338,6 +343,7 @@ V2.8.1新增了怪物的大贴图绑定,编辑器1:1模式下大贴图会被 * `volume`表示音量(0到1),`playbackRate`表示播放的倍速 * `preservesPitch`表示变速播放时是否不变调,`false`表示变调 * V2.8起,背景音乐“变速不变调”和“变速且变调”、音效“变速且变调”正式作为样板API提供,同时也有对应的事件指令,这是样板在追逐RPG Maker上迈出的一大步,且行且珍惜! + * V2.8.1起,动画的音效支持“变速且变调”,同时编辑器中试听音频也支持了(但bgm试听不能只变速不变调)。 ![image](img/bgm.jpg) 7. **使用音效:**`project/sounds`文件夹中的文件名(格式要求和写法同上)。 * V2.8起,音效的播放和动画一样会返回一个ID并且有回调。音效不能像bgm一样只变速不变调,而是必须一起变。 @@ -431,7 +437,8 @@ V2.8.1新增了怪物的大贴图绑定,编辑器1:1模式下大贴图会被 8. **负伤:**勾选后,战斗结束时如果勇士的护盾没有完全被打破,则剩余的护盾值会加到其生命上。所以勾选此项后,护盾可以这样“间接”抵消掉仇恨伤害和固伤。 9. **夹击不超伤害值:**勾选此项后,夹击伤害将封顶至夹击怪的战损。同时被四只怪夹击时,取两个战损中较小的。 10. **二分临界:**我们知道,打败怪物所需的回合数,取决于勇士的攻击减去怪物的防御。这个值并非每增大1都能使回合数减少,因而有了“临界”的说法,即“再至少增加多少攻击力,才能减少回合数”。然而,当您修改“脚本编辑——战斗伤害信息”函数后,攻击力的增加可能反而导致回合数也增加,于是临界值计算出错。您可以勾选此开关来修复,代价是游戏可能较卡,请自行权衡。 - * 目前样板的临界只有回合数法和二分法被真正采用,而循环法则只是保留了代码。如需启用,请复写`libs\enemys.js`的几个相关函数。 + * 目前样板的临界只有回合数法和二分法被真正采用,而循环法则只是保留了代码。如需启用,请修改`main.js`中“循环临界的分界”。 + * V2.8.1起,未破防怪的临界表中,第一项将用负数表示刚刚破防时的伤害,后面的项正常表示破防后再加攻击的减伤。 11. **标题开启事件化:**勾选此项后,标题画面将改为执行前述的“标题事件”,请自行研究,V2.8起建议配合“标题事件居中”插件。 12. **开启自绘状态栏:**勾选此项后,状态栏将改用“脚本编辑——自绘状态栏”来绘制,同时“脚本编辑——点击状态栏”也将启用,请自行研究。 13. **四个显伤:**略,玩家依然可以在设置菜单中开关之,其中“定点怪显”指的是手册中把受到额外影响而数值不同的同种怪物分开显示。 diff --git a/_docs/event.md b/_docs/event.md index 6f45a715..214ba2c2 100644 --- a/_docs/event.md +++ b/_docs/event.md @@ -291,6 +291,8 @@ V2.8对rand2(以及“全局存储”、“弹窗输入”、“选择项” 正常游戏中,已录制的内容被保存在一维数组`core.status.route`中并不断从尾部延长,录像回放时,即将播放的内容会保存在一维数组`core.status.replay.toReplay`中并不断从头部缩减。 +V2.8.1起,录像中勇士死亡将会报错并询问是否回到上一个节点,比起只能读取自动存档更为友好。 + 您可以在正常游戏中自由行动时随时按下R键进行回放,上述数组具体的内容含义如下: ``` diff --git a/_docs/instruction.md b/_docs/instruction.md index 28a28d80..0f8336b7 100644 --- a/_docs/instruction.md +++ b/_docs/instruction.md @@ -38,6 +38,8 @@ V2.8.1起,下拉框中没有的项都可以通过在json区输入并点击“ 与此同时,显示文章、显示选择项、显示确认框都支持双击预览,预览前请先摆一个“设置剧情文本的属性”设置您预览时需要的属性然后双击它。 +另外,原本“显示文字类”的图片相关指令,和“特效声音类”的音频相关指令,在V2.8.1被移出来合并到了一个新类“音像处理类”,请知悉。 + ## 显示文字类(黄色) ![image](img/images_texty.jpg) @@ -89,6 +91,7 @@ V2.8.1起,下拉框中没有的项都可以通过在json区输入并点击“ * 一种推荐的用法是,在指定下面的非0编号后使用,然后“显示选择项/确认框”,这样就和RPG Maker的行为一致了。 * 而且还能充分利用两侧的空间讲清楚每个子选项,这是在“选择项的提示文字无法随光标位置而变化”的现状下的一种妥协做法。 7. **编号:**V2.8.1新增,可以同时显示多个不同编号的对话框,常用来表现多名角色的嘈杂对话。 + * 和上一项一样,此项填写非0值后,指令将变为正常的json格式而不是字符串格式。 * 非0编号的对话框将不会自动消失(甚至勇士恢复自由行动后也是),可以被同编号的对话框覆盖或手动清除。 * 自由行动时,该项常用来做一些常驻提示,如技能的开关状态、毒衰咒状态、当前剧情任务进度等。 * 您甚至可以像图片一样去移动对话框(如和一个npc一起移动),支持四种变速效果,立绘也会被一起移动。 @@ -97,10 +100,11 @@ V2.8.1起,下拉框中没有的项都可以通过在json区输入并点击“ ### 显示文章正文的转义序列 -1. **表达式计算:**使用`${}`可以计算一个js表达式,式子中允许使用所有的冒号缩写量和API,详见`core.calValue()`函数。 +1. **表达式计算:**使用`${}`可以计算(eval)一个js表达式,式子中允许使用所有的冒号缩写量和API,详见`core.calValue()`函数。 * 此语法也可以用于“道具名称”、“道具描述”和“即捡即用提示”,只不过那里就不支持中文替换了。 * 如`勇士当前的攻防相乘是\${状态:攻击\*状态:防御}`(中文替换),`持有三色钥匙共\${item:yellowKey+item:blueKey+item:redKey}把。`(json) - * 由于样板对`${}`的处理使用了(非贪心)正则匹配而不是栈匹配,因此`${}`内部不允许出现}字符,这导致您将无法使用代码块(如流程控制)、对象或函数定义,只能使用简单的运算符(包括?:三元运算)和函数调用。如有需要,可以将语法规则改为`${...$}`并自行适配。 + * V2.8和更早的版本中,样板对右花括弧的处理是(非贪心)正则匹配,因此`${内部}`不能再出现右花括弧,这也意味着您无法使用对象、复杂的流程控制语句和函数定义,只能使用简单的运算符(包括三元运算)和函数调用。 + * V2.8.1中,匹配方式改为了堆栈匹配,上述问题得到解决,您可以放心使用匿名函数了,这对道具名称/道具描述这种场合是个福音。 2. **局部文字变色:**使用`\r[颜色英文名]`或`\r[\#RrGgBb]`(十六进制)来将这之后的文本变为另一种颜色。 * 最常用的17种颜色提供了自动补全,十六进制颜色可以随便找个有颜色参数的指令,呼出调色器去自己调配。只使用\r不带方括号则变回默认颜色。 3. **局部字号调节:**使用`\\c[正整数]`改变这之后文本的字号,只使用`\\c`不加方括号则恢复默认字号。 @@ -149,19 +153,17 @@ V2.8.1起,下拉框中没有的项都可以通过在json区输入并点击“ * 可以双击预览效果,还可以勾选“不等待执行完毕”来和后面的指令同时执行,比如同时淡入两张图片,或者淡入一张同时淡出/移动另一张。 * 编号较大的图片会遮盖较小的,1—24号图片会被色调层遮盖,25—40号图片会遮盖色调层但被UI层遮盖,41—50号图片会遮盖UI层。 * 此指令对应`core.showImage()`函数,编号真正的意义,详见[个性化](personalization) -2. **清除图片:**如题,需要指定要清除的图片编号和淡出时间。 +2. **清除图片:**如题,需要指定要清除的图片编号和淡出时间(显隐图片的时间都可以填0表示瞬间完成)。 * 此指令对应`core.hideImage(code, time, callback)` 3. **图片移动:**其实还包括了透明度渐变,“终点像素位置”指移动结束后的图片在视野中的左上角像素坐标(不填则表示单纯的透明度渐变),“不透明度”指渐变结束后的新的不透明度(不填表示单纯的移动)。对应`core.moveImage(code, to, opacityVal, moveMode, time, callback)` - * time不能填0,如果想实现瞬移或瞬间改变透明度,请填1 * V2.8起,图片和视野的移动支持加速度,分为“匀速、加速、减速、先加速再减速”四种,请任意选用。 4. **图片旋转:**V2.8新增,同样支持加速度,旋转中心坐标不填则取图片中心。 * 此指令对应`core.rotateImage(code, center, angle, moveMode, time, callback)`函数。 - * time同样不能填0,如果想瞬间得到旋转后的结果,请填1 * 比起移动,旋转本身不支持同时透明度渐变,您可以先写一个不指定终点的移动指令且“不等待执行完毕”来实现单纯的淡入淡出,然后再写一个耗时相同或略长的旋转指令,这样两个指令就会一起执行了。 * 当不指定旋转中心时,本指令可以和移动指令同时使用,从而得到“图片的中心做直线运动、同时图片还在绕着中心自转”的效果。 5. **图片放缩:**V2.8.1新增,同样支持加速度,放缩中心坐标不填则取图片中心。 - * 此指令对应`core.scaleImage(code, center, scale, moveMode, time, callback)`函数 - * time可以为0,代表立刻进行放缩 + * 此指令对应`core.scaleImage(code, center, scale, moveMode, time, callback)`函数。 + * 可以和“图片移动/旋转”一起使用,做出PowerPoint中常见的动画效果。 5. **显示或清除动图:**需要填写动图的文件名(带.gif后缀),“起点像素位置”含义如前且必须填写,可以双击指令块来预览第一帧的效果。 * 动图不支持淡入淡出和伸缩移动,如果不填任何参数则清除所有动图(只支持全部清除)。 * 该指令对应`core.showGif(name, x, y)`函数。 @@ -453,6 +455,7 @@ V2.8.1起,“显示选择项”支持限宽和手动指定默认项了(注 * 考虑到录像系统,在录像回放时很多耗时的东西和所有需要用户响应的东西会被跳过,勇士的移速又可以很快(倍速播放),导致回放结果和原游戏不一致。 * 总之,当您希望确保一些异步事件完全生效后再开始执行新的指令或结束事件流,“等待所有异步事件执行完毕”就是您的不二之选了,事件编辑器也会在发现缺少本指令时弹窗警告。 * 动画和V2.8的阻塞音效默认会被等待,V2.8.1提供了两个勾选框允许您不等待它们。 + * 另外,您可以随时使用`core.getAnimates()`和`core.getSounds()`获取当前未结束的所有动画和音效的id(支持自变量填名称来筛选)。 3. **等待用户操作并获得键鼠/触屏信息:**前面提到三种QTE指令,这是最后一种。 * 之前提到的“确认框”和“选择项”可以复现RPG Maker的回合制战斗,但没法做出更复杂的交互界面,比如技能/天赋树,以及样板的道具商店,这就需要用到本指令了。 * 本指令会阻塞事件的执行,直到玩家按下键盘上的某个键(滚轮视为PageUp/PageDown键)、或点击【视野】中的某个点、或经过了超时毫秒数(不设置则不限时)。 @@ -581,7 +584,8 @@ core.insertAction({"type": "changeFloor", "floorId": "MT" + core.rand2(20)}) 5. **显隐勇士:**如题,动画时间为淡入淡出时间,异步勾选框用法如前。 * 实际调用`core.triggerHero(type, time, callback)` 6. **更改画面色调:**色调可以用调色器调配,“动画时间”为渐变的总时间。 - * 请注意渐变是在RGBA颜色空间中匀速直线运动(V2.8.1可能加入加速度),因此效果可能不好,画面闪烁同理。 + * 请注意渐变是在RGBA颜色空间中直线运动(V2.8.1支持加速度),因此效果可能不好,画面闪烁同理。 + * 如需在勇士自由行动时反复执行,请使用并行脚本或自我回调。 7. **恢复画面色调:**指将更改后的色调恢复到楼层的默认色调,更改当前层的默认色调后您可以使用此指令刷新。 8. **画面闪烁:**“单次时间”必须为3的倍数,前1/3时间用于将画面色调转变为目标色调,后2/3时间用于恢复当前色调,执行次数如题。 * 实际调用`screenFlash(color, time, times, callback)` diff --git a/_docs/start.md b/_docs/start.md index f009c01d..2cf2bf6c 100644 --- a/_docs/start.md +++ b/_docs/start.md @@ -30,7 +30,7 @@ 以下为Windows专用的一些辅助工具(位于“辅助工具”文件夹),由C#编写: -* 便捷PS工具:能方便地替换和新增32×32、32×48素材。 +* 便捷PS工具:能方便地替换和新增32×32、32×48素材。V2.8.1对该工具进行了大幅强化,您甚至可以指定32×16的格子尺寸,作为前述两种尺寸的过渡操作。 * 地图生成器:识别RPG Maker魔塔的地图截图,生成HTML5魔塔的地图数据。 * 怪物数据导出:从RPG Maker XP 1.03游戏导出怪物数据,用于HTML5魔塔或使用Excel查看。 * RM动画导出:从RPG Maker XP 1.03游戏导出动画,用于HTML5魔塔。 diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index 95775342..ba815cbc 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -2155,6 +2155,7 @@ default : [1,"bg.jpg","null","0","0",1,0,false] allImages : ['EvalString_0'] menu : [['选择图片','editor_blockly.selectMaterial(block, ["./project/images/:images", "EvalString_0"])']] previewBlock : true +colour : this.imageColor if (Reverse_List_0 && Reverse_List_0 != 'null') { Reverse_List_0 = ', "reverse": "' + Reverse_List_0 + '"'; } else Reverse_List_0 = ''; @@ -2176,6 +2177,7 @@ default : [1,"bg.jpg","null","0","0","","",1,"0","0","","",0,false] allImages : ['EvalString_0'] menu : [['选择图片','editor_blockly.selectMaterial(block, ["./project/images/:images", "EvalString_0"])']] previewBlock : true +colour : this.imageColor if (Reverse_List_0 && Reverse_List_0 != 'null') { Reverse_List_0 = ', "reverse": "' + Reverse_List_0 + '"'; } else Reverse_List_0 = ''; @@ -2195,6 +2197,7 @@ showTextImage_s /* showTextImage_s tooltip : showTextImage:显示图片化文本 helpUrl : /_docs/#/instruction +colour : this.imageColor doubleclicktext : EvalString_Multi_0 default : ["可以使用setText事件来控制字体、颜色、大小、偏移量等",1,"0","0",1.4,"null",1,0,false] if (Reverse_List_0 && Reverse_List_0 != 'null') { @@ -2213,6 +2216,7 @@ hideImage_s tooltip : hideImage:清除图片 helpUrl : /_docs/#/instruction default : [1,0,false] +colour : this.imageColor var async = Bool_0?', "async": true':''; var code = '{"type": "hideImage", "code": '+NInt_0+', "time": '+Int_0+async+'},\n'; return code; @@ -2228,6 +2232,7 @@ helpUrl : /_docs/#/instruction default : ["","",""] allImages : ['EvalString_0'] previewBlock : true +colour : this.imageColor EvalString_0 = EvalString_0 ? (', "name": "'+EvalString_0+'"') : ''; var loc = (PosString_0 && PosString_1) ? (', "loc": ['+PosString_0+','+PosString_1+']') : ''; var code = '{"type": "showGif"'+EvalString_0+loc+'},\n'; @@ -2243,6 +2248,7 @@ moveImage_s tooltip : moveImage:图片移动 helpUrl : /_docs/#/instruction default : [1,'','','','',500,false] +colour : this.imageColor var toloc = ''; if (PosString_0 && PosString_1) toloc = ', "to": ['+PosString_0+','+PosString_1+']'; @@ -2261,6 +2267,7 @@ rotateImage_s tooltip : rotateImage:图片旋转 helpUrl : /_docs/#/instruction default : [1,'','','',90,500,false] +colour : this.imageColor var loc = ''; if (PosString_0 && PosString_1) loc = ', "center": ['+PosString_0+','+PosString_1+']'; @@ -2278,6 +2285,7 @@ scaleImage_s tooltip : scaleImage:图片放缩 helpUrl : /_docs/#/instruction default : [1,'','','',0.8,0,false] +colour : this.imageColor if (Number_0 <= 0) throw new Error('放缩比例需要大于0'); var loc = ''; if (PosString_0 && PosString_1) @@ -2515,7 +2523,7 @@ helpUrl : /_docs/#/instruction default : ["bgm.mp3", 0, true] allBgms : ['EvalString_0'] material : ["./project/bgms/", "EvalString_0"] -colour : this.soundColor +colour : this.imageColor Int_0 = Int_0 ? (', "startTime": '+Int_0) : ''; Bool_0 = Bool_0 ? ', "keep": true' : ''; var code = '{"type": "playBgm", "name": "'+EvalString_0+'"'+Int_0+Bool_0+'},\n'; @@ -2529,7 +2537,7 @@ pauseBgm_s /* pauseBgm_s tooltip : pauseBgm: 暂停背景音乐 helpUrl : /_docs/#/instruction -colour : this.soundColor +colour : this.imageColor var code = '{"type": "pauseBgm"},\n'; return code; */; @@ -2541,7 +2549,7 @@ resumeBgm_s /* resumeBgm_s tooltip : resumeBgm: 恢复背景音乐 helpUrl : /_docs/#/instruction -colour : this.soundColor +colour : this.imageColor Bool_0 = Bool_0 ? ', "resume": true' : ''; var code = '{"type": "resumeBgm"' + Bool_0 + '},\n'; return code; @@ -2557,7 +2565,7 @@ helpUrl : /_docs/#/instruction default : ["bgm.mp3"] allBgms : ['EvalString_0'] material : ["./project/bgms/", "EvalString_0"] -colour : this.soundColor +colour : this.imageColor var code = '{"type": "loadBgm", "name": "'+EvalString_0+'"},\n'; return code; */; @@ -2571,7 +2579,7 @@ tooltip : freeBgm: 释放背景音乐的缓存 helpUrl : /_docs/#/instruction default : ["bgm.mp3"] allBgms : ['EvalString_0'] -colour : this.soundColor +colour : this.imageColor var code = '{"type": "freeBgm", "name": "'+EvalString_0+'"},\n'; return code; */; @@ -2584,7 +2592,7 @@ playSound_s tooltip : playSound: 播放音效 helpUrl : /_docs/#/instruction default : ["item.mp3",false,"",false] -colour : this.soundColor +colour : this.imageColor allSounds : ['EvalString_0'] material : ["./project/sounds/", "EvalString_0"] if (IntString_0) { @@ -2605,7 +2613,7 @@ playSound_1_s tooltip : playSound: 播放系统音效 helpUrl : /_docs/#/instruction default : ["确定",false,"",false] -colour : this.soundColor +colour : this.imageColor if (IntString_0) { if (parseInt(IntString_0) < 30 || parseInt(IntString_0) > 300) throw '音调设置只能在30-300之间;100为正常音调。'; IntString_0 = ', "pitch": ' + IntString_0; @@ -2623,7 +2631,7 @@ stopSound_s /* stopSound_s tooltip : stopSound: 停止所有音效 helpUrl : /_docs/#/instruction -colour : this.soundColor +colour : this.imageColor var code = '{"type": "stopSound"},\n'; return code; */; @@ -2636,7 +2644,7 @@ setVolume_s tooltip : setVolume: 设置音量 helpUrl : /_docs/#/instruction default : [90, 500, false] -colour : this.soundColor +colour : this.imageColor IntString_0 = IntString_0 ?(', "time": '+IntString_0):''; var async = Bool_0?', "async": true':''; var code = '{"type": "setVolume", "value": '+Int_0+IntString_0+async+'},\n'; @@ -2651,7 +2659,7 @@ setBgmSpeed_s tooltip : setSpeed: 设置背景音乐播放速度 helpUrl : /_docs/#/instruction default : [100, true] -colour : this.soundColor +colour : this.imageColor if (Int_0 < 30 || Int_0 > 300) throw '速度只能设置只能在30-300之间;100为正常速度。'; Bool_0 = Bool_0?', "pitch": true':''; var code = '{"type": "setBgmSpeed", "value": '+Int_0+Bool_0+'},\n'; @@ -4168,6 +4176,7 @@ this.evisitor.soundColor=20; this.evisitor.commentColor=285; this.evisitor.mapColor=175; this.evisitor.uiColor=359; +this.evisitor.imageColor=45; */ /* Function_1 diff --git a/_server/editor_blocklyconfig.js b/_server/editor_blocklyconfig.js index fb46bfa6..fb003876 100644 --- a/_server/editor_blocklyconfig.js +++ b/_server/editor_blocklyconfig.js @@ -115,14 +115,6 @@ editor_blocklyconfig=(function(){ MotaActionBlocks['win_s'].xmlText(), MotaActionBlocks['lose_s'].xmlText(), MotaActionBlocks['restart_s'].xmlText(), - MotaActionBlocks['showImage_s'].xmlText(), - MotaActionBlocks['showImage_1_s'].xmlText(), - MotaActionBlocks['hideImage_s'].xmlText(), - MotaActionBlocks['showTextImage_s'].xmlText(), - MotaActionBlocks['moveImage_s'].xmlText(), - MotaActionBlocks['rotateImage_s'].xmlText(), - MotaActionBlocks['scaleImage_s'].xmlText(), - MotaActionBlocks['showGif_s'].xmlText(), ], '数据相关':[ MotaActionBlocks['setValue_s'].xmlText([ @@ -195,7 +187,7 @@ editor_blocklyconfig=(function(){ MotaActionBlocks['insert_1_s'].xmlText(), MotaActionBlocks['insert_2_s'].xmlText(), ], - '特效/声音':[ + '特效表现':[ MotaActionBlocks['sleep_s'].xmlText(), MotaActionFunctions.actionParser.parseList({"type": "wait", "timeout": 0, "data": [ {"case": "keyboard", "keycode": "13,32", "action": [{"type": "comment", "text": "当按下回车(keycode=13)或空格(keycode=32)时执行此事件\n超时剩余时间会写入flag:timeout"}]}, @@ -218,6 +210,21 @@ editor_blocklyconfig=(function(){ MotaActionBlocks['setCurtain_1_s'].xmlText(), MotaActionBlocks['screenFlash_s'].xmlText(), MotaActionBlocks['setWeather_s'].xmlText(), + MotaActionBlocks['callBook_s'].xmlText(), + MotaActionBlocks['callSave_s'].xmlText(), + MotaActionBlocks['autoSave_s'].xmlText(), + MotaActionBlocks['forbidSave_s'].xmlText(), + MotaActionBlocks['callLoad_s'].xmlText(), + ], + '音像处理':[ + MotaActionBlocks['showImage_s'].xmlText(), + MotaActionBlocks['showImage_1_s'].xmlText(), + MotaActionBlocks['hideImage_s'].xmlText(), + MotaActionBlocks['showTextImage_s'].xmlText(), + MotaActionBlocks['moveImage_s'].xmlText(), + MotaActionBlocks['rotateImage_s'].xmlText(), + MotaActionBlocks['scaleImage_s'].xmlText(), + MotaActionBlocks['showGif_s'].xmlText(), MotaActionBlocks['playBgm_s'].xmlText(), MotaActionBlocks['pauseBgm_s'].xmlText(), MotaActionBlocks['resumeBgm_s'].xmlText(), @@ -228,11 +235,6 @@ editor_blocklyconfig=(function(){ MotaActionBlocks['stopSound_s'].xmlText(), MotaActionBlocks['setVolume_s'].xmlText(), MotaActionBlocks['setBgmSpeed_s'].xmlText(), - MotaActionBlocks['callBook_s'].xmlText(), - MotaActionBlocks['callSave_s'].xmlText(), - MotaActionBlocks['autoSave_s'].xmlText(), - MotaActionBlocks['forbidSave_s'].xmlText(), - MotaActionBlocks['callLoad_s'].xmlText(), ], 'UI绘制':[ MotaActionBlocks['previewUI_s'].xmlText(), diff --git a/libs/events.js b/libs/events.js index 24a0a829..3c16c31a 100644 --- a/libs/events.js +++ b/libs/events.js @@ -3264,7 +3264,6 @@ events.prototype.hideImage = function (code, time, callback) { ////// 移动图片 ////// events.prototype.moveImage = function (code, to, opacityVal, moveMode, time, callback) { - time = time || 1000; to = to || []; var name = "image" + (code + 100); if (!core.dymCanvas[name]) { @@ -3282,6 +3281,13 @@ events.prototype.moveImage = function (code, to, opacityVal, moveMode, time, cal var opacity = parseFloat(canvas.style.opacity), toOpacity = getOrDefault(opacityVal, opacity); + if (!time) { + core.relocateCanvas(name, toX, toY); + core.setOpacity(toOpacity); + if (callback) callback(); + return; + } + this._moveImage_moving(name, { fromX: fromX, fromY: fromY, toX: toX, toY: toY, opacity: opacity, toOpacity: toOpacity, moveMode: moveMode, time: time / Math.max(core.status.replay.speed, 1) @@ -3314,7 +3320,6 @@ events.prototype._moveImage_moving = function (name, moveInfo, callback) { ////// 旋转图片 ////// events.prototype.rotateImage = function (code, center, angle, moveMode, time, callback) { - time = time || 1000; center = center || []; var name = "image" + (code + 100); if (!core.dymCanvas[name]) { @@ -3325,6 +3330,13 @@ events.prototype.rotateImage = function (code, center, angle, moveMode, time, ca var centerX = core.calValue(center[0]), centerY = core.calValue(center[1]); var fromAngle = parseFloat(canvas.getAttribute('_angle')) || 0; + + if (!time) { + core.rotateCanvas(name, fromAngle + angle, centerX, centerY); + if (callback) callback(); + return; + } + var rotateInfo = { fromAngle: fromAngle, angle: angle, centerX: centerX, centerY: centerY, moveMode: moveMode, time: time / Math.max(core.status.replay.speed, 1)