通常,你会希望你的块接受一些东西作为“输入”、“参数”或“参数”。让我们通过一个新示例学习如何做到这一点:
严格平等.js - https://turbowarp.org/editor?extension=https://docs.turbowarp.org/example-extensions/strict-equality.js
class StrictEqualityExtension {
getInfo() {
return {
id: 'strictequalityexample',
name: 'Strict Equality',
blocks: [
{
opcode: 'strictlyEquals',
blockType: Scratch.BlockType.BOOLEAN,
text: '[ONE] 严格等于 [TWO]',
arguments: {
ONE: {
type: Scratch.ArgumentType.STRING
},
TWO: {
type: Scratch.ArgumentType.STRING,
defaultValue: 'Second value'
}
}
}
]
};
}
strictlyEquals(args) {
return args.ONE === args.TWO;
}
}
Scratch.extensions.register(new StrictEqualityExtension()); 请以加载hello world扩展相同的方式加载它。大多数代码与hello world扩展非常相似。请注意,此扩展中的严格等于块将区分“a”和“A”,这与普通的 Scratch 等于不同。
现在让我们谈谈论点。
若要向块添加参数,请为其指定一个属性。它应设置为包含其他对象的对象。您输入的每个属性对应于一个参数。每个人都有一个名字。名称可以是所有大写字母或您想要的任何格式。arguments arguments
下面是要为参数设置的最常见属性的摘要:
类型:Scratch.ArgumentType.*
描述:确定输入的形状以及默认文本输入接受的值。最常见的是 Scratch.ArgumentType.STRING、Scratch.ArgumentType.NUMBER 或 Scratch.ArgumentType.BOOLEAN。有关可接受的值,请参阅下表。请注意,这只是一个建议,实际类型可能会有所不同。
类型:字符串
描述:自选。积木中的默认值。仅将其用于带有文本框的输入;不适用于布尔输入。
类型:字符串
描述:稍后讨论
以下是 type 的可接受值:
Scratch.ArgumentType.STRING:字符串
Scratch.ArgumentType.NUMBER:数字
Scratch.ArgumentType.BOOLEAN:返回 True 或 False
Scratch.ArgumentType.COLOR:十六进制颜色代码
Scratch.ArgumentType.ANGLE:方向输入。90 表示向右。逆时针增加。与精灵方向相同。
Scratch.ArgumentType.MATRIX:以二进制表示的 5x5 矩阵
Scratch.ArgumentType.NOTE:钢琴键盘上的音符。
Scratch.ArgumentType.IMAGE:显示内联图像,而不是实际输入。稍后描述。
接下来,Scratch 需要知道将每个参数放在块中的哪个位置。它们是在开头、结尾还是中间的某个地方?它猜不出来,所以你必须告诉它。为此,您可以使用块上的属性,方法是使用语法来指示每个输入的去向。对象中的每个参数应恰好出现一次。参数可以按任何顺序排列;这不重要。text [ARGUMENT_NAME] argumentstext
当 Scratch 运行你的块函数时,它将传入第一个值的对象。此对象将包含块具有的每个参数名称的值。传统上我们称之为或使用解构语法。例如,如果块具有名为 和 的参数,则可以通过以下任何一种方式访问这些参数:args X Y
// 使用参数。XYZ格式...
goto(args) {
console.log(args.X, args.Y);
}
// 或者使用解构...
goto({X, Y}) {
console.log(X, Y);
}
参数可以是字符串、数字或布尔值,而不考虑指定为参数的类型。代码必须确保根据需要强制转换值。type
有时您可能希望您的块有一个下拉列表。这些称为菜单。我们将首先讨论静态菜单。这些菜单包含一组永不更改的固定项。
strings-1.js - https://turbowarp.org/editor?extension=https://docs.turbowarp.org/example-extensions/strings-1.js
class Strings1 {
getInfo() {
return {
id: 'strings1example',
name: 'Encoding',
blocks: [
{
opcode: 'convert',
blockType: Scratch.BlockType.REPORTER,
text: '将 [TEXT] 转换为 [FORMAT]',
arguments: {
TEXT: {
type: Scratch.ArgumentType.STRING,
defaultValue: 'Apple'
},
FORMAT: {
type: Scratch.ArgumentType.STRING,
menu: 'FORMAT_MENU'
}
}
}
],
menus: {
FORMAT_MENU: {
acceptReporters: true,
items: ['大写', '小写']
}
}
};
}
convert (args) {
if (args.FORMAT === '大写') {
// 请注意 toString() 调用:TEXT 可以是数字或布尔值,
// 所以我们必须确保首先将其转换为字符串,以便
// 它有一个toUpperCase()函数,否则我们会得到一个错误!
// 请记住:参数的“类型”只是对
// 编辑器;它永远不会强制执行。
return args.TEXT.toString().toUpperCase();
} else {
return args.TEXT.toString().toLowerCase();
}
}
}
Scratch.extensions.register(new Strings1()); 若要将参数放入菜单中,请将其设置为 并将其属性设置为菜单的名称。这对应于 getInfo() 返回的对象中的新属性。type Scratch.ArgumentType.STRING menu menus
menus是类似于 的对象的对象。中的每个项通常都是具有以下属性的对象:arguments menus
类型:array
描述:字符串数组。或者,数组中的项可以是包含 and 属性(两个字符串)的对象。text value
类型:boolean
描述:允许人们将复杂的块放入菜单中。你几乎总是希望这是 .true
字段是只能设置为固定字符串的参数。例如,请参阅“全部停止”块中的输入。输入是可以设置为任何值的参数。例如,请参阅“移动 10 步”块中的步数输入或“切换服装”块中的服装输入。您几乎总是想要一个输入,而不是一个字段。
虽然可以将菜单对象本身设置为数组,但强烈建议不要这样做,因为它隐式设置,同样,几乎从来都不是您想要的。几乎您使用的每个菜单都应显式设置为 true,以便它是“输入”而不是“字段”。请注意,将参数从字段切换到输入或相反是向后不兼容的更改。此规则的唯一例外是使用基于事件的帽子块时,这将在后面讨论。acceptReporters false acceptReporters
默认值通常是菜单项列表中的第一项。项目列表不得为空。
在某些情况下,您希望在下拉列表中向用户显示的文本与块内部接收的值不同。为此,项可以是对象列表而不是字符串(或者只有部分项可以是对象)。
strings-2.js - https://turbowarp.org/editor?extension=https://docs.turbowarp.org/example-extensions/strings-2.js
class Strings2 {
getInfo() {
return {
id: 'strings2example',
name: 'Encoding',
blocks: [
{
opcode: 'convert',
blockType: Scratch.BlockType.REPORTER,
text: '将 [TEXT] 转换为 [FORMAT]',
arguments: {
TEXT: {
type: Scratch.ArgumentType.STRING,
defaultValue: 'Apple'
},
FORMAT: {
type: Scratch.ArgumentType.STRING,
menu: 'FORMAT_MENU'
}
}
}
],
menus: {
FORMAT_MENU: {
acceptReporters: true,
items: [
{
text: '大写',
value: 'up'
},
{
text: '小写',
value: 'low'
}
]
}
}
};
}
convert (args) {
if (args.FORMAT === 'up') {
return args.TEXT.toString().toUpperCase();
} else {
return args.TEXT.toString().toLowerCase();
}
}
}
Scratch.extensions.register(new Strings2()); 请注意,尽管下拉列表在编辑器中显示大写,但块实际上接收“up”。