From 3b50761098aed1b135d4d0cd9ffaf076383e0534 Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Tue, 5 May 2020 15:15:59 +0800 Subject: [PATCH] drawAnimate alignWindow --- API列表.txt | 2 +- _docs/_api.md | 2 +- _docs/api.md | 2 +- _server/MotaAction.g4 | 9 +++++---- libs/events.js | 2 +- libs/maps.js | 6 +++++- runtime.d.ts | 2 +- v2.x-final更新.txt | 7 ++++--- 8 files changed, 19 insertions(+), 13 deletions(-) diff --git a/API列表.txt b/API列表.txt index 2f846828..cddc76e0 100644 --- a/API列表.txt +++ b/API列表.txt @@ -1625,7 +1625,7 @@ core.drawBoxAnimate() 绘制UI层的box动画,如怪物手册和对话框中的帧动画等。 -core.drawAnimate(name, x, y, callback) +core.drawAnimate(name, x, y, alignWindow, callback) 绘制一个动画。name为动画名,x和y为绘制的基准坐标,callback为绘制完毕的回调函数。 此函数将播放动画音效,并异步开始绘制该动画。 此函数会返回一个动画id,可以通过core.stopAnimate()立刻停止该动画的播放。 diff --git a/_docs/_api.md b/_docs/_api.md index 64362e3b..67839b1b 100644 --- a/_docs/_api.md +++ b/_docs/_api.md @@ -489,7 +489,7 @@ core.maps.removeBlockByIds(floorId, ids) 根据索引删除或禁用若干块。 -core.maps.drawAnimate(name, x, y, callback) +core.maps.drawAnimate(name, x, y, alignWindow, callback) 播放一段动画,name为动画名(需在全塔属性注册),x和y为坐标(0-12之间),callback可选,为播放完毕的回调函数。 播放过程是异步的,如需等待播放完毕请使用insertAction插入一条type:waitAsync事件。 此函数将随机返回一个数字id,为此异步动画的唯一标识符。 diff --git a/_docs/api.md b/_docs/api.md index 4965d648..c8ca6c3c 100644 --- a/_docs/api.md +++ b/_docs/api.md @@ -1624,7 +1624,7 @@ core.drawBoxAnimate() 绘制UI层的box动画,如怪物手册和对话框中的帧动画等。 -core.drawAnimate(name, x, y, callback) +core.drawAnimate(name, x, y, alignWindow, callback) 绘制一个动画。name为动画名,x和y为绘制的基准坐标,callback为绘制完毕的回调函数。 此函数将播放动画音效,并异步开始绘制该动画。 此函数会返回一个动画id,可以通过core.stopAnimate()立刻停止该动画的播放。 diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index bf3c3930..751e361f 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -1355,7 +1355,7 @@ return code; */; animate_s - : '显示动画' IdString '位置' EvalString? '不等待执行完毕' Bool Newline + : '显示动画' IdString '位置' EvalString? '相对窗口坐标' Bool '不等待执行完毕' Bool Newline /* animate_s @@ -1374,8 +1374,9 @@ if (EvalString_0) { throw new Error('此处只能填hero或者1,2形式的位置,或者不填代表当前事件点'); } } -var async = Bool_0?', "async": true':''; -var code = '{"type": "animate", "name": "'+IdString_0+'"'+EvalString_0+async+'},\n'; +Bool_0 = Bool_0?', "alignWindow": true':''; +var async = Bool_1?', "async": true':''; +var code = '{"type": "animate", "name": "'+IdString_0+'"'+EvalString_0+Bool_0+async+'},\n'; return code; */; @@ -3282,7 +3283,7 @@ ActionParser.prototype.parseAction = function() { var animate_loc = data.loc||''; if(animate_loc && animate_loc!=='hero')animate_loc = animate_loc[0]+','+animate_loc[1]; this.next = MotaActionBlocks['animate_s'].xmlText([ - data.name,animate_loc,data.async||false,this.next]); + data.name,animate_loc,data.alignWindow||false,data.async||false,this.next]); break; case "setViewport": // 设置视角 data.loc = data.loc||['','']; diff --git a/libs/events.js b/libs/events.js index 8f7255df..2981e5f2 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1333,7 +1333,7 @@ events.prototype._action_animate = function (data, x, y, prefix) { this.__action_doAsyncFunc(data.async, core.drawHeroAnimate, data.name); } else { data.loc = this.__action_getLoc(data.loc, x, y, prefix); - this.__action_doAsyncFunc(data.async, core.drawAnimate, data.name, data.loc[0], data.loc[1]); + this.__action_doAsyncFunc(data.async, core.drawAnimate, data.name, data.loc[0], data.loc[1], data.alignWindow); } } diff --git a/libs/maps.js b/libs/maps.js index d34ff6d0..2b472d7d 100644 --- a/libs/maps.js +++ b/libs/maps.js @@ -2055,7 +2055,7 @@ maps.prototype.drawBoxAnimate = function () { } ////// 绘制动画 ////// -maps.prototype.drawAnimate = function (name, x, y, callback) { +maps.prototype.drawAnimate = function (name, x, y, alignWindow, callback) { name = core.getMappedName(name); // 正在播放录像:不显示动画 @@ -2066,6 +2066,10 @@ maps.prototype.drawAnimate = function (name, x, y, callback) { // 开始绘制 var animate = core.material.animates[name], centerX = 32 * x + 16, centerY = 32 * y + 16; + if (alignWindow) { + centerX += core.bigmap.offsetX; + centerY += core.bigmap.offsetY; + } // 播放音效 core.playSound(animate.se); diff --git a/runtime.d.ts b/runtime.d.ts index 6528aa45..c34aa103 100644 --- a/runtime.d.ts +++ b/runtime.d.ts @@ -1203,7 +1203,7 @@ declare class maps { * @param callback 动画停止后的回调函数,可选 * @returns 一个数字,可作为core.stopAnimate()的参数来立即停止播放(届时还可选择是否执行此次播放的回调函数) */ - drawAnimate(name: string, x: number, y: number, callback?: () => void): number + drawAnimate(name: string, x: number, y: number, alignWindow: boolean, callback?: () => void): number } /** @file items.js 主要负责一切和道具相关的内容。 */ diff --git a/v2.x-final更新.txt b/v2.x-final更新.txt index 609b05df..9956f0a2 100644 --- a/v2.x-final更新.txt +++ b/v2.x-final更新.txt @@ -1,9 +1,10 @@ (已完成!) 1.(来自鹿神)门和像三种基础墙一样的墙应当提供一个“需要消耗多少把哪种钥匙、开关门分别播放什么音效”的属性,如[{"yellowKey": 2, "blueKey": 1}, "door.mp3", "close.mp3"],多种钥匙之间的关系可以为&&或|| (已完成!) 2.(来自小艾)请求修复瞬移判定无视图块属性script项的bug -3. 请求修复(如果还没修复)core.drawTip()不能使用系统图标和clear参数的bug,建议增加一个参数来表示多帧图块绘制第几帧(“UI绘制”类事件中的“绘制图标”同理),增加另一个参数来表示32×48图块绘制哪2/3,手册同理(目前统一绘制最上面2/3) -4. 建议显示文章的\b[]提供top和bottom这两种新写法来实现在顶部或底部显示对话框,目前只有startText、firstArrive、eachArrive、useItemEvent和公共事件等没有当前点的事件中才能用up和down来临时实现这种效果,否则就得设置剧情文本的属性,这在频繁来回切换时是致命的,就像《无上之光》RMXP版地上40层一样 +(已完成!) 3. 请求修复(如果还没修复)core.drawTip()不能使用系统图标和clear参数的bug,建议增加一个参数来表示多帧图块绘制第几帧 +3.1 (“UI绘制”类事件中的“绘制图标”同理) +(已完成!\b[up,null]可实现此效果) 4. 建议显示文章的\b[]提供top和bottom这两种新写法来实现在顶部或底部显示对话框,目前只有startText、firstArrive、eachArrive、useItemEvent和公共事件等没有当前点的事件中才能用up和down来临时实现这种效果,否则就得设置剧情文本的属性,这在频繁来回切换时是致命的,就像《无上之光》RMXP版地上40层一样 5. 建议优化core.splitLines()来避免把单词打断和触犯标点禁则,如点号和右标号禁止用于行首,左标号禁止用于行尾 -6. core.drawAnimate()和对应的事件,建议增加一个boolean型参数来表示坐标是绝对坐标(即当前的实现)还是在视野中的相对坐标(以13*13为例相对坐标总是在0~12之间),以实现形如“在视野正中心播放某某动画”的需求(小地图可以写6,6,大地图怎么办) +(已完成!) 6. core.drawAnimate()和对应的事件,建议增加一个boolean型参数来表示坐标是绝对坐标(即当前的实现)还是在视野中的相对坐标(以13*13为例相对坐标总是在0~12之间),以实现形如“在视野正中心播放某某动画”的需求(小地图可以写6,6,大地图怎么办) 7. 建议把core.playBgm(bgm, startTime)的startTime参数在事件中也提供出来,以用于一些演出(比如适当的剧情处直接从高潮开始)。同理可以让“暂停背景音乐”记录下当前播放到了第几秒,并在“恢复背景音乐”中自动从这个秒数恢复。作者还可以手动配合音量渐变效果 8. 系统设置菜单中“音量”和“步时”的点击区并不是根据文本长度自动适配的,这导致作者修改文本(包括但不限于翻译)后玩家难以找到准确的点击区,建议优化 9. 建议给“显示选择项”、“显示确认框”、“等待用户操作”这三个事件添加一个“若多少毫秒内不响应则触发的分支”,用来实现一些如新新2的QTE,录像中可以记录“choice: timeout”、“confirm: timeout”和“wait: timeout”来表示触发了超时分支