大家好,我是小黄。
相信大家在使用scratch的时候很多时候都会遇到很多的拓展,包括一些传感器的拓展,主控器的拓展等。
那么我们在开发的时候该如何实现这个功能呢?
阅读代码的时候我们发现,实际上Blockly加载的是Blockly.Blocks[toolboxName + “Toolbox”],那么他的到底是什么呢?
为此小黄在控制台输出了一下,大家看着代码觉得有点熟悉吗?没错就是toolbox里面的代码。
<xml id="toolbox-ze2" style="display: none"><category name="主控器" id="master" colour="#FFAB19" secondaryColour="#CF8B17" iconURI="static/blocks/master.svg"><block type="ZE2_master_buzzer" id="ZE2_master_buzzer"></block></category><category name="%{BKY_CATEGORY_MOTION}" id="motion" colour="#4C97FF" secondaryColour="#3373CC" iconURI="static/blocks/motion.svg"><block type="ZE2_motor_speed" id="ZE2_motor_speed"><value name="SPEED"><shadow type="math_number"><field name="NUM">50</field></shadow></value></block><block type="ZE2_motor_speed_times" id="ZE2_motor_speed_times"><value name="SPEED"><shadow type="math_number"><field name="NUM">50</field></shadow></value><value name="TIMES"><shadow type="math_number"><field name="NUM">5</field></shadow></value></block><block type="ZE2_motor_speed_set" id="ZE2_motor_speed_set"><value name="SPEED"><shadow type="math_number"><field name="NUM">30</field></shadow></value></block><block type="ZE2_motor_speed_forward" id="ZE2_motor_speed_forward"><value name="SPEED"><shadow type="math_number"><field name="NUM">50</field></shadow></value></block><block type="ZE2_motor_speed_wheel" id="ZE2_motor_speed_wheel"><value name="SPEED"><shadow type="math_number"><field name="NUM">50</field></shadow></value></block><block type="ZE2_motor_speed_motorscontroller" id="ZE2_motor_speed_motorscontroller"><value name="SPEED1"><shadow type="math_number"><field name="NUM">50</field></shadow></value><value name="SPEED2"><shadow type="math_number"><field name="NUM">50</field></shadow></value></block><block type="ZE2_motor_speed_power" id="ZE2_motor_speed_power"><value name="SPEED1"><shadow type="math_number"><field name="NUM">50</field></shadow></value><value name="SPEED2"><shadow type="math_number"><field name="NUM">50</field></shadow></value><value name="SPEED3"><shadow type="math_number"><field name="NUM">50</field></shadow></value></block><block type="motor_stop" id="motor_stop"></block><block type="servo_steeringengine" id="servo_steeringengine"><value name="SPEED"><shadow type="math_number"><field name="NUM">50</field></shadow></value></block></category><category name="传感器" id="sensor" colour="#59C059" secondaryColour="#59C059" iconURI="static/blocks/sensor.svg"><block type="semsor_wavesensornuumber" id="semsor_wavesensornuumber"></block><block type="semsor_touchsensorpressed" id="semsor_touchsensorpressed"></block><block type="semsor_setcolorlampmodule" id="semsor_setcolorlampmodule"></block><block type="semsor_graylevel" id="semsor_graylevel"></block><block type="sensor_setgreyblock" id="sensor_setgreyblock"><value name="SPEED"><shadow type="math_number"><field name="NUM">1000</field></shadow></value></block><block type="semsor_greyvalue" id="semsor_greyvalue"></block><block type="semsor_infrareddistancemeasurement" id="semsor_infrareddistancemeasurement"></block></category><category name="%{BKY_CATEGORY_CONTROL}" id="control" colour="#FFAB19" secondaryColour="#CF8B17" iconURI="static/blocks/control.svg"><block type="control_wait" id="control_wait"><value name="DURATION"><shadow type="math_positive_number"><field name="NUM">1</field></shadow></value></block><block type="control_repeat" id="control_repeat"><value name="TIMES"><shadow type="math_whole_number"><field name="NUM">10</field></shadow></value></block><block type="control_forever" id="control_forever"></block><block type="control_if" id="control_if"></block><block type="control_if_else" id="control_if_else"></block><block type="control_wait_until" id="control_wait_until"></block><block type="control_repeat_until" id="control_repeat_until"></block></category><category name="%{BKY_CATEGORY_OPERATORS}" id="operators" colour="#40BF4A" secondaryColour="#389438" iconURI="static/blocks/operators.svg"><block type="operator_choose" id="operator_choose"><value name="OPERAND1"><shadow type="text"><field name="TEXT"></field></shadow></value><value name="choose_menu"><shadow type="operators_choose_menu"><field name="choose_menu">=</field></shadow></value><value name="OPERAND2"><shadow type="math_number"><field name="NUM">0</field></shadow></value></block><block type="operator_commonoperator" id="operator_commonoperator"><value name="OPERAND1"><shadow type="text"><field name="TEXT"></field></shadow></value><value name="operator_menu"><shadow type="operators_operator_menu"><field name="operator_menu">+</field></shadow></value><value name="OPERAND2"><shadow type="math_number"><field name="NUM">0</field></shadow></value></block><block type="operator_Rounding" id="operator_Rounding"><value name="OPERAND1"><shadow type="math_number"><field name="NUM">0</field></shadow></value><value name="OPERAND2"><shadow type="math_number"><field name="NUM">10</field></shadow></value></block><block type="operator_and" id="operator_and"></block><block type="operator_or" id="operator_or"></block><block type="operator_not" id="operator_not"></block></category><category name="变量" id="data" colour="#FF8C1A" secondaryColour="#DB6E00" custom="VARIABLE" iconURI="static/blocks/data.svg"></category><category name="自制积木" id="more" colour="#FF6680" secondaryColour="#FF4D6A" custom="PROCEDURE" iconURI="static/blocks/more.svg"></category></xml>
为了使效果更好看,小黄放了一个图片暂代一下。点击拓展的时候就显示图片,点击图片的时候就出现拓展的积木块。
下面是图片点击事件的代码;
function closeexpand() {
let expandID = document.getElementById('expandImg');
expandID.style.display = 'none';
var workspace = Blockly.getMainWorkspace();
let originalString = Blockly.Blocks["ZE2" + "Toolbox"];
console.log(originalString);
let slicedString = originalString.slice(0, originalString.indexOf('blocks/more.svg') + 28);
let slicedStringRight = originalString.slice(originalString.indexOf('blocks/more.svg') + 28, originalString.length);
console.log(slicedString);
console.log(slicedStringRight);
let codeExpand = '<category name="%{BKY_CATEGORY_CONTROL}" id="control" colour="#FFAB19" secondaryColour="#CF8B17" iconURI="static/blocks/control.svg">' +
'<block type="control_wait" id="control_wait">' +
'<value name="DURATION"><shadow type="math_positive_number"><field name="NUM">1</field></shadow></value>' +
'</block>' +
'<block type="control_repeat" id="control_repeat">' +
'<value name="TIMES"><shadow type="math_whole_number"><field name="NUM">10</field></shadow></value>' +
'</block>' +
'<block type="control_forever" id="control_forever"></block>' +
'<block type="control_if" id="control_if"></block>' +
'<block type="control_if_else" id="control_if_else"></block>' +
'<block type="control_wait_until" id="control_wait_until"></block>' +
'<block type="control_repeat_until" id="control_repeat_until"></block>' +
'</category>';
var xmlcodeFinally = slicedString + codeExpand + slicedStringRight;
console.log(xmlcodeFinally);
workspace.updateToolbox(xmlcodeFinally)
}
我们先通过slice()截取字符串,我们截取之前的那一段,之后拼接上codeExpand,在把末尾的加上,这样我们就组成了一个新的toolbox目录代码了。最后我们通过updateToolbox()函数更新toolbox。这样就实现了拓展的过程。
好了今天的分享就是这么多了!
作者介绍:
热爱编程、写作的小菜鸡,喜交天下各路英雄好友,欢迎关注本人公众号一起学习、交流。如果您遇到什么问题请给我留言。需要源码的小伙伴请关注公众号回复:scratch获取。
关注我,一起学习探讨更多scratch-block知识!
有任何不懂的小伙伴可以加入群聊大家一起讨论。微信群过期的话可以加入QQ群:947525840。