事件和帽子
事件积木和帽子积木都控制脚本何时运行。它们看起来相似,但行为不同。本页大部分内容需要非沙箱扩展;唯一的例外(边缘激活帽子)在末尾说明。
事件积木
事件积木响应外部事物运行脚本:"当旗子被点击"、"当角色被点击"。积木本身从不执行;它只是标记事件发生时启动哪些脚本堆栈。
注意
事件积木只在非沙箱扩展中受支持。
这里有一个"当按下空格键"事件积木(下载):
(function(Scratch) {
'use strict';
if (!Scratch.extensions.unsandboxed) throw new Error('Must run unsandboxed');
class WhenSpaceKeyPressed {
getInfo() {
return {
id: 'eventexampleunsandboxed',
name: 'Event Block Example',
blocks: [
{
blockType: Scratch.BlockType.EVENT,
opcode: 'whenSpacePressed',
text: 'when space key pressed',
isEdgeActivated: false // EVENT 积木的必需样板
}
]
};
}
// 注意:whenSpacePressed 没有函数。事件积木从不运行代码。
}
document.addEventListener('keydown', (e) => {
if (e.key === ' ') {
Scratch.vm.runtime.startHats('eventexampleunsandboxed_whenSpacePressed');
}
});
Scratch.extensions.register(new WhenSpaceKeyPressed());
})(Scratch);
有两件事很突出:
isEdgeActivated: false是事件积木的必需样板。whenSpacePressed操作码没有方法。您不为事件积木编写代码。
您用 startHats 启动事件积木下的脚本。有两种形式:
- 当您在积木外部(事件处理器、计时器、回调)时,使用
Scratch.vm.runtime.startHats(...) - 当您在运行中的积木内部时,使用
util.startHats(...)
注意
在运行中的积木内部使用 Scratch.vm.runtime.startHats 而不是 util.startHats 可能破坏脚本执行。让形式与您所在的位置匹配。
startHats 的第一个参数是完整操作码,扩展id_操作码。上面是 eventexampleunsandboxed_whenSpacePressed。它启动项目中每个顶部积木是该操作码的脚本。
您在这里使用了 keydown 监听器,但任何给您回调的东西都有效:点击、setInterval、fetch 完成等。
按菜单筛选
与其为每个键建一个单独的积木,不如使用字段菜单,并将筛选器作为 startHats 的第二个参数传递(下载):
getInfo() {
return {
id: 'eventexample2unsandboxed',
name: 'Event Block Example 2',
blocks: [
{
blockType: Scratch.BlockType.EVENT,
opcode: 'whenPressed',
text: 'when [KEY] key pressed',
isEdgeActivated: false,
arguments: {
KEY: { type: Scratch.ArgumentType.STRING, menu: 'key' }
}
}
],
menus: {
key: {
acceptReporters: false, // 事件积木只支持字段菜单
items: [
{ text: 'space', value: ' ' },
'a', 'b', 'c'
]
}
}
};
}
document.addEventListener('keydown', (e) => {
Scratch.vm.runtime.startHats('eventexample2unsandboxed_whenPressed', {
KEY: e.key
});
});
事件积木菜单必须是字段菜单(acceptReporters: false);您不能向它们放入报告积木。startHats 的第二个参数是一个对象,其键是参数名,值针对菜单值(而不是显示文本)匹配。只有字段全部匹配的脚本才被启动。
按角色筛选
startHats 的第三个(最后一个)参数是一个目标。如果给定,只有该目标中的事件积木启动。获得目标的常见方式(下载):
- 舞台用
Scratch.vm.runtime.getTargetForStage()