Easy Scratch封装了如上传、加载、菜单配置、云变量接口、自定义素材库等常用的功能。只需简单js基础,即可轻松对接到平台上。You can easy embed scratch to your website with config and javascript
Go to file
2020-08-29 20:59:20 +08:00
doc 更新文档 2020-01-20 14:34:17 +08:00
docs 同步至官方2020-02-29 2020-02-29 15:03:56 +08:00
src 舞台区域尺寸配置 2020-08-29 20:59:20 +08:00
static 可配置默认项目 2020-04-17 15:39:39 +08:00
test 同步至官方2020-02-29 2020-02-29 15:03:56 +08:00
.babelrc 同步到官方#20191231 2019-12-31 17:48:57 +08:00
.browserslistrc 同步到官方#20191231 2019-12-31 17:48:57 +08:00
.editorconfig 同步到官方#20191231 2019-12-31 17:48:57 +08:00
.eslintignore 同步到官方#20191231 2019-12-31 17:48:57 +08:00
.eslintrc.js 同步到官方#20191231 2019-12-31 17:48:57 +08:00
.gitattributes 同步到官方#20191231 2019-12-31 17:48:57 +08:00
.gitignore 同步至官方2020-02-29 2020-02-29 15:03:56 +08:00
.npmignore 同步到官方#20191231 2019-12-31 17:48:57 +08:00
.travis.yml 同步到官方#20191231 2019-12-31 17:48:57 +08:00
INIT init 2019-12-30 16:02:12 +08:00
LICENSE 同步到官方#20191231 2019-12-31 17:48:57 +08:00
package-lock.json 同步到官方#20191231 2019-12-31 17:48:57 +08:00
package.json 增加生产环境编译命令 2020-03-16 17:33:32 +08:00
prune-gh-pages.sh 同步到官方#20191231 2019-12-31 17:48:57 +08:00
README-RAW.md 更新文档 2020-01-20 14:34:17 +08:00
README.md 舞台区域尺寸配置 2020-08-29 20:59:20 +08:00
TRADEMARK 同步到官方#20191231 2019-12-31 17:48:57 +08:00
webpack.config.js 手残了 2020-08-27 23:14:48 +08:00
webpack.prod.js player template 2020-08-27 22:57:44 +08:00

项目介绍

使用本项目不需要关注Scratch3.0功能的具体实现只需要简单的js基础即可调用Scratch的相关功能助力项目快速开发。

  • 以最小的改动量实现功能方便合并官方最新scratch

  • 功能封装并对外提供调用接口, 不需要改动scratch本身代码

可以实现的功能

  • 加载项目
  • 上传项目
  • 修改Logo等外观
  • 移动端虚拟键盘
  • 使用自己的素材库
  • And more……

使用方法

直接使用

demo见编译后的build/index.html文件

参考系统

开源Teaching在线教学系统便是使用的本项目可以参考具体示例

官网:http://teaching.vip

开源地址:http://github.com/open-scratch/teaching

二次开发

调试 npm start 编译 npm run build 编译正式版 npm run build:prod

建议在Linux环境下编译开发windows下编译可参见

https://www.213.name/archives/1739

参与本项目

如果大佬有更好的实现方法和更好的创意欢迎提交PR

Scratch项目分析

各个模块

scratch-vm 虚拟机

解析加载序列化项目文件、扩展功能实现、根据相应事件渲染舞台

scratch-audio 声音引擎

解析、播放声音

scratch-blocks 代码积木块

创建积木操作块区域和每个积木对应的代码

scratch-l10n 国际化

多语言支持

scratch-paint 画图引擎

图片编辑器

scratch-render

舞台渲染

scratch-storage 存储引擎

项目和对应素材的存储加载

scratch-svg-renderer

svg文件处理

项目结构

├── build                    # 编译后的文件夹
│   ├── static               # 静态资源
│   ├── chunks               # scratch核心加载器
│   ├── index.html           # scratch编辑器
│   ├── player.html          # scratch播放器
│   ├── lib.min.js           # scratch核心
├── src
│   ├── components           # UI组件
│   ├── containers           # 容器组件,承载容器组件业务逻辑
│   ├── css                  # 全局通用css
│   ├── examples             # 集成测试用例
│       ├── extensions       # 拓展案例
│   ├── lib                  # 插件及高阶组件
│       ├── audio            # 声音插件
│       ├── backpack         # 背包插件
│       ├── default-project  # 默认项目
│       ├── libraries        # 素材库相关
│       ├── video            # 视频模块
│   ├── playground           # 编译后页面的模版
│   ├── reducers             # 全局状态控制
├── test                     # 测试用例
├── translations             # 翻译库
├── README.md
├── README-RAW.md            #
└── package.json
└── webpack.config.js
└── webpack.prod.js

快速使用

直接使用本DEMO

编译后直接修改index.html和player.html中的配置即可使用

引入到自己的页面

页面引入lib.min.js和chunks/gui.js后scratch将自动渲染至<div id="scratch"></div>内。

完整配置示例

window.scratchConfig = {
      logo: {
        show: true
        , url: "https://scratch.mit.edu/images/logo_sm.png"
        , handleClickLogo: () => {
          console.log('点击LOGO')
        }
      }, 
      menuBar: {
        color: 'hsla(215, 100%, 65%, 1)', //菜单栏颜色
        //新建按钮
        newButton:{
          show: true,
          handleBefore(){ //执行新建前的操作返回true则继续执行
            return true
          }
        },
        //从计算机加载按钮
        loadFileButton:{
          show: true,
          handleBefore(){
            return false
          }
        },
        //保存到计算机按钮
        saveFileButton:{
          show: true,
          handleBefore(){
            return true
          }
        },
        //加速模式按钮
        turboModeButton:{
          show: true
        },
        //教程按钮
        helpButton:{
          show: true
        }
      }, 
      shareButton: {
        show: true,
        buttonName: "分享",
        handleClick: () => {
          //点击分享按钮
          console.log('分享按钮')
          window.scratch.getProjectCover(cover => {
            //TODO 获取到作品截图
            console.log(cover)
          })
          window.scratch.getProjectFile(file => {
            //TODO 获取到项目文件
            console.log(file)
          })
          // 获取到项目名
          var projectName = window.scratch.getProjectName()
          console.log(projectName);
        }
      }, 
      profileButton: {
        show: true,
        buttonName: "我的作品",
        handleClick:()=>{
          //点击profile按钮
        }
      }, 
      //舞台区配置仅playerOlny模式生效
      stageArea:{
        scale: 1, //舞台区比例
        width: 480, // 舞台宽
        height: 360, //舞台高
        showControl: false, //是否显示舞台区控制按钮
        showLoading: false, //是否显示Loading
      },
      handleVmInitialized: (vm) => {
        window.vm = vm
        console.log("VM初始化完毕")
        
      },
      handleProjectLoaded:() => {
        console.log("作品载入完毕")

      },
      handleDefaultProjectLoaded:() => {
        //默认作品加载完毕,一般在这里控制项目加载
        // window.scratch.setProjectName("默认项目")
        //  window.scratch.loadProject("/project.sb3", () => { 
        //     console.log("项目加载完毕")
        //     window.scratch.setProjectName("默认项目")
        //  })
      },
      //默认项目地址,不需要修请删除本配置项
      // defaultProjectURL: "./static/project.sb3",
      //若使用官方素材库请删除本配置项, 默认为/static下的素材库
      assetCDN: './static' 
    }

API参考

全局对象

window.vm对象

scratch-vm实例化的对象可以从外部操作部分vm功能

对象常用API列表

  • vm.saveProjectSb3() 获取SB3格式项目
  • vm.loadProject(file) 加载SB3项目
  • vm.greenFlag() 点击小绿旗
  • vm.stopAll() 停止运行项目
  • ……

Scratch-vm介绍

Scratch-vm官方文档

scratch初始化配置

初始化配置均通过window.scratchConfig对象完成

需要注意的是需要在引入lib.min.js之前就加入该代码

属性: window.scratchConfig.logo

参数名 描述
show 是否显示
url logo地址
handleClickShare 处理LOGO点击事件

支持图片URL和base64建议使用PNG半透明图片

菜单栏

菜单栏样式

window.scratchConfig.menuBar

参数名 描述
color 菜单栏颜色

原始菜单控制

控制原始菜单的显示隐藏,是否可以执行。 见完整配置示例

分享按钮

window.scratchConfig.shareButton

参数名 描述
show 是否显示
handleClick 处理按钮点击事件

个人中心按钮

window.scratchConfig.profileButton

参数名 描述
show 是否显示
handleClick 处理按钮点击事件

舞台区域(仅播放器模式生效)

window.scratchConfig.stageArea

参数名 描述
showControl 是否显示舞台区控制按钮
showLoading 是否显示Loading

更换默认项目

defaultProjectURL: "./static/project.sb3"

如果要加载默认小米则删除此配置

素材库CDN

window.scratchConfig.assetCDN

将官方素材库换成自己的地址加快国内用户访问速度。建议将素材文件上传至七牛、阿里云OSS等云存储上。

若使用官方素材库请删除本配置项。默认为/static下的素材库如不需要可删除/static/internalapi文件夹

附:Scratch素材库采集和处理工具

VM初始换完毕回调

window.scratchConfig.handleVmInitialized

参数名 描述
vm scratch virtual machine

示例

window.scratchConfig.handleVmInitialized = (vm)=>{
    //scratch vm初始换完毕后的代码
}

作品加载完毕的回调

window.scratchConfig.handleProjectLoaded

每当新建项目或载入项目完毕后调用此方法。

默认项目加载完毕的回调

window.scratchConfig.handleDefaultProjectLoaded

默认小猫项目加载完毕后调用此方法。

完整配置示例:

见编译后的index.html

项目相关API

加载项目

window.scratch.loadPorject(url, callback)

也可以使用vm对象的loadProject方法载入scratch项目

示例

window.scratch.loadPorject(url, ()=>{
    //加载文件完成后的操作
})

获取项目文件

window.scratch.getProjectFile(callback)

也可以使用vm对象的saveProjectSb3方法

示例

window.scratch.getProjectFile((file)=>{
    console.log(file)
    //上传file文件
})

获取项目截图

window.scratch.getProjectCover(callback)

示例

window.scratch.getProjectCover((file)=>{
    console.log(file)
    //上传截图文件
})

获取项目名称

window.scratch.getProjectName()

设置项目名称

window.scratch.setProjectName(projectName)

UI相关API

设置为播放模式

window.scratch.setPlayerOnly(isPlayerOnly)

参数

参数名 描述
isPlayerOnly 是否播放模式

示例

window.scratch.setPlayerOnly(true)

设置为全屏

window.scratch.setFullScreen(isFullScreen)

参数

参数名 描述
isFullScreen 是否全屏

示例

window.scratch.setFullScreen(true)

手机端虚拟按键

示例绑定某个dom为移动端的虚拟键盘先引入jQuery

function regKeyEvent(selector, key, keyCode) {
    console.log("注册按键事件:" + key)
    $(selector).on("touchstart", function(event) {
        vm.postIOData("keyboard", {
          keyCode: keyCode,
          key: key,
          isDown: true,
        });
        event.preventDefault();
      });
      $(selector).on("touchend", function() {
        vm.postIOData("keyboard", {
          keyCode: keyCode,
          key: key,
          isDown: false,
        });
        event.preventDefault();
      });
  }

  // 配置上下左右空格键
  regKeyEvent(".button_space", " ", 32)
  regKeyEvent(".button_down", "ArrowDown", 40)
  regKeyEvent(".button_up", "ArrowUp", 38)
  regKeyEvent(".button_left", "ArrowLeft", 37)
  regKeyEvent(".button_right", "ArrowRight", 39)