Merge pull request #73 from zhaouv/v2.0-editor-20180304
V2 0 editor 20180304
This commit is contained in:
15 files changed
+173
-2086
No files matched your search
-149
@@ -1,149 +0,0 @@
|
||||
# v2.0目前的改动
|
||||
|
||||
## 总体上:
|
||||
|
||||
部分重构了运行时
|
||||
+ 把`libs`中的数据分离出来保存为类似json的js文件,分离后的数据进一步分离为纯数据和注释两部分
|
||||
+ 更改目录结构,分离后的`libs`一般无需修改,把数据楼层文件声音图片放入`project`目录中
|
||||
* 需要相应的修改地图生成器和js压缩工具
|
||||
+ 设置了三个模式`play|editor|replay`在`editor`模式关闭了部分动画,并且角色无法行动
|
||||
|
||||
重构editor
|
||||
+ 重命名为`editor.html`
|
||||
* 需要相应的修改本地服务的按钮打开的网址,为了兼容,临时加了个内容为`<html><body><script>window.location='editor.html'</script></body></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
|
||||
渲染成<select>,选项为数组eval(evalstr)['values']
|
||||
$input(evalstr)$end
|
||||
渲染成<input>
|
||||
$textarea(evalstr)$end
|
||||
渲染成<textarea>
|
||||
默认选项为$textarea()$end
|
||||
// ]
|
||||
```
|
||||
# todo & 目前的bug
|
||||
|
||||
+ `event`,`after...`在地图上没有标记,可以在右下角加类似于无`id`的红问号类似的绿色星号小标记
|
||||
+ [x] 添加新图块只对地形好使,添加的新物品还是需要手动在`project/items.js`中加东西
|
||||
+ [x] 目前未做$range(evalstr:thiseval)$end的检查
|
||||
+ 通过`core.values.redJewel`的方式设置物品加的数值,在全GUI下反而会不直观
|
||||
+ `idnum`上限改到`999`,不需要在`.js`中手动设置`idnum`的话,根据数字范围来约定类型意义不大,而且`400`内随便输个数就发现已经被占了,体验极差
|
||||
+ `editor.html`中独立换背景的功能不再需要,待移除
|
||||
+ 全GUI下编辑要经常保存修改后F5
|
||||
+ [x] 目前的报错只是throw,如果不开F12注意不到有错误发生,修改没有生效
|
||||
+ [x] 有待美化,以及做成标签页式的模式切换
|
||||
+94
-8
@@ -2,15 +2,40 @@
|
||||
|
||||
本目录下所有文件,以及`../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`基本可以独立使用.
|
||||
|
||||
## 各组件功能
|
||||
|
||||
### 总体上
|
||||
|
||||
以`display:none`的形式引入了`index.html`的`dom`,修改了原来的`.gameCanvas #ui #data`等的名字以避免冲突
|
||||
|
||||
通过`main.init('editor')`加载数据
|
||||
|
||||
`editor`模式关闭了部分动画
|
||||
|
||||
`core.drawMap`中`editor`模式下不再画图,而是生成画图的函数提供给`editor`
|
||||
|
||||
`editor`模式下`GlobalAnimate`可以独立的选择是否播放
|
||||
|
||||
`core.playBgm`和`core.playSound`中非`play`模式不再播放声音
|
||||
|
||||
`core.show`和`core.hide`中非`play`模式不再进行动画而是立刻完成并执行回调
|
||||
|
||||
`editor`模式不执行`core.resize`
|
||||
|
||||
### editor.js
|
||||
|
||||
暂略
|
||||
``` js
|
||||
editor.mapInit();//清空地图
|
||||
editor.changeFloor('MT2')//切换地图
|
||||
editor.guid()//产生一个可以作为id的长随机字符串
|
||||
```
|
||||
|
||||
`editor.updateMap`中画未定义快的报错
|
||||
|
||||
### editor_file.js
|
||||
|
||||
提供了以下函数进行楼层`map`数组相关的操作
|
||||
```javascript
|
||||
editor.file.getFloorFileList
|
||||
@@ -18,6 +43,7 @@ editor.file.loadFloorFile
|
||||
editor.file.saveFloorFile
|
||||
editor.file.saveFloorFileAs
|
||||
```
|
||||
|
||||
编辑模式有关的查询
|
||||
```javascript
|
||||
editor.file.editItem('redJewel',[],function(a){console.log(a)});
|
||||
@@ -27,6 +53,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 +67,7 @@ editor.file.editFunctions(["change","['events']['afterChangeLight']","function(x
|
||||
```
|
||||
|
||||
### editor_mode.js
|
||||
5个生成表格并绑定事件的函数
|
||||
生成表格并绑定事件的函数
|
||||
```javascript
|
||||
editor.mode.loc();
|
||||
editor.mode.emenyitem();
|
||||
@@ -48,6 +75,7 @@ editor.mode.floor();
|
||||
editor.mode.tower();
|
||||
editor.mode.functions();
|
||||
```
|
||||
|
||||
切换模式
|
||||
```javascript
|
||||
editor.mode.onmode('');//清空
|
||||
@@ -72,24 +100,82 @@ while (!editor_mode._ids.hasOwnProperty(node.getAttribute('id'))) {
|
||||
}
|
||||
editor_mode.onmode(editor_mode._ids[node.getAttribute('id')]);
|
||||
```
|
||||
|
||||
`editor.mode.listen`中提供了追加素材的支持.
|
||||
|
||||
处理注释的特殊指令
|
||||
```
|
||||
$range(evalstr:thiseval)$end
|
||||
限制取值范围,要求修改后的eval(evalstr)为true
|
||||
$leaf(evalstr:thiseval)$end
|
||||
强制指定为叶节点,如果eval(evalstr)为true
|
||||
|
||||
//以下几个中选一个 [
|
||||
$select(evalstr)$end
|
||||
渲染成<select>,选项为数组eval(evalstr)['values']
|
||||
$input(evalstr)$end
|
||||
渲染成<input>
|
||||
$textarea(evalstr)$end
|
||||
渲染成<textarea>
|
||||
默认选项为$textarea()$end
|
||||
// ]
|
||||
```
|
||||
|
||||
### 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
|
||||
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,557 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>MotaAction Blockly Demo</title>
|
||||
<!-- <script src="../../blockly_compressed.js"></script>
|
||||
<script src="../../blocks_compressed.js"></script>
|
||||
<script src="../../javascript_compressed.js"></script>
|
||||
<script src="../../msg/js/zh-hans.js"></script> -->
|
||||
<!-- <script src="../../msg/js/en.js"></script> -->
|
||||
|
||||
<script src="blockly_compressed.js"></script>
|
||||
<script src="blocks_compressed.js"></script>
|
||||
<script src="javascript_compressed.js"></script>
|
||||
<script src="zh-hans.js"></script>
|
||||
<script src="motaActionBlocks.js"></script>
|
||||
<style>
|
||||
body {
|
||||
background-color: #fff;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- =========================================================== -->
|
||||
|
||||
|
||||
<p>
|
||||
<button onclick="showXML()">Show XML</button>
|
||||
<!-- <button onclick="runCode()">Run JavaScript</button> -->
|
||||
<button onclick="runCode()">console.log(obj=code)</button>
|
||||
</p>
|
||||
|
||||
<div id="blocklyDiv" style="height: 480px; width: 940px;"></div>
|
||||
|
||||
<pre id="codeArea"></pre>
|
||||
|
||||
<!-- =========================================================== -->
|
||||
|
||||
<xml id="toolboxxx" style="display: none">
|
||||
<category name="类别" expanded="true">
|
||||
<category name="events"></category>
|
||||
<category name="changefloor"></category>
|
||||
</category>
|
||||
<sep gap="200"></sep>
|
||||
<category name="default">
|
||||
<block type="controls_if"></block>
|
||||
<block type="logic_compare"></block>
|
||||
<block type="controls_repeat_ext"></block>
|
||||
<block type="math_number"></block>
|
||||
<block type="math_arithmetic"></block>
|
||||
<block type="text"></block>
|
||||
<block type="text_print"></block>
|
||||
</category>
|
||||
<category name="new"></category>
|
||||
<category name="变量" expanded="true">
|
||||
<!-- <category name="status" custom="MY_VARIABLE"></category> -->
|
||||
<category name="item"></category>
|
||||
<category name="flag">
|
||||
<!-- <block type="flagvar"></block> -->
|
||||
</category>
|
||||
</category>
|
||||
<category name="事件例子">
|
||||
<block type="math_number" disabled="true">
|
||||
<field name="NUM">42</field>
|
||||
</block>
|
||||
<sep gap="200"></sep>
|
||||
<label text="这是一个循环的例子"></label>
|
||||
<block type="controls_for">
|
||||
<value name="FROM">
|
||||
<block type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</block>
|
||||
</value>
|
||||
<value name="TO">
|
||||
<block type="math_number">
|
||||
<field name="NUM">10</field>
|
||||
</block>
|
||||
</value>
|
||||
<value name="BY">
|
||||
<block type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</block>
|
||||
</value>
|
||||
</block>
|
||||
|
||||
<block type="math_arithmetic">
|
||||
<field name="OP">ADD</field>
|
||||
<value name="A">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="B">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
</category>
|
||||
<!-- <category name="Variables" colour="330" custom="VARIABLE"></category>
|
||||
<category name="Functions" colour="290" custom="PROCEDURE"></category> -->
|
||||
</xml>
|
||||
|
||||
<xml xmlns="http://www.w3.org/1999/xhtml" id="toolbox_source" style="display: none;">
|
||||
<block type="math_number">
|
||||
<field name="NUM">0</field>
|
||||
</block>
|
||||
<block type="math_arithmetic">
|
||||
<field name="OP">ADD</field>
|
||||
<value name="A">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
<value name="B">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">1</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
<block type="logic_compare">
|
||||
<field name="OP">EQ</field>
|
||||
</block>
|
||||
<block type="logic_operation">
|
||||
<field name="OP">AND</field>
|
||||
</block>
|
||||
<block type="logic_negate"></block>
|
||||
<block type="evalstring_e">
|
||||
<field name="EvalString">EvalString</field>
|
||||
</block>
|
||||
<block type="evalstring_all_e">
|
||||
<field name="IdString">status</field>
|
||||
<field name="EvalString">hp</field>
|
||||
</block>
|
||||
<block type="evalstring_all_e">
|
||||
<field name="IdString">item</field>
|
||||
<field name="EvalString">yellowKey</field>
|
||||
</block>
|
||||
<block type="evalstring_all_e">
|
||||
<field name="IdString">flag</field>
|
||||
<field name="EvalString">abc</field>
|
||||
</block>
|
||||
<block type="event_m">
|
||||
<statement name="actionList">
|
||||
<block type="actionlist"></block>
|
||||
</statement>
|
||||
</block>
|
||||
<block type="actionlist"></block>
|
||||
<block type="text_s_1">
|
||||
<field name="Evalstring">欢迎使用事件编辑器</field>
|
||||
</block>
|
||||
<block type="text_s_2">
|
||||
<field name="EvalString">小妖精</field>
|
||||
<field name="IdString">fairy</field>
|
||||
<field name="Evalstring_1">欢迎使用事件编辑器</field>
|
||||
</block>
|
||||
<block type="tip_s">
|
||||
<field name="EvalString">这段话将在左上角以气泡形式显示</field>
|
||||
</block>
|
||||
<block type="setvalue_s">
|
||||
<value name="EvalString">
|
||||
<block type="evalstring_all_e">
|
||||
<field name="IdString">status</field>
|
||||
<field name="EvalString">hp</field>
|
||||
</block>
|
||||
</value>
|
||||
<value name="EvalString_1">
|
||||
<block type="math_arithmetic">
|
||||
<field name="OP">ADD</field>
|
||||
<value name="A">
|
||||
<block type="evalstring_all_e">
|
||||
<field name="IdString">status</field>
|
||||
<field name="EvalString">hp</field>
|
||||
</block>
|
||||
</value>
|
||||
<value name="B">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">100</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
</value>
|
||||
</block>
|
||||
<block type="show_s">
|
||||
<field name="INT">0</field>
|
||||
<field name="INT_1">0</field>
|
||||
<field name="IdString"></field>
|
||||
<field name="INT_2"></field>
|
||||
</block>
|
||||
<block type="hide_s">
|
||||
<field name="INT"></field>
|
||||
<field name="INT_1"></field>
|
||||
<field name="IdString"></field>
|
||||
<field name="INT_2"></field>
|
||||
</block>
|
||||
<block type="trigger_s">
|
||||
<field name="INT">0</field>
|
||||
<field name="INT_1">0</field>
|
||||
</block>
|
||||
<block type="revisit_s"></block>
|
||||
<block type="exit_s"></block>
|
||||
<block type="update_s"></block>
|
||||
<block type="sleep_s">
|
||||
<field name="INT">500</field>
|
||||
</block>
|
||||
<block type="battle_s">
|
||||
<field name="IdString">greenSlime</field>
|
||||
</block>
|
||||
<block type="opendoor_s">
|
||||
<field name="INT">0</field>
|
||||
<field name="INT_1">0</field>
|
||||
<field name="IdString"></field>
|
||||
</block>
|
||||
<block type="changefloor_s">
|
||||
<field name="IdString">MT1</field>
|
||||
<field name="INT">0</field>
|
||||
<field name="INT_1">0</field>
|
||||
<field name="EvalString"></field>
|
||||
<field name="INT_2"></field>
|
||||
</block>
|
||||
<block type="changepos_s_1">
|
||||
<field name="INT">0</field>
|
||||
<field name="INT_2">0</field>
|
||||
<field name="EvalString"></field>
|
||||
</block>
|
||||
<block type="changepos_s_2">
|
||||
<field name="EvalString">up</field>
|
||||
</block>
|
||||
<block type="openshop_s">
|
||||
<field name="IdString">shop1</field>
|
||||
</block>
|
||||
<block type="disableshop_s">
|
||||
<field name="IdString">shop1</field>
|
||||
</block>
|
||||
<block type="setfg_s_1">
|
||||
<field name="INT">255</field>
|
||||
<field name="INT_1">255</field>
|
||||
<field name="INT_2">255</field>
|
||||
<field name="EvalString">1</field>
|
||||
<field name="INT_3"></field>
|
||||
</block>
|
||||
<block type="setfg_s_2">
|
||||
<field name="INT"></field>
|
||||
</block>
|
||||
<block type="move_s">
|
||||
<field name="INT"></field>
|
||||
<field name="INT_1"></field>
|
||||
<field name="INT_2"></field>
|
||||
<field name="EvalString">TRUE</field>
|
||||
<field name="EvalString_1">上右3下2左上左2</field>
|
||||
</block>
|
||||
<block type="movehero_s">
|
||||
<field name="INT"></field>
|
||||
<field name="EvalString">上右3下2左上左2</field>
|
||||
</block>
|
||||
<block type="playbgm_s">
|
||||
<field name="EvalString">bgm.mp3</field>
|
||||
</block>
|
||||
<block type="pausebgm_s"></block>
|
||||
<block type="resumebgm_s"></block>
|
||||
<block type="playsound_s">
|
||||
<field name="EvalString">item.ogg</field>
|
||||
</block>
|
||||
<block type="win_s">
|
||||
<field name="EvalString"></field>
|
||||
</block>
|
||||
<block type="lose_s">
|
||||
<field name="EvalString"></field>
|
||||
</block>
|
||||
<block type="if_s">
|
||||
<value name="EvalString">
|
||||
<block type="logic_compare">
|
||||
<field name="OP">GT</field>
|
||||
<value name="A">
|
||||
<block type="evalstring_all_e">
|
||||
<field name="IdString">status</field>
|
||||
<field name="EvalString">hp</field>
|
||||
</block>
|
||||
</value>
|
||||
<value name="B">
|
||||
<shadow type="math_number">
|
||||
<field name="NUM">100</field>
|
||||
</shadow>
|
||||
</value>
|
||||
</block>
|
||||
</value>
|
||||
<statement name="actionList">
|
||||
<block type="actionlist"></block>
|
||||
</statement>
|
||||
<statement name="actionList_1">
|
||||
<block type="actionlist"></block>
|
||||
</statement>
|
||||
</block>
|
||||
<block type="choices_s">
|
||||
<field name="EvalString">提示文字:选择一种钥匙</field>
|
||||
<statement name="choicesContextList">
|
||||
<block type="choicescontext">
|
||||
<field name="EvalString">提示文字:黄钥匙</field>
|
||||
<statement name="actionList">
|
||||
<block type="actionlist"></block>
|
||||
</statement>
|
||||
<next>
|
||||
<block type="choicescontext">
|
||||
<field name="EvalString">提示文字:蓝钥匙</field>
|
||||
<statement name="actionList">
|
||||
<block type="actionlist"></block>
|
||||
</statement>
|
||||
<next>
|
||||
<block type="choicescontext">
|
||||
<field name="EvalString">提示文字:红钥匙</field>
|
||||
<statement name="actionList">
|
||||
<block type="actionlist"></block>
|
||||
</statement>
|
||||
</block>
|
||||
</next>
|
||||
</block>
|
||||
</next>
|
||||
</block>
|
||||
</statement>
|
||||
</block>
|
||||
<block type="function_s">
|
||||
<field name="EvalString">alert(core.getStatus("atk"));</field>
|
||||
</block>
|
||||
</xml>
|
||||
|
||||
<xml id="toolbox" style="display: none"><category name="未分类"></category></xml>
|
||||
|
||||
<script>
|
||||
//不允许缺省的标记
|
||||
/*
|
||||
INT_CHECK = '999843861743683';
|
||||
IdString_CHECK = 'this_id_must_be_inputted';
|
||||
EvalString_CHECK = 'this_value_must_be_inputted';
|
||||
*/
|
||||
|
||||
var moveStepParser = moveStepParser_2ac833aa_9115_48fc_b816_08cc229bb4d0;
|
||||
|
||||
var motaActionBlocks = motaActionBlocks_4a3632a9_8716_48b3_bf55_4ebbc4ff040c;
|
||||
|
||||
|
||||
/* var category_new = (function(){
|
||||
for(var node of document.getElementById('toolbox').children) {
|
||||
if(node.getAttribute('name')=='new') return node;
|
||||
}
|
||||
})(); */
|
||||
var category_new = document.getElementById('toolbox').children[0];
|
||||
for(var blockNode of document.getElementById('toolbox_source').children){
|
||||
category_new.appendChild(Blockly.Xml.textToDom(Blockly.Xml.domToText(blockNode)));
|
||||
var sepNode=document.createElement('sep');
|
||||
sepNode.setAttribute('gap',5);
|
||||
category_new.appendChild(sepNode);
|
||||
//category_new.innerHTML+='<sep gap="5"></sep>';
|
||||
}
|
||||
|
||||
|
||||
motaActionBlocks.forEach(function(v){
|
||||
/*
|
||||
var blockNode=document.createElement('block');
|
||||
blockNode.setAttribute('type',v.type);
|
||||
category_new.appendChild(blockNode);
|
||||
|
||||
//category_new.innerHTML+='<block type="'+v.type+'"></block>';
|
||||
var sepNode=document.createElement('sep');
|
||||
sepNode.setAttribute('gap',5);
|
||||
category_new.appendChild(sepNode);
|
||||
//category_new.innerHTML+='<sep gap="5"></sep>';
|
||||
*/
|
||||
|
||||
var blockFunc;
|
||||
|
||||
if(v.hasOwnProperty('initFunc')){
|
||||
blockFunc = v['initFunc'];
|
||||
if (!(blockFunc instanceof Function)){
|
||||
eval('blockFunc = '+v['initFunc']);
|
||||
}
|
||||
} else {
|
||||
blockFunc = function() {this.jsonInit(v);}
|
||||
}
|
||||
Blockly.Blocks[v.type] = {
|
||||
init: blockFunc
|
||||
};
|
||||
|
||||
if(v.hasOwnProperty('generFunc')){
|
||||
blockFunc = v['generFunc'];
|
||||
if (!(blockFunc instanceof Function)){
|
||||
eval('blockFunc = '+v['generFunc']);
|
||||
}
|
||||
Blockly.JavaScript[v.type] = blockFunc;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
/*
|
||||
b=[]
|
||||
for(var ii in Blockly.JavaScript){if(typeof(Blockly.JavaScript[ii])==typeof(0)){
|
||||
b.push([ii,Blockly.JavaScript[ii]]);
|
||||
}}
|
||||
b.sort(function(a,b){return a[1]-b[1]})
|
||||
|
||||
Blockly.JavaScript.ORDER_ATOMIC = 0; // 0 "" ...
|
||||
Blockly.JavaScript.ORDER_NEW = 1.1; // new
|
||||
Blockly.JavaScript.ORDER_MEMBER = 1.2; // . []
|
||||
Blockly.JavaScript.ORDER_FUNCTION_CALL = 2; // ()
|
||||
Blockly.JavaScript.ORDER_INCREMENT = 3; // ++
|
||||
Blockly.JavaScript.ORDER_DECREMENT = 3; // --
|
||||
Blockly.JavaScript.ORDER_BITWISE_NOT = 4.1; // ~
|
||||
Blockly.JavaScript.ORDER_UNARY_PLUS = 4.2; // +
|
||||
Blockly.JavaScript.ORDER_UNARY_NEGATION = 4.3; // -
|
||||
Blockly.JavaScript.ORDER_LOGICAL_NOT = 4.4; // !
|
||||
Blockly.JavaScript.ORDER_TYPEOF = 4.5; // typeof
|
||||
Blockly.JavaScript.ORDER_VOID = 4.6; // void
|
||||
Blockly.JavaScript.ORDER_DELETE = 4.7; // delete
|
||||
Blockly.JavaScript.ORDER_DIVISION = 5.1; // /
|
||||
Blockly.JavaScript.ORDER_MULTIPLICATION = 5.2; // *
|
||||
Blockly.JavaScript.ORDER_MODULUS = 5.3; // %
|
||||
Blockly.JavaScript.ORDER_SUBTRACTION = 6.1; // -
|
||||
Blockly.JavaScript.ORDER_ADDITION = 6.2; // +
|
||||
Blockly.JavaScript.ORDER_BITWISE_SHIFT = 7; // << >> >>>
|
||||
Blockly.JavaScript.ORDER_RELATIONAL = 8; // < <= > >=
|
||||
Blockly.JavaScript.ORDER_IN = 8; // in
|
||||
Blockly.JavaScript.ORDER_INSTANCEOF = 8; // instanceof
|
||||
Blockly.JavaScript.ORDER_EQUALITY = 9; // == != === !==
|
||||
Blockly.JavaScript.ORDER_BITWISE_AND = 10; // &
|
||||
Blockly.JavaScript.ORDER_BITWISE_XOR = 11; // ^
|
||||
Blockly.JavaScript.ORDER_BITWISE_OR = 12; // |
|
||||
Blockly.JavaScript.ORDER_LOGICAL_AND = 13; // &&
|
||||
Blockly.JavaScript.ORDER_LOGICAL_OR = 14; // ||
|
||||
Blockly.JavaScript.ORDER_CONDITIONAL = 15; // ?:
|
||||
Blockly.JavaScript.ORDER_ASSIGNMENT = 16; // = += -= *= /= %= <<= >>= ...
|
||||
Blockly.JavaScript.ORDER_COMMA = 17; // ,
|
||||
Blockly.JavaScript.ORDER_NONE = 99; // (...)
|
||||
*/
|
||||
|
||||
|
||||
//===init===
|
||||
|
||||
var demoWorkspace = Blockly.inject('blocklyDiv',{
|
||||
media: 'media/',
|
||||
toolbox: document.getElementById('toolbox'),
|
||||
zoom:{
|
||||
controls: true,
|
||||
wheel: true,//false
|
||||
startScale: 1.0,
|
||||
maxScale: 3,
|
||||
minScale: 0.3,
|
||||
scaleSpeed: 1.08
|
||||
},
|
||||
trashcan: false,
|
||||
});
|
||||
|
||||
//var xml_init = `<xml><block type="event_m" id="ZjQTmcPqlbmB4rWwtHFb" deletable="false" xxmovable="false"><statement name="actionList"><block type="actionlist" id="EqXfr9escNaQbktsBeeR"></block></statement></block></xml>`
|
||||
var xml_init = '<xml xmlns="http://www.w3.org/1999/xhtml"><variables></variables><block type="event_m" id="ZjQTmcPqlbmB4rWwtHFb" ><statement name="actionList"><block type="actionlist" id="EqXfr9escNaQbktsBeeR"><statement name="ACTIONS"><block type="text_s_1" id="3.34tovt~URp|A^JLW`-"><field name="Evalstring">实现了文档中 choices: 给用户提供选项 中的复杂事件</field><next><block type="if_s" id="mB{gA~yKm5CmnjboTc)@"><value name="EvalString"><block type="logic_compare" id="Av`[}J)p1a*~f[x%k/iC"><field name="OP">EQ</field><value name="A"><block type="evalstring_all_e" id="L9PP2VY*=G2}u~[XH^~8"><field name="IdString">flag</field><field name="EvalString">women</field></block></value><value name="B"><shadow type="math_number" id="K(e-BEb3lq4p_Uq3a4fP"><field name="NUM">0</field></shadow></value></block></value><statement name="actionList"><block type="actionlist" id="n4IT]Xp(ep!b5Z;A7i!)"><statement name="ACTIONS"><block type="text_s_2" id="Fj~J}^k-ybh%hCTc!HzJ"><field name="EvalString">老人</field><field name="IdString">woman</field><field name="Evalstring_1">这是个很复杂的例子,它将教会你如何使用if 语句进行条件判断,以及 choices 提供选项来供用户进行选择。</field><next><block type="text_s_2" id="tp$q~?4^N.CkBrW.)m=:"><field name="EvalString">老人</field><field name="IdString">woman</field><field name="Evalstring_1">第一次访问我将显示这段文字;从第二次开始将会向你出售钥匙。\n钥匙价格将随着访问次数递增。\n当合计出售了七把钥匙后,将送你一把大黄门钥匙,并消失不再出现。</field><next><block type="text_s_2" id="#GN{01Kr#=U]IrEpF81F"><field name="EvalString">老人</field><field name="IdString">woman</field><field name="Evalstring_1">这部分的逻辑比较长,请细心看样板的写法,是很容易看懂并理解的。</field></block></next></block></next></block></statement></block></statement><statement name="actionList_1"><block type="actionlist" id="zNiAq:34?E~VA]]_.*z?"><statement name="ACTIONS"><block type="if_s" id="q45FD9cEAXzv+6K1Q+As"><value name="EvalString"><block type="logic_compare" id="s(8a`p#Br9D42#:.(Ajp"><field name="OP">EQ</field><value name="A"><block type="evalstring_all_e" id="wY1%gHYZlbTR%w!j=.L;"><field name="IdString">flag</field><field name="EvalString">women</field></block></value><value name="B"><shadow type="math_number" id="=8W59@z1c8z3mg*sF%Yv"><field name="NUM">8</field></shadow></value></block></value><statement name="actionList"><block type="actionlist" id="NPPgOQR,ZNWZ]+qTcYo."><statement name="ACTIONS"><block type="text_s_2" id="7gm0#-f#SSZkhb@}`Vi#"><field name="EvalString">老人</field><field name="IdString">woman</field><field name="Evalstring_1">你购买的钥匙已经够多了,再继续卖给你的话我会有危险的。</field><next><block type="text_s_2" id="6(z!Sd.3gKP!G3|nYRcq"><field name="EvalString">老人</field><field name="IdString">woman</field><field name="Evalstring_1">看在你贡献给我这么多钱的份上,送你一把大黄门钥匙吧,希望你能好好用它。</field><next><block type="setvalue_s" id=";=ePDQeTA,kwEh$Ra^X_"><value name="EvalString"><block type="evalstring_all_e" id="z6.,x%^#p/C/Qk,gRjW#"><field name="IdString">item</field><field name="EvalString">bigKey</field></block></value><value name="EvalString_1"><block type="math_arithmetic" id=";etEds+-9.R3D)_h2m!b"><field name="OP">ADD</field><value name="A"><block type="evalstring_all_e" id="X30zJUgVZ^j@,4VzRY+U"><field name="IdString">item</field><field name="EvalString">bigKey</field></block></value><value name="B"><shadow type="math_number" id="8|9c~,axhUiAiXkoDe5L"><field name="NUM">1</field></shadow></value></block></value><next><block type="text_s_2" id="#SD_,q#qW}P_$FVas4e,"><field name="EvalString">老人</field><field name="IdString">woman</field><field name="Evalstring_1">我先走了,拜拜~</field><next><block type="hide_s" id=")7zo%}*LQeNTH5/(dX:,"><field name="INT"></field><field name="INT_1"></field><field name="IdString"></field><field name="INT_2">500</field></block></next></block></next></block></next></block></next></block></statement></block></statement><statement name="actionList_1"><block type="actionlist" id="Al0uQGP.@b8JT5*AkGt("><statement name="ACTIONS"><block type="choices_s" id="7;M82mnQZq-[SxPg|Q}4"><field name="EvalString">\t[老人,woman]少年,你需要钥匙吗?\n我这里有大把的!</field><statement name="choicesContextList"><block type="choicescontext" id="3KXrI#DBm{X|YrW=yNzr"><field name="EvalString">黄钥匙(${9+flag:woman_times}金币)</field><statement name="actionList"><block type="actionlist" id="W_o#WBfK_M[M$~4NcuY/"><statement name="ACTIONS"><block type="if_s" id="1WMD~nib3*_IF,XbQt18"><value name="EvalString"><block type="logic_compare" id="^S@~Fb^s*:!MA293S-2R"><field name="OP">GT</field><value name="A"><block type="evalstring_all_e" id="aa*eD]u,rpCT9rx-gy9@"><field name="IdString">staLine truncated
|
||||
var xml = Blockly.Xml.textToDom(xml_init);
|
||||
Blockly.Xml.domToWorkspace(xml, demoWorkspace);
|
||||
//demoWorkspace.getBlockById("ZjQTmcPqlbmB4rWwtHFb").setDeletable(false);//设置为不可删除
|
||||
setTimeout(function(){
|
||||
//demoWorkspace.getBlockById("ZjQTmcPqlbmB4rWwtHFb").dispose();//删除
|
||||
}, 1000*1000);
|
||||
|
||||
|
||||
//=== listen
|
||||
|
||||
function myUpdateFunction(event) {
|
||||
gevent=event;
|
||||
console.log(event);
|
||||
/*
|
||||
https://developers.google.com/blockly/guides/configure/web/events
|
||||
file:///E:/workspace/blockly/blockly-master/demos/[mytest/Events%20%C2%A0_%C2%A0%20Blockly%20%C2%A0_%C2%A0%20Google%20Developers.mhtml
|
||||
|
||||
type string One of Blockly.Events.CREATE, Blockly.Events.DELETE, Blockly.Events.CHANGE, Blockly.Events.MOVE, Blockly.Events.UI.
|
||||
workspaceId string UUID of workspace. The workspace can be found with Blockly.Workspace.getById(event.workspaceId)
|
||||
blockId string UUID of block. The block can be found with workspace.getBlockById(event.blockId)
|
||||
group string UUID of group. Some events are part of an indivisible group, such as inserting a statement in a stack.
|
||||
|
||||
demoWorkspace.getBlockById(event.blockId).type=="customvar"
|
||||
|
||||
*/
|
||||
try {
|
||||
var code = Blockly.JavaScript.workspaceToCode(demoWorkspace);
|
||||
document.getElementById('codeArea').innerText = code;
|
||||
} catch (error) {
|
||||
document.getElementById('codeArea').innerText = String(error);
|
||||
console.log(error);
|
||||
}
|
||||
|
||||
}
|
||||
demoWorkspace.addChangeListener(myUpdateFunction);
|
||||
|
||||
demoWorkspace.addChangeListener(Blockly.Events.disableOrphans);//自动禁用任何未连接到根块的块
|
||||
|
||||
/*
|
||||
var MY_VARIABLE_callback = function (workspace) {
|
||||
var varList = ['status:atk','status:money','status:hp'];
|
||||
var xmlList = [];
|
||||
if (Blockly.Blocks['customvar']) {
|
||||
for (var i = 0; i < varList.length; i++) {
|
||||
var blockText = '<xml>' +
|
||||
'<block type="customvar">' +
|
||||
'<field name="VARNAME">' + varList[i] + '</field>' +
|
||||
'</block>' +
|
||||
'</xml>';
|
||||
var block = Blockly.Xml.textToDom(blockText).firstChild;
|
||||
xmlList.push(block);
|
||||
}
|
||||
}
|
||||
return xmlList;
|
||||
}
|
||||
demoWorkspace.registerToolboxCategoryCallback('MY_VARIABLE', MY_VARIABLE_callback);
|
||||
*/
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
|
||||
function showXML() {
|
||||
/* // Generate JavaScript code and display it.
|
||||
Blockly.JavaScript.INFINITE_LOOP_TRAP = null;
|
||||
var code = Blockly.JavaScript.workspaceToCode(demoWorkspace);
|
||||
alert(code); */
|
||||
var xml = Blockly.Xml.workspaceToDom(demoWorkspace);
|
||||
var xml_text = Blockly.Xml.domToText(xml);
|
||||
console.log(xml_text);
|
||||
console.log(xml);
|
||||
}
|
||||
|
||||
function runCode() {
|
||||
// Generate JavaScript code and run it.
|
||||
window.LoopTrap = 1000;
|
||||
Blockly.JavaScript.INFINITE_LOOP_TRAP =
|
||||
'if (--window.LoopTrap == 0) throw "Infinite loop.";\n';
|
||||
var code = Blockly.JavaScript.workspaceToCode(demoWorkspace);
|
||||
Blockly.JavaScript.INFINITE_LOOP_TRAP = null;
|
||||
try {
|
||||
eval('obj=' + code.split('\n').join(''));
|
||||
console.log(obj);
|
||||
} catch (e) {
|
||||
alert(e);
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
/*
|
||||
var xml = Blockly.Xml.workspaceToDom(demoWorkspace);
|
||||
var xml_text = Blockly.Xml.domToText(xml);
|
||||
//------
|
||||
var xml = Blockly.Xml.textToDom(xml_text);
|
||||
Blockly.Xml.domToWorkspace(xml, demoWorkspace);
|
||||
*/
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -19,6 +19,11 @@
|
||||
width: 435px;
|
||||
}
|
||||
|
||||
#appendPicSelection span {
|
||||
font-size:11px;
|
||||
-webkit-text-stroke: 1px black;
|
||||
}
|
||||
|
||||
#left6 {
|
||||
left: 5px;
|
||||
/* top: 1930px; */
|
||||
@@ -30,8 +35,17 @@
|
||||
height: 780px;
|
||||
}
|
||||
|
||||
#left6 #blocklyDiv {height: 480px; width: 940px;float:left;}
|
||||
#left6 #codeArea {width: 99.5%; height: 15.4em;overflow:y;/* resize:none; */clear:both;}
|
||||
#left6 #blocklyDiv {
|
||||
height: 480px;
|
||||
width: 940px;
|
||||
}
|
||||
|
||||
#left6 .CodeMirror {
|
||||
border: 1px solid #eee;
|
||||
height: 200px;
|
||||
width: 1300px;
|
||||
}
|
||||
#left6 #codeArea {width: 99.5%; height: 15.4em;overflow:y;/* resize:none; */}
|
||||
|
||||
#left7 {
|
||||
/* height: 440px; width: 375px;float:left; */
|
||||
@@ -87,6 +101,7 @@
|
||||
background-color: #f6f8fa;
|
||||
}
|
||||
/* copy end --------------------------------------------- */
|
||||
|
||||
.etable tr {width:100%}
|
||||
.etable tr > :nth-child(1) {width:20%}
|
||||
.etable tr > :nth-child(2) {width:20%}
|
||||
|
||||
@@ -209,9 +209,9 @@ initscript=String.raw`
|
||||
}
|
||||
try {
|
||||
var code = Blockly.JavaScript.workspaceToCode(workspace);
|
||||
document.getElementById('codeArea').value = code;
|
||||
codeAreaHL.setValue(code);
|
||||
} catch (error) {
|
||||
document.getElementById('codeArea').value = String(error);
|
||||
codeAreaHL.setValue(String(error));
|
||||
if (error instanceof OmitedError){
|
||||
var blockName = error.blockName;
|
||||
var varName = error.varName;
|
||||
@@ -267,6 +267,14 @@ xhr.onreadystatechange = function (){
|
||||
xhr.open('GET','_server/blockly/MotaAction.g4',true);
|
||||
xhr.send(null);
|
||||
|
||||
var codeAreaHL = CodeMirror.fromTextArea(document.getElementById("codeArea"), {
|
||||
lineNumbers: true,
|
||||
matchBrackets: true,
|
||||
lineWrapping: true,
|
||||
continueComments: "Enter",
|
||||
extraKeys: {"Ctrl-Q": "toggleComment"}
|
||||
});
|
||||
|
||||
editor_blockly.showXML = function () {
|
||||
var xml = Blockly.Xml.workspaceToDom(editor_blockly.workspace);
|
||||
var xml_text = Blockly.Xml.domToPrettyText(xml);
|
||||
@@ -293,7 +301,7 @@ editor_blockly.runCode = function () {
|
||||
|
||||
editor_blockly.parse = function () {
|
||||
MotaActionFunctions.parse(
|
||||
eval('obj=' + document.getElementById('codeArea').value.replace(/[<>&]/g,function(c){return {'<':'<','>':'>','&':'&'}[c];})),
|
||||
eval('obj=' + codeAreaHL.getValue().replace(/[<>&]/g,function(c){return {'<':'<','>':'>','&':'&'}[c];})),
|
||||
document.getElementById('entryType').value
|
||||
);
|
||||
}
|
||||
@@ -322,7 +330,7 @@ editor_blockly.import = function(id_){
|
||||
}[field];
|
||||
if(!type)return false;
|
||||
editor_blockly.id=id_;
|
||||
document.getElementById('codeArea').value = input.value;
|
||||
codeAreaHL.setValue(input.value);
|
||||
document.getElementById('entryType').value = type;
|
||||
editor_blockly.parse();
|
||||
editor_blockly.show();
|
||||
@@ -350,7 +358,7 @@ editor_blockly.confirm = function (){
|
||||
editor_blockly.hide();
|
||||
input.onchange();
|
||||
}
|
||||
if(document.getElementById('codeArea').value===''){
|
||||
if(codeAreaHL.getValue()===''){
|
||||
setvalue('null');
|
||||
return;
|
||||
}
|
||||
|
||||
+32
-24
@@ -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,13 +315,17 @@ 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;
|
||||
});
|
||||
Object.keys(editor_file.comment.floors.loc).forEach(function(v){
|
||||
delete(locObj[v]);
|
||||
});
|
||||
delete(locObj.map);
|
||||
return locObj;
|
||||
})(),
|
||||
editor_file.comment.floors.floor,
|
||||
@@ -330,13 +334,17 @@ 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;
|
||||
});
|
||||
Object.keys(editor_file.comment.floors.loc).forEach(function(v){
|
||||
delete(locObj[v]);
|
||||
});
|
||||
delete(locObj.map);
|
||||
return locObj;
|
||||
})(),
|
||||
editor_file.comment.floors.floor,
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head><meta charset="utf-8"></head>
|
||||
<body>
|
||||
<pre id='pout'>
|
||||
|
||||
</pre>
|
||||
<script src="fs.js"></script>
|
||||
<script src="editor_file.js"></script>
|
||||
<script>
|
||||
pout.innerHTML='waiting\nwaiting waiting';
|
||||
var editor={};
|
||||
editor.fs=fs;
|
||||
editor_file = editor_file(editor);
|
||||
editor.file=editor_file;
|
||||
//代码复制到 http://127.0.0.1:1055/drawMapGUI.html 的console中进行测试
|
||||
|
||||
/* editor.file.loadFloorFile('sample0',function(err){console.log(err);
|
||||
editor.file.saveFloorFileAs('aaa',function(err){console.log(err)});
|
||||
}); */
|
||||
|
||||
//查询
|
||||
/*
|
||||
editor.file.editItem('redJewel',[],function(a){console.log(a)});
|
||||
editor.file.editEnemy('redBat',[],function(a){console.log(a)});
|
||||
editor.file.editLoc(2,6,[],function(a){console.log(a)});
|
||||
editor.file.editFloor([],function(a){console.log(a)});
|
||||
editor.file.editTower([],function(a){console.log(a)});
|
||||
*/
|
||||
|
||||
//编辑
|
||||
/*
|
||||
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)});
|
||||
*/
|
||||
|
||||
pout.innerHTML='succeed\nsucceed succeed';
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -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();
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -219,6 +219,7 @@ tip_in_showMode = [
|
||||
'涉及图片的更改需要F5刷新浏览器来生效',
|
||||
'文本域可以通过双击,在文本编辑器或事件编辑器中编辑',
|
||||
'事件编辑器中的显示文本和自定义脚本的方块也可以双击',
|
||||
"画出的地图要点击\"保存地图\"才会写入到文件中",
|
||||
];
|
||||
var tip = new Vue({
|
||||
el: '#tip',
|
||||
|
||||
+12
-10
@@ -17,10 +17,9 @@
|
||||
<p class="warnText" v-if="error">{{ errors[error-1] }}</p>
|
||||
</div>
|
||||
<div id="editTip" v-cloak>
|
||||
<select id="selectFloor"></select><br>
|
||||
<br>
|
||||
<input type="button" value="当前地图另存为" id='saveFloorAs'/>
|
||||
<input id='saveAsName' placeholder="输入新楼层id"/>
|
||||
<input class='btn' type="button" value="save" id='saveFloor'/>
|
||||
<input class='btn' type="button" value="saveAs" id='saveFloorAs'/>
|
||||
<input class='btn' type="button" value="复制地图" v-on:click="copyMap"/>
|
||||
</div>
|
||||
<div style="position: absolute;right: 10px;bottom:70px;">
|
||||
@@ -49,10 +48,10 @@
|
||||
<canvas style="position:absolute;z-index:100"></canvas><!-- 用于响应鼠标点击 -->
|
||||
<canvas style="position:absolute;display:none;"></canvas><!-- 画出追加后的sprite用于储存 -->
|
||||
<div id="appendPicSelection">
|
||||
<div class="appendSelection"><span style="font-size:10px">1</span></div>
|
||||
<div class="appendSelection"><span style="font-size:10px"> 2</span></div>
|
||||
<div class="appendSelection"><span style="font-size:10px"> 3</span></div>
|
||||
<div class="appendSelection"><span style="font-size:10px"> 4</span></div>
|
||||
<div class="appendSelection"><span>1</span></div>
|
||||
<div class="appendSelection"><span> 2</span></div>
|
||||
<div class="appendSelection"><span> 3</span></div>
|
||||
<div class="appendSelection"><span> 4</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</div></div>
|
||||
@@ -128,7 +127,7 @@
|
||||
<category name="template"></category>
|
||||
</xml>
|
||||
</h3>
|
||||
<div>
|
||||
<div style="position: relative;">
|
||||
<div id="blocklyDiv"></div>
|
||||
<textarea id="codeArea" spellcheck="false"></textarea>
|
||||
</div>
|
||||
@@ -183,6 +182,9 @@
|
||||
<option value="functions">脚本编辑</option>
|
||||
<option value="appendpic">追加素材</option>
|
||||
</select>
|
||||
<br><br><br><br>
|
||||
<select id="selectFloor"></select>
|
||||
<input type="button" value="保存地图" id='saveFloor'/>
|
||||
<!-- -->
|
||||
<div id="bgSelect" v-cloak style="display:none">
|
||||
<span>当前地板: </span>
|
||||
@@ -337,7 +339,7 @@
|
||||
<script>
|
||||
//所有全局量
|
||||
__all__=['Vue','fs','editor_file','editor_mode','main','core','hasOwnProp','printf','printe','editor','converter','ActionParser','MotaActionFunctions','MotaActionBlocks'];
|
||||
__id__=['editArea','arrRowMark','mapRowMark','data','bg','dataSelection','blocklyDiv','codeArea','entryType'];
|
||||
__id__=['editArea','arrRowMark','mapRowMark','data','bg','dataSelection','blocklyDiv','codeAreaHL','entryType'];
|
||||
__Vue__=['exportM','editArea','editTip','clear','tip','selectBox'];
|
||||
//var event = document.getElementById('event');
|
||||
|
||||
@@ -357,7 +359,7 @@ main.init('editor', function() {
|
||||
editor.mode.floor();
|
||||
editor.mode.tower();
|
||||
editor.mode.functions();
|
||||
editor.mode.showMode('loc');
|
||||
editor.mode.showMode('floor');
|
||||
editor.mode.listen();
|
||||
editor_multi=editor_multi();
|
||||
editor_blockly=editor_blockly();
|
||||
|
||||
@@ -118,7 +118,7 @@ main.prototype.init = function (mode, callback) {
|
||||
for (var i = 0; i < main.dom.gameCanvas.length; i++) {
|
||||
main.canvas[main.dom.gameCanvas[i].id] = main.dom.gameCanvas[i].getContext('2d');
|
||||
}
|
||||
if (({"editor":0,"replay":0}).hasOwnProperty(mode)) {
|
||||
if (({"editor":0}).hasOwnProperty(mode)) {
|
||||
main.mode = mode;
|
||||
if (mode === 'editor')main.editor = {'disableGlobalAnimate':true};
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ comment_c456ea59_6018_45ef_8bcc_211a24c627dc =
|
||||
'range': 'range可选,代表领域伤害的范围;不加默认为1\n$range((thiseval==~~thiseval && thiseval>0)||thiseval==null)$end',
|
||||
'bomb':' 加入 "bomb": false 代表该怪物不可被炸弹或圣锤炸掉\n$select({\"values\":[true,false]})$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'
|
||||
|
||||
@@ -1,152 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv='content-type' content='text/html' charset='utf-8'>
|
||||
<meta http-equiv='X-UA-Compatible' content='IE=Edge, chrome=1'>
|
||||
<meta name='author' content='ckcz123'>
|
||||
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=yes'>
|
||||
<title></title>
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/>
|
||||
<meta name="screen-orientation" content="portrait">
|
||||
<meta name="full-screen" content="yes">
|
||||
<meta name="browsermode" content="application">
|
||||
<meta name="x5-orientation" content="portrait">
|
||||
<meta name="x5-fullscreen" content="true">
|
||||
<meta name="x5-page-mode" content="app">
|
||||
<link type='text/css' href='styles.css' rel='stylesheet'>
|
||||
</head>
|
||||
<body>
|
||||
<div id='gameGroup'>
|
||||
<p id='mainTips'>请稍后...</p>
|
||||
<div id='startPanel'>
|
||||
<div id='startTop'>
|
||||
<div id='startTopProgressBar'>
|
||||
<div id='startTopProgress'></div>
|
||||
</div>
|
||||
<p id='startTopLoadTips'>资源即将开始加载</p>
|
||||
</div>
|
||||
<img id='startBackground' src='project/images/bg.png'>
|
||||
<!-- 标题界面;可以改style的color使标题改变颜色 -->
|
||||
<p id='startLogo' style="color: black"></p>
|
||||
<div id='startButtonGroup'>
|
||||
<div id='startButtons'>
|
||||
<span class='startButton' id='playGame'>开始游戏</span>
|
||||
<span class='startButton' id='loadGame'>载入游戏</span>
|
||||
<span class='startButton' id='aboutGame'>关于本塔</span>
|
||||
</div>
|
||||
<div id='levelChooseButtons'>
|
||||
<span class='startButton' id='easyLevel'>简单</span>
|
||||
<span class='startButton' id='normalLevel'>普通</span>
|
||||
<span class='startButton' id='hardLevel'>困难</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id='floorMsgGroup'>
|
||||
<p id='logoLabel'></p>
|
||||
<p id='versionLabel'></p>
|
||||
<p id='floorNameLabel'></p>
|
||||
</div>
|
||||
<div id='statusBar' class="clearfix">
|
||||
<div class="status" id="floorCol">
|
||||
<img src='project/images/floor.png' id="img-floor">
|
||||
<p class='statusLabel' id='floor'></p>
|
||||
</div>
|
||||
<div class="status" id="lvCol">
|
||||
<img src='project/images/lv.png' id="img-lv">
|
||||
<p class='statusLabel' id='lv'></p>
|
||||
</div>
|
||||
<div class="status">
|
||||
<img src='project/images/hp.png' id="img-hp">
|
||||
<p class='statusLabel' id='hp'></p>
|
||||
</div>
|
||||
<div class="status">
|
||||
<img src='project/images/atk.png' id="img-atk">
|
||||
<p class='statusLabel' id='atk'></p>
|
||||
</div>
|
||||
<div class="status">
|
||||
<img src='project/images/def.png' id="img-def">
|
||||
<p class='statusLabel' id='def'></p>
|
||||
</div>
|
||||
<div class="status" id="mdefCol">
|
||||
<img src='project/images/mdef.png' id="img-mdef">
|
||||
<p class='statusLabel' id='mdef'></p>
|
||||
</div>
|
||||
<div class="status" id="moneyCol">
|
||||
<img src='project/images/money.png' id="img-money">
|
||||
<p class='statusLabel' id='money'></p>
|
||||
</div>
|
||||
<div class="status" id="expCol">
|
||||
<img src='project/images/experience.png' id="img-experience">
|
||||
<p class='statusLabel' id='experience'></p>
|
||||
</div>
|
||||
<div class="status" id="upCol">
|
||||
<img src='project/images/up.png' id="img-up">
|
||||
<p class='statusLabel' id='up'></p>
|
||||
</div>
|
||||
<div class="status">
|
||||
<span class='statusLabel' id='yellowKey' style="color:#FFCCAA"></span>
|
||||
<span class='statusLabel' id='blueKey' style="color:#AAAADD"></span>
|
||||
<span class='statusLabel' id='redKey' style="color:#FF8888"></span>
|
||||
</div>
|
||||
<div class="status" id="debuffCol">
|
||||
<span class='statusLabel' id='poison' style="color: #AFFCA8;"></span>
|
||||
<span class='statusLabel' id='weak' style="color: #FECCD0;"></span>
|
||||
<span class='statusLabel' id='curse' style="color: #C2F4E7;"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="toolBar" class="clearfix">
|
||||
<img src="project/images/book.png" class="tools" id='img-book'>
|
||||
<img src="project/images/fly.png" class="tools" id='img-fly'>
|
||||
<img src="project/images/toolbox.png" class="tools" id='img-toolbox'>
|
||||
<img src="project/images/shop.png" class="tools" id='img-shop'>
|
||||
<img src="project/images/save.png" class="tools" id='img-save'>
|
||||
<img src="project/images/load.png" class="tools" id='img-load'>
|
||||
<img src="project/images/settings.png" class="tools" id='img-settings'>
|
||||
<p class="statusLabel tools" id="hard"></p>
|
||||
</div>
|
||||
<div id="curtain"></div>
|
||||
<canvas class='gameCanvas' id='bg' width='416' height='416'></canvas>
|
||||
<canvas class='gameCanvas' id='event' width='416' height='416'></canvas>
|
||||
<canvas class='gameCanvas' id='fg' width='416' height='416'></canvas>
|
||||
<canvas class='gameCanvas' id='hero' width='416' height='416'></canvas>
|
||||
<canvas class='gameCanvas' id='ui' width='416' height='416'></canvas>
|
||||
<canvas class='gameCanvas' id='data' width='416' height='416'>此浏览器不支持HTML5</canvas>
|
||||
</div>
|
||||
<script id='mainScript' src='main.js'></script>
|
||||
<script>
|
||||
main.init('editor');
|
||||
//main.init('replay');
|
||||
main.listen();
|
||||
|
||||
var replayActions = function(){
|
||||
//core.onclick(7,7,[]);
|
||||
}
|
||||
|
||||
var replay = function(){
|
||||
core.events.startGame('');
|
||||
//setTimeout(function(){Array.from(Array(200)).forEach(function(){core.onclick(7,7,[]);});console.log(1);},1000);//关开场剧情
|
||||
//setTimeout(function(){try {Array.from(Array(200)).forEach(function(){core.drawText();})} catch (error){}},3000);//关firstArrive
|
||||
//console.log(1);
|
||||
|
||||
}
|
||||
|
||||
var afterInit = function(){
|
||||
main.editor.disableGlobalAnimate=false;
|
||||
main.editor.drawMapBg();
|
||||
main.editor.updateMap();
|
||||
core.setHeroMoveTriggerInterval();
|
||||
}
|
||||
var start = function(){
|
||||
var hard = 'Hard';
|
||||
core.resetStatus(core.firstData.hero, hard, core.firstData.floorId, core.initStatus.maps);
|
||||
core.changeFloor(core.status.floorId, null, core.firstData.hero.loc, null, function() {
|
||||
/* core.setHeroMoveTriggerInterval(); */
|
||||
afterInit();
|
||||
});
|
||||
core.events.setInitData(hard);
|
||||
}
|
||||
setTimeout(start, 300);
|
||||
//setTimeout(replay, 300);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in new issue
Block a user