scratch-vm源码分析-开篇
VirtualMachine
constructor
runtime
setService('runtime')
editingTarget
_dragTarget
extensionManager
block listener
flyout block listener
monitor block listener
variable block listener
method
start: start runtime
greenFlag: runtime.greenFlag, start all threads
stopAll: runtime.stopAll, stop all threads
setTurboMode: runtime.turboMode, turbo mode,加速模式,循环不导致重绘
setCompatibilityMode: runtime兼容模式,兼容2.0,30TPS
clear: runtime.clear. 清除project data
getPlaygroundData: 获取editingTarget所在的thread里的data
postIOData: runtime.ioDevice['device_name'].postData,向runtime中的设备发送数据
loadProject: 直接调用fromJSON
loadProjectLocal: 从本地文件中加载3.0项目
downloadProjectId: 通过projectId,从storage中下载项目(storage封装了本地和网络加载,并缓存)
saveProjectSb3: 导出3.0项目,zip的blob流
toJSON: 导出project.json
fromJSON: 从json中,加载项目(可加载2.0项目),
* 判断2.0还是3.0的项目,3.0的项目包含meta字段,2.0的项目有自己的特定格式schema.json。
* 调用各自的deserializer,反序列化project.json
* 解析出所有的targets,调用installTargets安装
installTargets: 安装targets,targets可能来自与extension,如果是,则先加载所有的extensions,通过promise.all,等扩展安装之后,再安装所有targets
addCostume: 增加一个costume
duplicateCostume: 复制costume
renameCostume: 重命名costume
deleteCostume: 删除costume
getCostumeSvg: 获取costume svg格式
updateSvg:
duplicateSound: 复制sound
addSound:
renameSound
deleteSound
getSoundBuffer: 从audio engine获取一个sound buffer
addBackdrop:
addSprite2: 反序列化2.0的一个sprite,并加载到当前project
renameSprite
deleteSprite
duplicateSprite
attachAudioEngine: 关联audio engine,gui项目中(gui.jsx)调用
attachRenderer: 关联渲染器, gui项目中(stage.jsx)调用
attachStorage: 关联存储管理器, gui项目中(reducers/vm.js)调用
setLocale:多语言支持
setEditingTarget
shareBlocksToTarget: 当从一个sprite拖拽到另一个sprite时调用
refreshWorkspace: 强制刷新
getTargetIdForDrawableId: 通过renderer的drawableid,反向获取targetid
startDrag: 设置某target进入drag mode(this. _dragTarget=target), gui项目中(stage.jsx)调用
stopDrag: 设置某target离开drag mode(this. _dragTarget=null), gui项目中(stage.jsx)调用
postSpriteInfo: 向editing target or dragging target 发送sprite信息
event listener
blockListener:
flyoutBlockListener
monitorBlockListener
variableListener
emitTargetsUpdate:
emitWorkspaceUpdate