From 46d4d77bde27463188ce2fd22e978c101772ac6d Mon Sep 17 00:00:00 2001 From: YouWei Zhao Date: Sat, 10 Mar 2018 19:36:53 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix=20bug=20=E4=BB=A5=E5=8F=8A=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E8=BF=BD=E5=8A=A0=E7=B4=A0=E6=9D=90=E7=9A=84=E5=AD=97?= =?UTF-8?q?=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _server/README.md | 64 ++++++++++++++++++++++++++++++++----- _server/css/editor_mode.css | 6 ++++ _server/editor_file.js | 48 ++++++++++++++-------------- _server/editor_mode.js | 1 - _server/editor_multi.js | 4 +-- editor.html | 8 ++--- project/comment.js | 1 + 7 files changed, 93 insertions(+), 39 deletions(-) diff --git a/_server/README.md b/_server/README.md index e75cf35d..d074b9d5 100644 --- a/_server/README.md +++ b/_server/README.md @@ -2,15 +2,20 @@ 本目录下所有文件,以及`../editor.html`和`../启动服务.exe`([源码](http://github.com/ckcz123/mota-js-server/))是地图编辑器的所有组件. -`editor.js`,`editor_file.js`和`editor_mode.js`耦合较强,`editor_blockly.js`和`fs.js`基本可以独立使用. +`editor.js`,`editor_file.js`和`editor_mode.js`耦合较强,`editor_blockly.js`和`editor_multi.js`和`fs.js`基本可以独立使用. ## 各组件功能 ### editor.js -暂略 +``` js +editor.mapInit();//清空地图 +editor.changeFloor('MT2')//切换地图 +editor.guid()//产生一个可以作为id的长随机字符串 +``` ### editor_file.js + 提供了以下函数进行楼层`map`数组相关的操作 ```javascript editor.file.getFloorFileList @@ -18,6 +23,7 @@ editor.file.loadFloorFile editor.file.saveFloorFile editor.file.saveFloorFileAs ``` + 编辑模式有关的查询 ```javascript editor.file.editItem('redJewel',[],function(a){console.log(a)}); @@ -27,6 +33,7 @@ editor.file.editFloor([],function(a){console.log(a)}); editor.file.editTower([],function(a){console.log(a)}); editor.file.editFunctions([],function(a){console.log(a)}); ``` + 编辑模式有关的编辑 ```javascript editor.info={images: "terrains", y: 9}; @@ -40,7 +47,7 @@ editor.file.editFunctions(["change","['events']['afterChangeLight']","function(x ``` ### editor_mode.js -5个生成表格并绑定事件的函数 +生成表格并绑定事件的函数 ```javascript editor.mode.loc(); editor.mode.emenyitem(); @@ -48,6 +55,7 @@ editor.mode.floor(); editor.mode.tower(); editor.mode.functions(); ``` + 切换模式 ```javascript editor.mode.onmode('');//清空 @@ -72,24 +80,64 @@ while (!editor_mode._ids.hasOwnProperty(node.getAttribute('id'))) { } editor_mode.onmode(editor_mode._ids[node.getAttribute('id')]); ``` + +`editor.mode.listen`中提供了追加素材的支持. + ### editor_blockly.js + 把选定`id_`的事件用blockly编辑 ``` js editor_blockly.import(id_); ``` + 把文本区域的代码转换成图块 ``` js editor_blockly.parse(); ``` -把当前图块对应的事件返回给调用blockly的`id_` + +### editor_multi.js + +用[CodeMirror](https://github.com/codemirror/CodeMirror) 实现有高亮的多行文本编辑 + +编辑选定`id_`的文本域 ``` js -editor_blockly.confirm(); +editor_multi.import(id_) ``` -### 待调整 +编辑blockly方块的特定域 +``` js +editor_multi.multiLineEdit(value,b,f,callback) +``` -+ [x] 多行文本编辑器独立作为组件 -+ [x] editor_multi.js +### fs.js + +模仿node的fs模块提供如下api,与`启动服务.exe`配合为js提供文件读写功能 +``` js +fs.readFile('file.in','utf-8',callback) +//读文本文件 +//callback:function(err, data) +//data:字符串 +fs.readFile('file.in','base64',callback) +//读二进制文件 +//callback:function(err, data) +//data:base64字符串 + +fs.writeFile('file.out', data ,'utf-8', callback) +//写文本文件 +//callback:function(err) +//data:字符串 +fs.writeFile('file.out', data ,'base64', callback) +//写二进制文件 +//callback:function(err) +//data:base64字符串 + +fs.readdir(path, callback) +//callback:function(err, data) +//path:支持"/"做分隔符 +//data:[filename1,filename2,..] filename是字符串,只包含文件不包含目录 + +//所有参数不允许缺省 +``` ## z-index diff --git a/_server/css/editor_mode.css b/_server/css/editor_mode.css index e260377c..9dc1d587 100644 --- a/_server/css/editor_mode.css +++ b/_server/css/editor_mode.css @@ -19,6 +19,11 @@ width: 435px; } +#appendPicSelection span { + font-size:11px; + -webkit-text-stroke: 1px black; +} + #left6 { left: 5px; /* top: 1930px; */ @@ -87,6 +92,7 @@ background-color: #f6f8fa; } /* copy end --------------------------------------------- */ + .etable tr {width:100%} .etable tr > :nth-child(1) {width:20%} .etable tr > :nth-child(2) {width:20%} diff --git a/_server/editor_file.js b/_server/editor_file.js index 966b3b00..b5a853b4 100644 --- a/_server/editor_file.js +++ b/_server/editor_file.js @@ -175,11 +175,11 @@ editor_file = function(editor, callback){ saveSetting('items',actionList,function (err) { callback([ {'items':(function(){ - var locObj={}; + var locObj=Object.assign({},editor.core.items.items[id]); Object.keys(editor_file.comment.items.items).forEach(function(v){ - if (isset(editor.core.items.items[id][v])) - locObj[v]=editor.core.items.items[id][v]; - else + if (!isset(editor.core.items.items[id][v])) + /* locObj[v]=editor.core.items.items[id][v]; + else */ locObj[v]=null; }); return locObj; @@ -191,11 +191,11 @@ editor_file = function(editor, callback){ } else { callback([ {'items':(function(){ - var locObj={}; + var locObj=Object.assign({},editor.core.items.items[id]); Object.keys(editor_file.comment.items.items).forEach(function(v){ - if (isset(editor.core.items.items[id][v])) - locObj[v]=editor.core.items.items[id][v]; - else + if (!isset(editor.core.items.items[id][v])) + /* locObj[v]=editor.core.items.items[id][v]; + else */ locObj[v]=null; }); return locObj; @@ -223,11 +223,11 @@ editor_file = function(editor, callback){ saveSetting('enemys',actionList,function (err) { callback([ (function(){ - var locObj={}; + var locObj=Object.assign({},editor.core.enemys.enemys[id]); Object.keys(editor_file.comment.enemys).forEach(function(v){ - if (isset(editor.core.enemys.enemys[id][v])) - locObj[v]=editor.core.enemys.enemys[id][v]; - else + if (!isset(editor.core.enemys.enemys[id][v])) + /* locObj[v]=editor.core.enemys.enemys[id][v]; + else */ locObj[v]=null; }); return locObj; @@ -238,11 +238,11 @@ editor_file = function(editor, callback){ } else { callback([ (function(){ - var locObj={}; + var locObj=Object.assign({},editor.core.enemys.enemys[id]); Object.keys(editor_file.comment.enemys).forEach(function(v){ - if (isset(editor.core.enemys.enemys[id][v])) - locObj[v]=editor.core.enemys.enemys[id][v]; - else + if (!isset(editor.core.enemys.enemys[id][v])) + /* locObj[v]=editor.core.enemys.enemys[id][v]; + else */ locObj[v]=null; }); return locObj; @@ -315,11 +315,11 @@ editor_file = function(editor, callback){ saveSetting('floors',actionList,function (err) { callback([ (function(){ - var locObj={}; + var locObj=Object.assign({},editor.currentFloorData); Object.keys(editor_file.comment.floors.floor).forEach(function(v){ - if (isset(editor.currentFloorData[v])) - locObj[v]=editor.currentFloorData[v]; - else + if (!isset(editor.currentFloorData[v])) + /* locObj[v]=editor.currentFloorData[v]; + else */ locObj[v]=null; }); return locObj; @@ -330,11 +330,11 @@ editor_file = function(editor, callback){ } else { callback([ (function(){ - var locObj={}; + var locObj=Object.assign({},editor.currentFloorData); Object.keys(editor_file.comment.floors.floor).forEach(function(v){ - if (isset(editor.currentFloorData[v])) - locObj[v]=editor.currentFloorData[v]; - else + if (!isset(editor.currentFloorData[v])) + /* locObj[v]=editor.currentFloorData[v]; + else */ locObj[v]=null; }); return locObj; diff --git a/_server/editor_mode.js b/_server/editor_mode.js index 83c51823..d48e222e 100644 --- a/_server/editor_mode.js +++ b/_server/editor_mode.js @@ -371,7 +371,6 @@ editor_mode.prototype.listen = function(callback){ selectAppend.onchange(); var selectFileBtn = document.getElementById('selectFileBtn'); - var selectFileStr = document.getElementById('selectFileStr'); selectFileBtn.onclick = function(){ var loadImage = function (content, callback) { var image = new Image(); diff --git a/_server/editor_multi.js b/_server/editor_multi.js index 556096f7..e536d17e 100644 --- a/_server/editor_multi.js +++ b/_server/editor_multi.js @@ -29,7 +29,7 @@ editor_multi.import = function(id_){ editor_multi.isString=true; codeEditor.setValue(JSON.parse(input.value)||''); } else { - eval('var tobj='+input.value); + eval('var tobj='+(input.value||'null')); var tmap={}; var tstr = JSON.stringify(tobj,function(k,v){if(typeof(v)===typeof('') && v.slice(0,8)==='function'){var id_ = editor.guid();tmap[id_]=v.toString();return id_;}else return v},4); for(var id_ in tmap){ @@ -64,7 +64,7 @@ editor_multi.confirm = function (){ if(editor_multi.isString){ input.value = JSON.stringify(value); } else { - eval('var tobj='+value); + eval('var tobj='+(value||'null')); var tmap={}; var tstr = JSON.stringify(tobj,function(k,v){if(v instanceof Function){var id_ = editor.guid();tmap[id_]=v.toString();return id_;}else return v},4); for(var id_ in tmap){ diff --git a/editor.html b/editor.html index 494ac186..243bb2e8 100644 --- a/editor.html +++ b/editor.html @@ -49,10 +49,10 @@
-
1
-
  2
-
    3
-
      4
+
1
+
  2
+
    3
+
      4
diff --git a/project/comment.js b/project/comment.js index dfd1aed8..5ca2803e 100644 --- a/project/comment.js +++ b/project/comment.js @@ -25,6 +25,7 @@ comment_c456ea59_6018_45ef_8bcc_211a24c627dc = 'bomb':' 加入 "bomb": false 代表该怪物不可被炸弹或圣锤炸掉\n$select({\"values\":[true,false]})$end', 'point': 'point可以在打败怪物后进行加点,详见文档说明\n$range((thiseval==~~thiseval && thiseval>0)||thiseval==null)$end', 'n': '多连击需要在后面指定n代表是几连击\n$range((thiseval==~~thiseval && thiseval>0)||thiseval==null)$end', + 'add': '代表吸血后是否加到自身\n$select({\"values\":[true,false]})$end', 'atkValue':'退化时勇士下降的攻击力点数\n$range(thiseval==~~thiseval||thiseval==null)$end', 'defValue':'退化时勇士下降的防御力点数\n$range(thiseval==~~thiseval||thiseval==null)$end', 'damage':'战前扣血的点数\n$range(thiseval==~~thiseval||thiseval==null)$end' From 628d7eeafadc281961b055546c7b4735de9fb8a5 Mon Sep 17 00:00:00 2001 From: YouWei Zhao Date: Sat, 10 Mar 2018 20:07:16 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=BF=87=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 已经无法工作的editor_file_test.html 旧版的blockly 已经无效的2.0diff --- 2.0diff.md | 149 --- _server/README.md | 38 + _server/blockly/motaActionBlocks.js | 1129 --------------------- _server/blockly/motaActionBlockyDemo.html | 557 ---------- _server/editor_file_test.html | 46 - main.js | 2 +- test_main_init_mode.html | 152 --- 7 files changed, 39 insertions(+), 2034 deletions(-) delete mode 100644 2.0diff.md delete mode 100644 _server/blockly/motaActionBlocks.js delete mode 100644 _server/blockly/motaActionBlockyDemo.html delete mode 100644 _server/editor_file_test.html delete mode 100644 test_main_init_mode.html diff --git a/2.0diff.md b/2.0diff.md deleted file mode 100644 index 2eb12662..00000000 --- a/2.0diff.md +++ /dev/null @@ -1,149 +0,0 @@ -# v2.0目前的改动 - -## 总体上: - -部分重构了运行时 -+ 把`libs`中的数据分离出来保存为类似json的js文件,分离后的数据进一步分离为纯数据和注释两部分 -+ 更改目录结构,分离后的`libs`一般无需修改,把数据楼层文件声音图片放入`project`目录中 - * 需要相应的修改地图生成器和js压缩工具 -+ 设置了三个模式`play|editor|replay`在`editor`模式关闭了部分动画,并且角色无法行动 - -重构editor -+ 重命名为`editor.html` - * 需要相应的修改本地服务的按钮打开的网址,为了兼容,临时加了个内容为``的`drawMapGUI.html` -+ 不再独立的导入数据和画图,尽可能的通过`main.init('editor')`复用代码 -+ 能够在本地服务器环境中直接修改`project`中的数据,即全GUI下做塔 -+ 把`editor`的代码拆到了`_server/editor.js`中 -+ 添加了`_server/css/editor_mode.css`存放编辑模式有关的样式 -+ 添加了`_server/editor_mode.js`存放编辑模式的实现 - -## 具体: - -### main.js -用户修改内容转移到了`project/data.js`中 - -把事件监听打包成了`main.prototype.listen` - -`main.listen`和`main.init`改为在`index.html`中执行 - -添加了`main.prototype.loadPureData`,在`main.init`中先加载纯数据再加载`libs` - -### core.js -`core.drawMap`中`editor`模式下不再画图,而是生成画图的函数提供给`editor` - -`editor`模式下`GlobalAnimate`可以独立的选择是否播放 - -`core.playBgm`和`core.playSound`中非`play`模式不再播放声音 - -`core.show`和`core.hide`中非`play`模式不再进行动画而是立刻完成并执行回调 - -`editor`模式不执行`core.resize` - -### data.js -数据转移到了`project/data.js`中 - -注释转移到了`project/data.comment.js`中 - -### enemy.js,items.js,maps.js,icons.js -数据转移到了`project`下的同名文件中 - -注释转移到了`project/comment.js`中 - -### editor_file.js -提供了以下函数进行楼层`map`数组相关的操作 -```javascript -editor.file.getFloorFileList -editor.file.loadFloorFile -editor.file.saveFloorFile -editor.file.saveFloorFileAs -``` -5个编辑模式有关的查询 -```javascript -editor.file.editItem('redJewel',[],function(a){console.log(a)}); -editor.file.editEnemy('redBat',[],function(a){console.log(a)}); -editor.file.editLoc(2,0,[],function(a){console.log(a)}); -editor.file.editFloor([],function(a){console.log(a)}); -editor.file.editTower([],function(a){console.log(a)}); -``` -5个编辑模式有关的编辑 -```javascript -editor.info={images: "terrains", y: 9}; -editor.file.changeIdAndIdnum('yellowWall2',16,editor.info,function(a){console.log(a)}); -editor.file.editItem('book',[["change","['items']['name']","怪物手册的新名字"]],function(a){console.log(a)}); -editor.file.editEnemy('redBat',[['change',"['atk']",20]],function(a){console.log(a)}); -editor.file.editLoc(2,6,[["change","['afterBattle']",null]],function(a){console.log(a)}); -editor.file.editFloor([["change","['title']",'样板 33 层']],function(a){console.log(a)}); -editor.file.editTower([["change","['values']['lavaDamage']",200]],function(a){console.log(a)}); -``` - -### editor_mode.js -4个生成表格并绑定事件的函数 -```javascript -editor.mode.loc(); -editor.mode.emenyitem(); -editor.mode.floor(); -editor.mode.tower(); -``` -切换模式 -```javascript -editor.mode.onmode(''); -editor.mode.onmode('loc'); -editor.mode.onmode('emenyitem'); -editor.mode.onmode('floor'); -editor.mode.onmode('tower'); -``` -在切换模式时,改动才会保存到文件,并且需要刷新页面使得`editor`能看到改动 - -表格的`onchange`的实现中,获得当前模式的方式.不注意的话,修改`index.html`中页面的结构,会被坑 -```javascript -var node = thisTr.parentNode; -while (!editor_mode._ids.hasOwnProperty(node.getAttribute('id'))) { - node = node.parentNode; -} -editor_mode.onmode(editor_mode._ids[node.getAttribute('id')]); -``` -### drawMapGUI.html -重命名为`editor.html` - -把`editor`的代码拆到了`_server/editor.js`中 - -以`display:none`的形式引入了`index.html`的`dom`,修改了原来的`.gameCanvas #ui #data`等的名字以避免冲突 - -通过`main.init('editor')`加载数据,移除了原有的`editor.loadjs`等 - -背景层如果未设置`editor.bgY`则通过运行时中的代码画背景 - -`editor.updateMap`中只画未定义快的报错,其他的由运行时中的代码完成 - -`editor.ids[0] = 0; editor.indexs[0]=[0];` - -添加了`editor.changeFloor`用于切换楼层 - -### 注释的特殊指令 -``` -$range(evalstr:thiseval)$end - 限制取值范围,要求修改后的eval(evalstr)为true -$leaf(evalstr:thiseval)$end - 强制指定为叶节点,如果eval(evalstr)为true - -//以下几个中选一个 [ -$select(evalstr)$end - 渲染成 -$textarea(evalstr)$end - 渲染成 @@ -183,6 +182,9 @@ +



+ +