Blockly培训案例-Blocks的前世今生

Blocks的前世今生


在开始本案例之前,大家先通过下面的小例子,巩固一下Blockly开发者工具的使用。实现如下代码块的设计:


While Do

参考答案如下:


While_Do

一、Plane中raw块的模拟

1. 块的设计

在Block Factory中设计raw代码块的外观,完成设计后点击“Save raw-block”按钮,将新建块保存到Blocks Library中。


raw-block的外观设计
2. 块的代码导出

点击Block Exporter选项卡,选择raw-block代码:


选择 raw-block

修改界面中间部分的Export Setting属性:


块的导出设置
  • 勾中Block Definition(s)和Generator Stub(s)选项;
  • 将二者的Format属性(语言格式),都选为JavaScript;
  • 文件的命名,为方便辨认和引用,文件命名时建议采用块名(raw-block)+ b/g的形式,如命名为raw-block-b和raw-block-g。

属性修改完成之后,点击Export按钮即可对部分代码进行下载。导出的代码分两部分,一部分是Block Denifition代码,一部分是Generator Stub代码。

(1)Block Denifition代码
此部分代码,负责控制新建块(raw-blocks)的外观,包括样式、颜色等,最终放在blocks文件夹中。
(2)Generator Stub代码
此部分代码,负责控制新建块(raw-blocks)的代码转换,最终放在generators的对应子文件夹中。

3. html文件的修改

在完成块的代码设计与导出之后,需要将其导入至html文件中,以呈现给用户。
(1)导入raw_block_b文件

<script src="../../blocks/raw_block_b.js"></script>

(2)导入raw_block_g文件

  <script src="../../generators/javascript/raw_block_g.js"></script>

(3)导入raw_block_g块

<block type="raw_block"></block>

完成之后保存html文件,并在浏览器中打开,即可看到你所新建的块raw(5)了。


成功加载raw(5)块

提示:

  • 直接导出的文件放到指定的文件夹下并导入html文件中,可以直接使用;不过保险起见,最好类比其他blocks和generators中的文件,在文件顶部加上相应的“头”文件。 如下是在raw_block_b中添加的代码:

     'use strict';
     goog.provide('Blockly.Blocks.repeat_times');  // Deprecated
     goog.provide('Blockly.Constants.repeat_times');
     goog.require('Blockly.Blocks');
     goog.require('Blockly');
    
  • 在html文件修改的过程中,应注意raw_block_b、raw_block_g和raw_block插入的位置和顺序,会影响显示的效果,可自行探索尝试。


2. print-py块的设计

1. 块的设计

在Block Factory中设计print-py代码块的外观,完成设计后点击“Save print-py”按钮,将新建块保存到Blocks Library中。


print_py代码块的设计
2. 块的代码导出

点击Block Exporter选项卡,选择print-py代码:


选择 print-py

修改界面中间部分的Export Setting属性:


块的导出设置
  • 勾中Block Definition(s)和Generator Stub(s)选项;
  • 选择二者的Format属性(语言格式),前者选为JavaScript,后者选为Python;
  • 文件的命名,为方便辨认和引用,文件命名时建议采用块名(print-py)+ b/g的形式,如命名为print-py-b和print-py-g。

属性修改完成之后,点击Export按钮即可对部分代码进行下载。导出的代码分两部分,一部分是Block Denifition代码,一部分是Generator Stub代码。

(1)Block Denifition代码
此部分代码,负责控制新建块(print-py)的外观,包括样式、颜色等,最终放在blocks文件夹中。
(2)Generator Stub代码
此部分代码,负责控制新建块(print-py)的代码转换,最终放在generators的对应子文件夹中。

3. html文件的修改

在完成块的代码设计与导出之后,需要将其导入至html文件中,以呈现给用户。
(1)导入print_py_b文件

<script src="../../blocks/print_py_b.js"></script>

(2)导入raw_block_g文件

<script src="../../generators/python/print_py_g.js"></script>

(3)导入raw_block_g块

<block type="print_py"></block>

完成之后保存html文件,并在浏览器中打开,即可看到你所新建的块“打印”了。


成功加载打印块
4. 优化改进

完成前3步之后,功能已基本实现,现在有3个小任务,对print-py块进行优化。

  • (1)print-py代码是否可以与raw代码整合到一个文件中,为什么
  • (2)print-py块如何类比print块加上默认阴影
 <block type="print_py">
    <value name="print_sub">    // value的name为块设计中的value input的name
        <shadow type="text">
            <field name="TEXT">Test</field>
        </shadow>
    </value>
  </block>
  • (3)完善print-py块的其他几种语言的转换功能

3. Repeat-Do块的复现

在Block Factory中设计repeat-do代码块的外观,完成设计后点击“Save repeat-do”按钮,将新建块保存到Blocks Library中。


repeat-do代码块设计
2. 块的代码导出

可以选择像前两个demo中一样,直接Export代码块对应的代码,不过这里为了方便,直接用raw_block的js文件,复制repeat-do的两部分代码,分别粘贴到raw-block-b.js和raw-block-g.js文件中,保存即可。

3. html文件的修改

在完成块的代码设计与导出之后,需要将其导入至html文件中,以呈现给用户。
(1)raw_block_b和raw_block_g文件已导入,无需重复导入

<script src="../../blocks/raw_block_b.js"></script>
<script src="../../generators/javascript/raw_block_g.js"></script>

(2)导入repeat-do代码块,并加上默认阴影

<block type="repeat_do">
    <value name="repeat_times">
        <shadow type="math_number">
            <field name="NUM">10</field>
        </shadow>
    </value>
  </block>

完成之后保存html文件,并在浏览器中打开,即可看到你所新建的块repeat-do代码块了。


repeat-do块加载成功

是不是已经分辨不出哪个块是你自己创建的了?

4. 代码转换功能完善

虽然从外观已经很难分辨出哪个是我们自定义的repeat-do代码块了,但是我们并没有给它添加实际的代码转换功能,如下图:


repeat-do代码块

一个repeat-do代码块会有两个“参数”的输入,一个是次数,一个是需要do的语句,它们转换后的JavaScript代码应该为:

for (var count = 0; count < 10; count++) {
    window.alert('abc');
}

所以我们参照这个样式,来进行repeat-do自定义块代码的设计:

Blockly.JavaScript['repeat_do'] = function(block) {
    var value_repeat_times = Blockly.JavaScript.valueToCode(block, 'repeat_times',Blockly.JavaScript.ORDER_ATOMIC);
    var statements_repeat_statement = Blockly.JavaScript.statementToCode(block, 'repeat_statement');
    // TODO: Assemble JavaScript into code variable.
    var code = 'for(var count=0;count<' + value_repeat_times + ';count++){\n  ' + statements_repeat_statement + '}\n';
    return code;
};

至此,repeat-do代码块大功告成!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容