Merge pull request #71 from zhaouv/v2.0-editor-20180304

V2 0 editor 20180304
This commit is contained in:
Zhang Chen 2018-03-10 14:13:10 +08:00 committed by GitHub
commit e48a8f3106
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 66 additions and 49 deletions

View File

@ -139,14 +139,11 @@ $textarea(evalstr)$end
# todo & 目前的bug
+ `event`,`after...`在地图上没有标记,可以在右下角加类似于无`id`的红问号类似的绿色星号小标记
+ 添加新图块只对地形好使,添加的新物品还是需要手动在`project/items.js`中加东西
+ 目前未做$range(evalstr:thiseval)$end的检查
+ [x] 添加新图块只对地形好使,添加的新物品还是需要手动在`project/items.js`中加东西
+ [x] 目前未做$range(evalstr:thiseval)$end的检查
+ 通过`core.values.redJewel`的方式设置物品加的数值,在全GUI下反而会不直观
+ `idnum`上限改到`999`,不需要在`.js`中手动设置`idnum`的话,根据数字范围来约定类型意义不大,而且`400`内随便输个数就发现已经被占了,体验极差
+ `editor.html`中独立换背景的功能不再需要,待移除
+ 全GUI下编辑要经常保存修改后F5
+ 目前的报错只是throw,如果不开F12注意不到有错误发生,修改没有生效
+ 有待美化,以及做成标签页式的模式切换
+ replay模式,这个功能对于魔塔网站以及贴吧活动很有意义
前三条我会尽快修复(添加)
+ [x] 目前的报错只是throw,如果不开F12注意不到有错误发生,修改没有生效
+ [x] 有待美化,以及做成标签页式的模式切换

View File

@ -18,7 +18,7 @@ editor.file.loadFloorFile
editor.file.saveFloorFile
editor.file.saveFloorFileAs
```
6个编辑模式有关的查询
编辑模式有关的查询
```javascript
editor.file.editItem('redJewel',[],function(a){console.log(a)});
editor.file.editEnemy('redBat',[],function(a){console.log(a)});
@ -27,7 +27,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)});
```
6个编辑模式有关的编辑
编辑模式有关的编辑
```javascript
editor.info={images: "terrains", y: 9};
editor.file.changeIdAndIdnum('yellowWall2',16,editor.info,function(a){console.log(a)});
@ -50,14 +50,19 @@ editor.mode.functions();
```
切换模式
```javascript
editor.mode.onmode('');
editor.mode.onmode('');//清空
editor.mode.onmode('save');//保存
editor.mode.onmode('nextChange');//下次onmode时前端进行切换
editor.mode.onmode('loc');
editor.mode.onmode('emenyitem');
editor.mode.onmode('floor');
editor.mode.onmode('tower');
editor.mode.onmode('functions');
editor.mode.onmode('map');
editor.mode.onmode('appendpic');
```
在切换模式时,改动才会保存到文件,并且需要刷新页面使得`editor`能看到改动
`onmode('save')`时,改动才会保存到文件,涉及到图片的改动需要刷新页面使得`editor`能看到
表格的`onchange`的实现中,获得当前模式的方式.不注意的话,修改`index.html`中页面的结构,会被坑
```javascript
@ -83,8 +88,8 @@ editor_blockly.confirm();
### 待调整
多行文本编辑器独立作为组件
editor_multi.js
+ [x] 多行文本编辑器独立作为组件
+ [x] editor_multi.js
## z-index

View File

@ -23,6 +23,8 @@ editor.prototype.init = function(callback){
var afterMainInit = function(){
core.floors=JSON.parse(JSON.stringify(core.floors,function(k,v){if(v instanceof Function){return v.toString()}else return v}));
core.data=JSON.parse(JSON.stringify(core.data,function(k,v){if(v instanceof Function){return v.toString()}else return v}));
data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d=JSON.parse(JSON.stringify(data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d,function(k,v){if(v instanceof Function){return v.toString()}else return v}));
editor.main=main;
editor.core=core;
editor.fs=fs;

View File

@ -312,7 +312,8 @@ editor_blockly.import = function(id_){
"['afterGetItem']":'afterGetItem',
"['afterOpenDoor']":'afterOpenDoor',
"['firstData']['shops']":'shop',
//"['firstData']['shops']":'shop',
"--shop--未完成数组的处理":'shop',
"['firstArrive']":'firstArrive',
"['firstData']['startText']":'firstArrive',

View File

@ -79,7 +79,7 @@ editor_file = function(editor, callback){
}
datastr=datastr.concat(['\n}']);
datastr=datastr.join('');
fs.writeFile(filename,datastr,'utf-8',function(err, data){
fs.writeFile(filename,encode(datastr),'base64',function(err, data){
callback(err);
});
}
@ -482,7 +482,7 @@ editor_file = function(editor, callback){
});
var datastr='icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1 = \n';
datastr+=JSON.stringify(icons_4665ee12_3a1f_44a4_bea3_0fccba634dc1,null,4);
fs.writeFile('project/icons.js',datastr,'utf-8',function(err, data){
fs.writeFile('project/icons.js',encode(datastr),'base64',function(err, data){
callback(err);
});
return;
@ -494,7 +494,7 @@ editor_file = function(editor, callback){
});
var datastr='maps_90f36752_8815_4be8_b32b_d7fad1d0542e = \n';
datastr+=JSON.stringify(maps_90f36752_8815_4be8_b32b_d7fad1d0542e,null,4);
fs.writeFile('project/maps.js',datastr,'utf-8',function(err, data){
fs.writeFile('project/maps.js',encode(datastr),'base64',function(err, data){
callback(err);
});
return;
@ -506,7 +506,7 @@ editor_file = function(editor, callback){
});
var datastr='items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a = \n';
datastr+=JSON.stringify(items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a,null,4);
fs.writeFile('project/items.js',datastr,'utf-8',function(err, data){
fs.writeFile('project/items.js',encode(datastr),'base64',function(err, data){
callback(err);
});
return;
@ -518,7 +518,7 @@ editor_file = function(editor, callback){
});
var datastr='enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 = \n';
datastr+=JSON.stringify(enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80,null,4);
fs.writeFile('project/enemys.js',datastr,'utf-8',function(err, data){
fs.writeFile('project/enemys.js',encode(datastr),'base64',function(err, data){
callback(err);
});
return;
@ -530,7 +530,7 @@ editor_file = function(editor, callback){
});
var datastr='data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d = \n';
datastr+=JSON.stringify(data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d,null,4);
fs.writeFile('project/data.js',datastr,'utf-8',function(err, data){
fs.writeFile('project/data.js',encode(datastr),'base64',function(err, data){
callback(err);
});
return;

View File

@ -38,11 +38,25 @@ editor_mode.prototype.init_dom_ids = function(callback){
editor_mode.prototype.objToTable = function(obj,commentObj){
var outstr=["\n<tr><td>条目</td><td>注释</td><td>值</td></tr>\n"];
var guids=[];
var checkIsLeaf = function(obj,commentObj,field){
var thiseval = eval('obj'+field);
if (thiseval == null || thiseval == undefined)return true;//null,undefined
if (typeof(thiseval) == typeof(''))return true;//字符串
if (Object.keys(thiseval).length == 0)return true;//数字,true,false,空数组,空对象
try {
var comment = eval('commentObj'+field);
if( comment.indexOf('$leaf') != -1){
evalstr = comment.split('$leaf')[1].split('$end')[0];
if(eval(evalstr) === true)return true;
}
} catch (error) {}
return false;
}
//深度优先遍历
var recursionParse = function(tfield) {
for(var ii in eval("obj"+tfield)){
var field = tfield+"['"+ii+"']";
var isleaf = editor_mode.checkIsLeaf(obj,commentObj,field);
var isleaf = checkIsLeaf(obj,commentObj,field);
if (isleaf) {
var leafnode = editor_mode.objToTr(obj,commentObj,field);
outstr.push(leafnode[0]);
@ -54,6 +68,13 @@ editor_mode.prototype.objToTable = function(obj,commentObj){
}
}
recursionParse("");
var checkRange = function(comment,thiseval){
if( comment.indexOf('$range') !== -1){
var evalstr = comment.split('$range')[1].split('$end')[0];
return eval(evalstr);
}
return true;
}
var listen = function(guids) {
guids.forEach(function(guid){
// tr>td[title=field]
@ -69,12 +90,12 @@ editor_mode.prototype.objToTable = function(obj,commentObj){
node = node.parentNode;
}
editor_mode.onmode(editor_mode._ids[node.getAttribute('id')]);
editor_mode.addAction(['change',field,JSON.parse(input.value)]);
//尚未完成,不完善,目前还没做$range的检查
// /*临时*/editor_mode.onmode('');/*临时*/
//临时改为立刻写入文件,删去此句的时,切换模式才会真正写入
//现阶段这样会更实用,20180218
var thiseval = JSON.parse(input.value);
if(checkRange(comment,thiseval)){
editor_mode.addAction(['change',field,thiseval]);
} else {
printe('输入的值不合要求,请鼠标放置在注释上查看说明');
}
}
input.ondblclick = function(){
if(!editor_blockly.import(guid))
@ -86,21 +107,6 @@ editor_mode.prototype.objToTable = function(obj,commentObj){
return {"HTML":outstr.join(''),"guids":guids,"listen":listen};
}
editor_mode.prototype.checkIsLeaf = function(obj,commentObj,field){
var thiseval = eval('obj'+field);
if (thiseval == null || thiseval == undefined)return true;//null,undefined
if (typeof(thiseval) == typeof(''))return true;//字符串
if (Object.keys(thiseval).length == 0)return true;//数字,true,false,空数组,空对象
try {
var comment = eval('commentObj'+field);
if( comment.indexOf('$leaf') != -1){
evalstr = comment.split('$leaf')[1].split('$end')[0];
if(eval(evalstr) === true)return true;
}
} catch (error) {}
return false;
}
editor_mode.prototype.objToTr = function(obj,commentObj,field){
var guid = editor.guid();
var thiseval = eval('obj'+field);
@ -197,6 +203,12 @@ editor_mode.prototype.showMode = function (mode) {
editor_mode.dom[mode].style='';
if(editor_mode[mode])editor_mode[mode]();
document.getElementById('editModeSelect').value=mode;
var tips = [
'涉及图片的更改需要F5刷新浏览器来生效',
'文本域可以通过双击,在文本编辑器或事件编辑器中编辑',
'事件编辑器中的显示文本和自定义脚本的方块也可以双击',
];
if(!selectBox.isSelected)printf('tips: '+tips[~~(tips.length*Math.random())]);
}
editor_mode.prototype.loc = function(callback){
@ -462,7 +474,7 @@ editor_mode.prototype.listen = function(callback){
var imgbase64 = sprite.toDataURL().split(',')[1];
fs.writeFile('./project/images/'+editor_mode.appendPic.imageName+'.png',imgbase64,'base64',function(err,data){
if(err){printe(err);throw(err)}
printe('追加素材成功,请刷新编辑器');
printe('追加素材成功,请F5刷新编辑器');
});
}

View File

@ -37,13 +37,13 @@ comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
"name": "显示在状态栏中的层数 ",
"canFlyTo": "该楼能否被楼传器飞到(不能的话在该楼也不允许使用楼传器) \n$select({\"values\":[true,false]})$end",
"canUseQuickShop": "该层是否允许使用快捷商店 \n$select({\"values\":[true,false]})$end",
"defaultGround": "默认地面的图块IDterrains中 ",
"defaultGround": "默认地面的图块IDterrains中 \n$select({\"values\":Object.keys(editor.core.icons.icons.terrains)})$end",
"png": "背景图你可以选择一张png图片来作为背景素材。详细用法请参见文档“自定义素材”中的说明。 \n$leaf(true)$end",
"color": "该层的默认画面色调。本项可不写代表无色调如果写需要是一个RGBA数组。 \n$leaf(true)$end",
"weather": "该层的默认天气。本项可忽略表示晴天,如果写则第一项为\"rain\"或\"snow\"代表雨雪第二项为1-10之间的数代表强度。 \n$leaf(true)$end",
"bgm": "到达该层后默认播放的BGM。本项可忽略。 ",
//"map": "地图数据需要是13x13建议使用地图生成器来生成 ",
"item_ratio": "每一层的宝石/血瓶效果,即获得宝石和血瓶时框内\"ratio\"的值。",
"item_ratio": "每一层的宝石/血瓶效果,即获得宝石和血瓶时框内\"ratio\"的值。$range((thiseval==~~thiseval && thiseval>0)||thiseval==null)$end",
"firstArrive": "第一次到该楼层触发的事件 \n$leaf(true)$end",
},
'loc' : {

View File

@ -102,7 +102,7 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
]
}
},*/
"levelUp": [
"levelUp": " 经验升级所需要的数值,是一个数组 \n 第一项为初始等级可以简单留空也可以写name \n 每一个里面可以含有三个参数 need, name, effect \n need为所需要的经验数值是一个正整数。请确保need所需的依次递增 \n name为该等级的名称也可以省略代表使用系统默认值本项将显示在状态栏中 \n effect为本次升级所执行的操作可由若干项组成由分号分开 \n 其中每一项写法和上面的商店完全相同同样必须是X+=Y的形式Y是一个表达式同样可以使用status:xxx或item:xxx代表勇士的某项数值/道具个数 \n$leaf(true)$end"/* [
" 经验升级所需要的数值,是一个数组 \n 第一项为初始等级可以简单留空也可以写name \n 每一个里面可以含有三个参数 need, name, effect \n need为所需要的经验数值是一个正整数。请确保need所需的依次递增 \n name为该等级的名称也可以省略代表使用系统默认值本项将显示在状态栏中 \n effect为本次升级所执行的操作可由若干项组成由分号分开 \n 其中每一项写法和上面的商店完全相同同样必须是X+=Y的形式Y是一个表达式同样可以使用status:xxx或item:xxx代表勇士的某项数值/道具个数 \n$leaf(true)$end",
{
"need": "",
@ -113,7 +113,7 @@ data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
"need": "",
"effect": " effect也允许写一个function代表本次升级将会执行的操作 \n 依次往下写需要的数值即可 "
}
]
] */
},
"values": {
"HPMAX": " 各种数值;一些数值可以在这里设置\n /****** 角色相关 ******/ \n HP上限-1则无上限 ",

View File

@ -134,12 +134,12 @@ data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
{"need": 20, "name": "第二级", "effect": "status:hp+=2*(status:atk+status:def);status:atk+=10;status:def+=10"}, // 先将生命提升攻防和的2倍再将攻击+10防御+10
{"need": 40, "effect": `function () {
{"need": 40, "effect": function () {
core.drawText("恭喜升级!");
core.status.hero.hp *= 2;
core.status.hero.atk += 100;
core.status.hero.def += 100;
}`}, // effect也允许写一个function代表本次升级将会执行的操作
}}, // effect也允许写一个function代表本次升级将会执行的操作
// 依次往下写需要的数值即可
]