处理输入
羽岚_Aoken
编辑于 2023年05月11日 05:05
收录于文集
共2篇

通常,你会希望你的块接受一些东西作为“输入”、“参数”或“参数”。让我们通过一个新示例学习如何做到这一点:

严格平等.jshttps://turbowarp.org/editor?extension=https://docs.turbowarp.org/example-extensions/strict-equality.js

代码块
JavaScript
自动换行
复制代码
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

下面是要为参数设置的最常见属性的摘要:

type:

  • 类型:Scratch.ArgumentType.*

  • 描述:确定输入的形状以及默认文本输入接受的值。最常见的是 Scratch.ArgumentType.STRINGScratch.ArgumentType.NUMBERScratch.ArgumentType.BOOLEAN。有关可接受的值,请参阅下表。请注意,这只是一个建议,实际类型可能会有所不同。

defaultValue:

  • 类型:字符串

  • 描述:自选。积木中的默认值。仅将其用于带有文本框的输入;不适用于布尔输入。

menu:

  • 类型:字符串

  • 描述:稍后讨论

以下是 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 Y

代码块
JavaScript
自动换行
复制代码
  // 使用参数。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

代码块
JavaScript
自动换行
复制代码
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

acceptReporters

  • 类型:boolean

  • 描述:允许人们将复杂的块放入菜单中。你几乎总是希望这是 .true

字段是只能设置为固定字符串的参数。例如,请参阅“全部停止”块中的输入。输入是可以设置为任何值的参数。例如,请参阅“移动 10 步”块中的步数输入或“切换服装”块中的服装输入。您几乎总是想要一个输入,而不是一个字段。

虽然可以将菜单对象本身设置为数组,但强烈建议不要这样做,因为它隐式设置,同样,几乎从来都不是您想要的。几乎您使用的每个菜单都应显式设置为 true,以便它是“输入”而不是“字段”。请注意,将参数从字段切换到输入或相反是向后不兼容的更改。此规则的唯一例外是使用基于事件的帽子块时,这将在后面讨论。acceptReporters false acceptReporters

默认值通常是菜单项列表中的第一项。项目列表不得为空。

在某些情况下,您希望在下拉列表中向用户显示的文本与块内部接收的值不同。为此,项可以是对象列表而不是字符串(或者只有部分项可以是对象)。

strings-2.js - https://turbowarp.org/editor?extension=https://docs.turbowarp.org/example-extensions/strings-2.js

代码块
JavaScript
自动换行
复制代码
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”。