From 8348d1a2b3489c7510a036c33a5b86ca490035fe Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Sat, 31 Oct 2020 11:57:45 +0800 Subject: [PATCH] =?UTF-8?q?setViewport=E5=8A=A8=E7=94=BB=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _docs/api.md | 6 ++--- _server/CodeMirror/defs.js | 6 ++--- _server/MotaAction.g4 | 28 ++++++++++++-------- _server/MotaActionParser.js | 15 ++++++----- _server/editor_blocklyconfig.js | 2 +- libs/control.js | 45 +++++++++++++++------------------ libs/events.js | 19 ++++++-------- runtime.d.ts | 6 ++--- 8 files changed, 64 insertions(+), 63 deletions(-) diff --git a/_docs/api.md b/_docs/api.md index 34c7a6c7..1409ce40 100644 --- a/_docs/api.md +++ b/_docs/api.md @@ -441,7 +441,7 @@ moveOneStep: fn(callback?: fn()) 每移动一格后执行的事件 【异步脚本,请勿在脚本中直接调用(而是使用对应的事件),否则可能导致录像出错】 -moveViewport: fn(steps?: ?, time?: number, callback?: fn()) +moveViewport: fn(x: number, y: number, time?: number, callback?: fn()) 移动视野范围 nearHero: fn(x: number, y: number, n?: number) -> bool @@ -598,9 +598,9 @@ setSwitch: fn(x: number, y: number, floorId?: string, name: string, value?: ?) setToolbarButton: fn(useButton?: bool) 改变工具栏为按钮1-8 -setViewport: fn(x?: number, y?: number) +setViewport: fn(px?: number, py?: number) 设置视野范围 -x,y: 左上角相对大地图的像素坐标,不需要为32倍数 +px,py: 左上角相对大地图的像素坐标,不需要为32倍数 setWeather: fn(type?: string, level?: number) 设置天气,不计入存档。如需长期生效请使用core.events._action_setWeather()函数 diff --git a/_server/CodeMirror/defs.js b/_server/CodeMirror/defs.js index 71ba0eb9..9e385aec 100644 --- a/_server/CodeMirror/defs.js +++ b/_server/CodeMirror/defs.js @@ -2473,8 +2473,8 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ "!type": "fn(index?: number, callback?: fn(data: ?))" }, "setViewport": { - "!doc": "设置视野范围
x,y: 左上角相对大地图的像素坐标,不需要为32倍数", - "!type": "fn(x?: number, y?: number)" + "!doc": "设置视野范围
px,py: 左上角相对大地图的像素坐标,不需要为32倍数", + "!type": "fn(px?: number, py?: number)" }, "chooseReplayFile": { "!doc": "选择录像文件", @@ -2522,7 +2522,7 @@ var terndefs_f6783a0a_522d_417e_8407_94c67b692e50 = [ }, "moveViewport": { "!doc": "移动视野范围", - "!type": "fn(steps?: ?, time?: number, callback?: fn())" + "!type": "fn(x: number, y: number, time?: number, callback?: fn())" }, "syncLoad": { "!doc": "从服务器加载存档", diff --git a/_server/MotaAction.g4 b/_server/MotaAction.g4 index afcf9c8f..c30f4182 100644 --- a/_server/MotaAction.g4 +++ b/_server/MotaAction.g4 @@ -673,7 +673,7 @@ action | changeFloor_s | changePos_s | setViewport_s - | moveViewport_s + | setViewport_1_s | useItem_s | loadEquip_s | unloadEquip_s @@ -1822,35 +1822,41 @@ return code; */; setViewport_s - : '设置视角' '左上角坐标' 'x' PosString? ',' 'y' PosString? Newline + : '设置视角' '左上角坐标' 'x' PosString? ',' 'y' PosString? '动画时间' Int '不等待执行完毕' Bool Newline /* setViewport_s tooltip : setViewport: 设置视角 helpUrl : /_docs/#/instruction -default : ["",""] +default : ["","",0,false] selectPoint : ["PosString_0", "PosString_1"] colour : this.soundColor var loc = ''; if (PosString_0 && PosString_1) { loc = ', "loc": ['+PosString_0+','+PosString_1+']'; } -var code = '{"type": "setViewport"'+loc+'},\n'; +Int_0 = Int_0 ?(', "time": '+Int_0):''; +Bool_0 = Bool_0?', "async": true':''; +var code = '{"type": "setViewport"'+loc+Int_0+Bool_0+'},\n'; return code; */; -moveViewport_s - : '移动视角' '动画时间' IntString '不等待执行完毕' Bool BGNL? StepString Newline +setViewport_1_s + : '设置视角' '增量坐标' 'dx' PosString? ',' 'dy' PosString? '动画时间' Int '不等待执行完毕' Bool Newline -/* moveViewport_s -tooltip : moveViewport:移动视角 +/* setViewport_1_s +tooltip : setViewport: 设置视角 helpUrl : /_docs/#/instruction -default : [300,false,"上右3下2左"] +default : ["0","0",0,false] colour : this.soundColor -IntString_0 = IntString_0 ?(', "time": '+IntString_0):''; +var loc = ''; +if (PosString_0 && PosString_1) { + loc = ', "dxy": ['+PosString_0+','+PosString_1+']'; +} +Int_0 = Int_0 ?(', "time": '+Int_0):''; Bool_0 = Bool_0?', "async": true':''; -var code = '{"type": "moveViewport"'+IntString_0+Bool_0+', "steps": '+JSON.stringify(StepString_0)+'},\n'; +var code = '{"type": "setViewport"'+loc+Int_0+Bool_0+'},\n'; return code; */; diff --git a/_server/MotaActionParser.js b/_server/MotaActionParser.js index d7927a3e..353a582c 100644 --- a/_server/MotaActionParser.js +++ b/_server/MotaActionParser.js @@ -461,13 +461,14 @@ ActionParser.prototype.parseAction = function() { data.name,animate_loc,data.alignWindow||false,data.async||false,this.next]); break; case "setViewport": // 设置视角 - data.loc = data.loc||['','']; - this.next = MotaActionBlocks['setViewport_s'].xmlText([ - data.loc[0],data.loc[1],this.next]); - break; - case "moveViewport": // 移动视角 - this.next = MotaActionBlocks['moveViewport_s'].xmlText([ - data.time,data.async||false,this.StepString(data.steps),this.next]); + if (data.dxy) { + this.next = MotaActionBlocks['setViewport_1_s'].xmlText([ + data.dxy[0],data.dxy[1],data.time||0,data.async||false,this.next]); + } else { + data.loc = data.loc||['','']; + this.next = MotaActionBlocks['setViewport_s'].xmlText([ + data.loc[0],data.loc[1],data.time||0,data.async||false,this.next]); + } break; case "vibrate": // 画面震动 this.next = MotaActionBlocks['vibrate_s'].xmlText([data.time||0, data.async||false, this.next]); diff --git a/_server/editor_blocklyconfig.js b/_server/editor_blocklyconfig.js index 5940e287..79c3dbe1 100644 --- a/_server/editor_blocklyconfig.js +++ b/_server/editor_blocklyconfig.js @@ -186,7 +186,7 @@ editor_blocklyconfig=(function(){ MotaActionBlocks['vibrate_s'].xmlText(), MotaActionBlocks['animate_s'].xmlText(), MotaActionBlocks['setViewport_s'].xmlText(), - MotaActionBlocks['moveViewport_s'].xmlText(), + MotaActionBlocks['setViewport_1_s'].xmlText(), MotaActionBlocks['showStatusBar_s'].xmlText(), MotaActionBlocks['hideStatusBar_s'].xmlText(), MotaActionBlocks['showHero_s'].xmlText(), diff --git a/libs/control.js b/libs/control.js index 71284acd..1a6258b0 100644 --- a/libs/control.js +++ b/libs/control.js @@ -953,9 +953,9 @@ control.prototype.updateViewport = function() { } ////// 设置视野范围 ////// -control.prototype.setViewport = function (x, y) { - core.bigmap.offsetX = core.clamp(x, 0, 32 * core.bigmap.width - core.__PIXELS__); - core.bigmap.offsetY = core.clamp(y, 0, 32 * core.bigmap.height - core.__PIXELS__); +control.prototype.setViewport = function (px, py) { + core.bigmap.offsetX = core.clamp(px, 0, 32 * core.bigmap.width - core.__PIXELS__); + core.bigmap.offsetY = core.clamp(py, 0, 32 * core.bigmap.height - core.__PIXELS__); this.updateViewport(); // ------ hero层也需要! var hero_x = core.clamp((core.getHeroLoc('x') - core.__HALF_SIZE__) * 32, 0, 32*core.bigmap.width-core.__PIXELS__); @@ -964,36 +964,33 @@ control.prototype.setViewport = function (x, y) { } ////// 移动视野范围 ////// -control.prototype.moveViewport = function (steps, time, callback) { - time = time || core.values.moveSpeed; - var step = 0, moveSteps = (steps||[]).filter(function (t) { - return ['up','down','left','right'].indexOf(t)>=0; - }); +control.prototype.moveViewport = function (x, y, time, callback) { + time = time || 0; + time /= Math.max(core.status.replay.speed, 1) + var per_time = 10, step = parseInt(time / per_time); + if (step <= 0) { + this.setViewport(32 * x, 32 * y); + if (callback) callback(); + return; + } + var px = core.clamp(32 * x, 0, 32 * core.bigmap.width - core.__PIXELS__); + var py = core.clamp(32 * y, 0, 32 * core.bigmap.width - core.__PIXELS__); + var dx = (px - core.bigmap.offsetX) / step, dy = (py - core.bigmap.offsetY) / step; + var animate=window.setInterval(function() { - if (moveSteps.length==0) { + core.setViewport(core.bigmap.offsetX + dx, core.bigmap.offsetY + dy); + step--; + if (step <= 0) { delete core.animateFrame.asyncId[animate]; clearInterval(animate); + core.setViewport(px, py); if (callback) callback(); } - else { - if (core.control._moveViewport_moving(++step, moveSteps)) - step = 0; - } - }, time / 16 / core.status.replay.speed); + }, per_time); core.animateFrame.asyncId[animate] = true; } -control.prototype._moveViewport_moving = function (step, moveSteps) { - var direction = moveSteps[0], scan = core.utils.scan[direction]; - core.setViewport(core.bigmap.offsetX + 2 * scan.x, core.bigmap.offsetY + 2 * scan.y); - if (step == 16) { - moveSteps.shift(); - return true; - } - return false; -} - ////// 获得勇士面对位置的x坐标 ////// control.prototype.nextX = function(n) { if (n == null) n = 1; diff --git a/libs/events.js b/libs/events.js index d3eff62c..61cf2ecd 100644 --- a/libs/events.js +++ b/libs/events.js @@ -1426,18 +1426,15 @@ events.prototype._action_animate = function (data, x, y, prefix) { } events.prototype._action_setViewport = function (data, x, y, prefix) { - if (data.loc == null) { - core.drawHero(); + if (data.dxy != null) { + data.loc = [core.bigmap.offsetX / 32 + (core.calValue(data.dxy[0], prefix) || 0), core.bigmap.offsetY / 32 + (core.calValue(data.dxy[1], prefix) || 0)]; + } else if (data.loc == null) { + data.loc = [core.getHeroLoc('x') - core.__HALF_SIZE__, core.getHeroLoc('y') - core.__HALF_SIZE__]; + } else { + data.loc = this.__action_getLoc(data.loc, x, y, prefix); } - else { - var loc = this.__action_getLoc(data.loc, x, y, prefix); - core.setViewport(32 * loc[0], 32 * loc[1]); - } - core.doAction(); -} - -events.prototype._action_moveViewport = function (data, x, y, prefix) { - this.__action_doAsyncFunc(data.async, core.moveViewport, data.steps, data.time); + console.log(data.loc); + this.__action_doAsyncFunc(data.async, core.moveViewport, data.loc[0], data.loc[1], data.time); } events.prototype._action_move = function (data, x, y, prefix) { diff --git a/runtime.d.ts b/runtime.d.ts index 6aab980a..8b8cc5fa 100644 --- a/runtime.d.ts +++ b/runtime.d.ts @@ -632,12 +632,12 @@ declare class control { /** * 设置视野范围 - * x,y: 左上角相对大地图的像素坐标,不需要为32倍数 + * px,py: 左上角相对大地图的像素坐标,不需要为32倍数 */ - setViewport(x?: number, y?: number): void + setViewport(px?: number, py?: number): void /** 移动视野范围 */ - moveViewport(steps?: any, time?: number, callback?: () => any): void + moveViewport(x: number, y: number, time?: number, callback?: () => any): void /** 更新跟随者坐标 */ updateFollowers(): void