上次我用Javascript制作了一个Scratch拓展(视频在这里)
就有很多人会问:啊这个怎么做啊?是不是很复杂啊??
额,其实一点也不(我自己都不咋会Javascript)难
首先你需要一个模板:
class MyExt{//名称可以自己改
getInfo(){//只能这么写不然不会识别
return {
id: 'Myid',//id也可以自己改,但一开始写就得确定,以后更新代码的时候不再改动id,否则用这个id做的作品就无法识别新id和旧id做的代码导致崩溃
//说白了确定就别动了
//必须是函数支持的名称(A~Z,a~z,_,1~9,不能数字开头)
name: '',//在左边显示的插件名称,可以包括中文
color1:'#00FF00',//代码块颜色,可以添加3个,分别是color1,color2,color3,也可以不写
blocks:[
//在这里面定义代码块
],
};
}
//在这里定义代码块函数
}
Scratch.extensions.register(new MyExt()/*这个必须和第一行的class一样*/); 这就是一个模板,需要往里面加入些东西
首先,往blocks里写入写块,编辑器才能识别
//示例:hello world
{
opcode:'hello',//相当于代码的id,也不要在更新时改动
blockType: Scratch.BlockType.REPORTER,//REPORTER下面会讲
text:'Hello,world!'//在代码块上显示的内容
}, 这是一个示例的块,内容是'Hello,world!'
但这还没完,现在我们只定义了一个空的“壳”,里面没有任何内容,编辑器也不知道应该做什么,于是报错。
所以我们还得在 getInfo 的下面写上函数,让编辑器(编译器)识别他
hello/*必须对应代码的opcode*/() {
return "Hello,world!"//也可以返回任何数字/字符串等
} 于是一个完整的拓展就做好了
class MyExt {
getInfo() {
return {
id: 'hello',
name: 'Hello world!',
blocks: [
{
opcode: 'hello',
blockType: Scratch.BlockType.REPORTER,
text: 'Hello, world!'
}
]
};
}
hello() {
return 'Hello, world!';
}
}
Scratch.extensions.register(new MyExt()); 示例链接:https://turbowarp.org/editor?extension=https://livefile.xesimg.com/programme/python_assets/eb48092d8edfba77ade1fc13db767ca0.js
是一个函数,应该包含以下内容:
id是一个字符串,表示此扩展使用的唯一 ID。它应该只包含字符 a-z , 0-9以及下划线。同一扩展应始终使用相同的 ID,因为更改它会破坏现有项目。
name是一个字符串,告诉 Scratch 要在侧边栏中显示什么名称
blocks是一个对象列表,用于定义扩展包含哪些块。
type定义要制作的输入形状。请注意,无论此处设置何种类型,都不能保证实际传递给块的值被强制转换为正确的类型。例如,您应该手动将参数转换为数字,因为它们通常会作为字符串传递。
Scratch.BlockType.REPORTER制作数字或字符串返回块
Scratch.BlockType.BOOLEAN制作布尔返回块
Scratch.BlockType.COMMAND制作控制块
defaultValue是从库创建块时的初始值(默认值)
arguments是一个对象,用于定义块接受的参数。每个参数都有:
Scratch.ArgumentType.STRING对于字符串输入
Scratch.ArgumentType.NUMBER用于数字输入
Scratch.ArgumentType.BOOLEAN对于布尔输入(无默认值)
Scratch.ArgumentType.ANGLE对于角度
Scratch.ArgumentType.COLOR对于颜色(#123abc格式)
Scratch.ArgumentType.MATRIX对于 5x5 矩阵(以 11101010101... 字符串格式传递)
Scratch.ArgumentType.NOTE对于音符(音乐模块)
(转自docs.turbowarp.org/development/custom-extensions)
下面有一个传参的样例:
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,//一个输入,输入类型为STRING字符串
defaultValue: '1'
},
TWO: {
type: Scratch.ArgumentType.STRING,//同上
defaultValue: '2'
}
}
}
]
};
}
strictlyEquals(args) {
return args.ONE === args.TWO;//判断,返回(===代表严格平等)
}
}
Scratch.extensions.register(new StrictEqualityExtension()); 示例链接:https://turbowarp.org/editor?extension=https://livefile.xesimg.com/programme/python_assets/980a0f1406c6d2bdef35471ed06f0cd3.js
要说的就这么多,下期再见~