美文网首页
Scratch获取当前项目的Block信息

Scratch获取当前项目的Block信息

作者: 霡霂976447044 | 来源:发表于2020-10-12 16:12 被阅读0次

入口
src/playground/index.jsx

export default appTarget => {
    GUI.setAppElement(appTarget);

    // note that redux's 'compose' function is just being used as a general utility to make
    // the hierarchy of HOC constructor calls clearer here; it has nothing to do with redux's
    // ability to compose reducers.
    const WrappedGui = compose(
        AppStateHOC,
        HashParserHOC
    )(GUI);
..........

AppStateHOC里面会初始化一个VM,guiInitialState

 const guiRedux = require('../reducers/gui');
                const guiReducer = guiRedux.default;
                const {
                    guiInitialState,
                    guiMiddleware,
                    initFullScreen,
                    initPlayer,
                    initTelemetryModal
                } = guiRedux;

同时,GUI里面也会将vm设置为Redux的vm


const mapStateToProps = state => {
    const loadingState = state.scratchGui.projectState.loadingState;
    return {
        ......
        vm: state.scratchGui.vm
    };
};

Scratch-VM主要作用:

  • 侦听scratch-blocks发出的事件来构造和维护抽象语法树的状态。
  • 加载解析项目:解析sb2和sb3项目文件,生成积木和角色等
  • 导出项目:将当前项目资源打包压缩成 .sb3 文件或者生成json格式
  • 运行项目并将结果渲染至舞台
  • 扩展管理

能够导出Json格式的当前项目状态
vm.toJson() 返回对应的json配置,可以检查用户拖拽了哪些块到工作区域

{
  "targets": [
    {
      "isStage": true,
      "name": "Stage",
      "variables": { "`jEk@4|i[#Fk?(8x)AV.-my variable": ["我的变量", 0] },
      "lists": {},
      "broadcasts": {},
      "blocks": {},
      "comments": {},
      "currentCostume": 0,
      "costumes": [
        {
          "assetId": "cd21514d0531fdffb22204e0ec5ed84a",
          "name": "背景1",
          "md5ext": "cd21514d0531fdffb22204e0ec5ed84a.svg",
          "dataFormat": "svg",
          "rotationCenterX": 240,
          "rotationCenterY": 180
        }
      ],
      "sounds": [
        {
          "assetId": "83a9787d4cb6f3b7632b4ddfebf74367",
          "name": "啵",
          "dataFormat": "wav",
          "format": "",
          "rate": 44100,
          "sampleCount": 1032,
          "md5ext": "83a9787d4cb6f3b7632b4ddfebf74367.wav"
        }
      ],
      "volume": 100,
      "layerOrder": 0,
      "tempo": 60,
      "videoTransparency": 50,
      "videoState": "on",
      "textToSpeechLanguage": null
    },
    {
      "isStage": false,
      "name": "角色1",
      "variables": {},
      "lists": {},
      "broadcasts": {},
      "blocks": {
        "+fkz-|QFBT|$2[/WV9_c": {
          "opcode": "event_whenflagclicked",
          "next": "hE!6vvV:(Ez6#_d}QRZ:",
          "parent": null,
          "inputs": {},
          "fields": {},
          "shadow": false,
          "topLevel": true,
          "x": 65,
          "y": 188
        },
        "hE!6vvV:(Ez6#_d}QRZ:": {
          "opcode": "motion_turnleft",
          "next": null,
          "parent": "+fkz-|QFBT|$2[/WV9_c",
          "inputs": { "DEGREES": [1, [4, "15"]] },
          "fields": {},
          "shadow": false,
          "topLevel": false
        }
      },
      "comments": {},
      "currentCostume": 0,
      "costumes": [
        {
          "assetId": "b7853f557e4426412e64bb3da6531a99",
          "name": "造型1",
          "bitmapResolution": 1,
          "md5ext": "b7853f557e4426412e64bb3da6531a99.svg",
          "dataFormat": "svg",
          "rotationCenterX": 48,
          "rotationCenterY": 50
        },
        {
          "assetId": "e6ddc55a6ddd9cc9d84fe0b4c21e016f",
          "name": "造型2",
          "bitmapResolution": 1,
          "md5ext": "e6ddc55a6ddd9cc9d84fe0b4c21e016f.svg",
          "dataFormat": "svg",
          "rotationCenterX": 46,
          "rotationCenterY": 53
        }
      ],
      "sounds": [
        {
          "assetId": "83c36d806dc92327b9e7049a565c6bff",
          "name": "喵",
          "dataFormat": "wav",
          "format": "",
          "rate": 44100,
          "sampleCount": 37376,
          "md5ext": "83c36d806dc92327b9e7049a565c6bff.wav"
        }
      ],
      "volume": 100,
      "layerOrder": 1,
      "visible": true,
      "x": 0,
      "y": 0,
      "size": 100,
      "direction": 47.606532528840425,
      "draggable": false,
      "rotationStyle": "all around"
    }
  ],
  "monitors": [],
  "extensions": [],
  "meta": {
    "semver": "3.0.0",
    "vm": "0.2.0-prerelease.20200227204654",
    "agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
  }
}

如何得到VM对象
默认的vm实力通过export的方式(单例)导出,在源码src/reducers/vm.js里,
其实在src/containers/gui.jsxGUIcomponentDidMount就可以得到vm,
this.props.vm,因为AppStateHOC会加载传给GUI

相关文章

  • Scratch获取当前项目的Block信息

    入口src/playground/index.jsx AppStateHOC里面会初始化一个VM,guiIniti...

  • 获取当前信息

    目录:1、获取当前设备类型2、获取当前语言环境3、获取当前APP版本号 1、获取当前设备类型 2、获取当前语言环境...

  • ObjectARX

    获取当前文档 获取当前数据库 符号表 Block Table 块表 Layer Table 层表 Te...

  • MobIM-API说明

    一、MobIM类API说明 1. 获取当前用户信息 /**获取当前用户信息@return 当前用户*/+ (MIM...

  • 获取当前文件路径

    1、获取当前脚本路径信息 2、根据当前脚本路径,获取其他路径信息

  • 获取当前用户信息

    public class RequestContextFilter implements Filter { pri...

  • iOS 获取设备信息

    获取iOS设备信息 获取 当前设备 可用内存 及当前 应用 所占内存 获取物理内存 获取硬盘内存 获取本地 获取网...

  • iOS 获取系统信息

    iOS获取系统信息 当前应用软件版本 比如:1.0.1 当前应用版本号码 (编译版本号) 获取应用信息 当前应用名...

  • adb工具详细介绍

    获取 App 的信息 App 信息 获取当前界面元素:adb shell dumpsys activity top...

  • 第二章 App结构解析

    获取APP的信息 1、 App信息 获取当前界面元素:adb shell dumpsys activity top...

网友评论

      本文标题:Scratch获取当前项目的Block信息

      本文链接:https://www.haomeiwen.com/subject/ruxppktx.html