(2020/08/19)
每次上完法蘭斯的課,回來一定要馬上做筆記,不然過兩天就會忘記了,上課的內容實在太多、太精彩了,所以回家要再好好演練一下,順便記錄,免得下次又忘了!!
一、上課講義
二、Web:Bit自製積木架構
在WebBit的package.nw 下
架構如下:
直接下載法蘭斯的範例檔(myBlocks)來修改
三、使用Blockly Developer Tools
此工具簡單的來說就用積木來製作想要的積木
最後會匯出blocks.js, javascript.js, toolbox.xml (這三個檔案最後會放到blockly的資料夾下)
網址:https://blockly-demo.appspot.com/static/demos/blockfactory/index.html
我的第一個積木:求四邊形及圓形面積
第一個積木:可輸入【長】及【寛】,進而求得四邊形面積
第二個積木:可輸入【半徑】,進而求得圓形面積
作法如下:
進入Blockly Developer Tools
匯出blocks.js及javascript.js檔,存到blockly資料夾下,把原本的覆蓋掉
匯出toolbox.xml檔,存到blockly資料夾下,把原本的覆蓋掉
四、修改檔案內容
修改myBlocks下的blockly.json (自訂積木佈署檔)
{
"types": ["square_area", "circle_area"],
"category": "catPlus",
"scripts": [
"blockly/blocks.js",
"blockly/javascript.js"
],
"dependencies": [
"myBlocks.js"
],
"msg": "blockly/msg",
"blocksMsg": "blockly/msg/blocks",
"toolbox": "blockly/toolbox.xml"
}
只要修改第2行的內容即可,改成自己的積木名稱,如果有更多積木就再增加
修改myBlocks\blockly\blocks.js
原本程式
Blockly.Blocks['square_area'] = {
init: function() {
this.appendDummyInput()
.appendField("四邊形面積");
this.appendValueInput("NAME1")
.setCheck("Number")
.appendField("長度");
this.appendValueInput("NAME2")
.setCheck("Number")
.appendField("寛度");
this.setInputsInline(true);
this.setOutput(true, "Number");
this.setColour(290);
this.setTooltip("");
this.setHelpUrl("");
}
};
Blockly.Blocks['circle_area'] = {
init: function() {
this.appendDummyInput()
.appendField("圓形面積");
this.appendValueInput("NAME3")
.setCheck("Number")
.appendField("半徑");
this.setInputsInline(true);
this.setOutput(true, "Number");
this.setColour(290);
this.setTooltip("");
this.setHelpUrl("");
}
};
修改成動態語系文字
Blockly.Blocks['square_area'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Msg.square_area);
this.appendValueInput("NAME1")
.setCheck("Number")
.appendField(Blockly.Msg.square_length);
this.appendValueInput("NAME2")
.setCheck("Number")
.appendField(Blockly.Msg.square_width);
this.setInputsInline(true);
this.setOutput(true, "Number");
this.setColour(290);
this.setTooltip("");
this.setHelpUrl("");
}
};
Blockly.Blocks['circle_area'] = {
init: function() {
this.appendDummyInput()
.appendField(Blockly.Msg.circle_area);
this.appendValueInput("NAME3")
.setCheck("Number")
.appendField(Blockly.Msg.circle_radius);
this.setInputsInline(true);
this.setOutput(true, "Number");
this.setColour(290);
this.setTooltip("");
this.setHelpUrl("");
}
};
這與blockly/msg/blocks下的語系內容有關 (積木內的文字)
zh-hant.js內容如下(其實另兩個檔案的內容也都一樣)
Blockly.Msg.square_area = "四邊形面積";
Blockly.Msg.square_length = "長度";
Blockly.Msg.square_width = "寛度";
Blockly.Msg.circle_area = "圓形面積";
Blockly.Msg.circle_radius = "半徑";
修改myBlocks\blockly\toolbox.xml (主選單)
原始檔案
<xml xmlns="https://developers.google.com/blockly/xml" id="toolbox" style="display: none">
<block type="square_area">
<value name="NAME1">
<block type="math_number">
<field name="NUM">1</field>
</block>
</value>
<value name="NAME2">
<block type="math_number">
<field name="NUM">1</field>
</block>
</value>
</block>
<block type="circle_area">
<value name="NAME3">
<block type="math_number">
<field name="NUM">1</field>
</block>
</value>
</block>
</xml>
修改成如下
<category id="myBlocks" name="myBlocks">
<category id="myCategory1" name="myCategory1">
<block type="square_area">
<value name="NAME1">
<block type="math_number">
<field name="NUM">1</field>
</block>
</value>
<value name="NAME2">
<block type="math_number">
<field name="NUM">1</field>
</block>
</value>
</block>
</category>
<category id="myCategory2" name="myCategory2">
<block type="circle_area">
<value name="NAME3">
<block type="math_number">
<field name="NUM">1</field>
</block>
</value>
</block>
</category>
</category>
註:Web:bit取ID的值;BlocklyDuino取name的值
這與blockly/msg下的語系內容有關 (與主目錄及子目錄內的名稱有關)
zh-hant.js內容如下(其實另兩個檔案的內容也都一樣)
MSG.myBlocks = "阿玉積木";
MSG.myCategory1 = "求長方形面積";
MSG.myCategory2 = "求圓面積";
這時積木已成形,要使用瀏覽器版來觀看
修改myBlocks\blockly\javascript.js (點上方【程式碼】所顯示的內容)
原本程式
Blockly.JavaScript['square_area'] = function(block) {
var value_name1 = Blockly.JavaScript.valueToCode(block, 'NAME1', Blockly.JavaScript.ORDER_ATOMIC);
var value_name2 = Blockly.JavaScript.valueToCode(block, 'NAME2', Blockly.JavaScript.ORDER_ATOMIC);
// TODO: Assemble JavaScript into code variable.
var code = '...';
// TODO: Change ORDER_NONE to the correct strength.
return [code, Blockly.JavaScript.ORDER_NONE];
};
Blockly.JavaScript['circle_area'] = function(block) {
var value_name3 = Blockly.JavaScript.valueToCode(block, 'NAME3', Blockly.JavaScript.ORDER_ATOMIC);
// TODO: Assemble JavaScript into code variable.
var code = '...';
// TODO: Change ORDER_NONE to the correct strength.
return [code, Blockly.JavaScript.ORDER_NONE];
};
將面積的公式帶入,修改成以下
Blockly.JavaScript['square_area'] = function(block) {
var value_name1 = Blockly.JavaScript.valueToCode(block, 'NAME1', Blockly.JavaScript.ORDER_ATOMIC);
var value_name2 = Blockly.JavaScript.valueToCode(block, 'NAME2', Blockly.JavaScript.ORDER_ATOMIC);
// TODO: Assemble JavaScript into code variable.
var code = value_name1 + ' * '+ value_name2;
// TODO: Change ORDER_NONE to the correct strength.
return [code, Blockly.JavaScript.ORDER_NONE];
};
Blockly.JavaScript['circle_area'] = function(block) {
var value_name3 = Blockly.JavaScript.valueToCode(block, 'NAME3', Blockly.JavaScript.ORDER_ATOMIC);
// TODO: Assemble JavaScript into code variable.
var code = value_name3 + '*' + value_name3 + '*'+ 3.14;
// TODO: Change ORDER_NONE to the correct strength.
return [code, Blockly.JavaScript.ORDER_NONE];
};
剛又經法蘭斯指導了一下,又把上面程式改的更好一點
修改myBlocks下的myBlocks.js
此程式為函式庫,因本積木沒有用到函式庫,因此此檔可以留白
展示成果
自製簡單的小積木,成功!所有程式如附件!
下次再來嘗試更難的,或Blocklyduino的積木....
五、新增及移除積木的方法
myBlocks自訂積木連結設定
http://localhost:20975/myBlocks/blockly.json
新增及移除積木的指令
新增
Code.customTab.$__add__('http://localhost:20975/myBlocks/blockly.json');
移除
Code.customTab.$__remove__('http://localhost:20975/myBlocks/blockly.json');
作法如下:
點擊【Console】
移除積木