从0开始搭建一个scratch项目

这是一个从0搭建一个scratch项目的demo , 共有14个分支,每个分支对应了一个小的功能 ,完成了一些srcatch的基本功能,希望对大家能有所帮助

本项目github地址
相关连接 : scratch3.0 虚拟机源码分析

项目安装运行

npm install
npm start

版本迭代:

  1. v0.11:虚拟机vm可用

    • 首先什么是虚拟机:用来屏蔽底层硬件差异和dom渲染差异,使得程序可以跨端移植,react本质上也是虚拟机,虚拟dom屏蔽设备渲染差异( dom只有pc浏览器能识别 , 但虚拟dom是js对象,因而在手机上也能解析成viewPort,而native屏蔽底层硬件差异 ,使得程序可以在Android和ios都可以运行), scratch-vm作用:使用虚拟io屏蔽底层差异,使用render屏蔽ui差异,使scratch软件也可以跨端
  2. v0.12:将vm置入redux中,所有组件均可使用mapStateToProps调用vm

    • scratch-gui的一个弊端就是react组件层层嵌套,使得调试极其困难,我的思路是把所有状态置入redux中,这样在gui中调用纯组件(比如<Stage/>),这样不用传入任何props,可以使组件完全解耦,提升可维护性
  3. v0.13:blocks显示正常

    • blocks分为四种:block(普通的,只能被动接受事件),flyoutBlocks(block带弹框可以广播事件的,如广播某某事件),monitorBlocks(上面是半圆形,可以控制脚本,如点击block块),variable(用户自定义的,也可能会发送事件),因这些block都可以发送跨越角色(sprite)的事件,所以在vm中他们都会有一个全局事件队列sequencer
  4. v0.14:能够加载sb3工程文件

    • 在const vm = new VM()之后,必须再为vm添加storage,为Scratch-render添加远程服务器地址,使vm能够获取mit服务器上的资源文件,否则会在加载工程文件后,vm中editingtarget属性无法更新的问题
    • 注意当前版本bug:
      • vm中installTarget属性未更新(v0.19已解决)
      • sb3文件无法解析,使用fs.readFile后vm.loadProject无效(v0.19已解决)
  5. v0.15:能够加载舞台

    • 舞台是个canvas,上面的角色却可以用鼠标拖动,神奇,因为在stage监听了鼠标的点击,通过鼠标点的位置在vm中返回角色的实例,然后在拖动时,在最顶层再生成一个canvas,覆盖stage,然后生成动画,当放开时,把顶层canvas最后的状态返回到stage上,这就实现了拖动.我认为这个实现过于复杂,h5中有新的api ondrag类函数,既然能返回vm中角色的实例,那么通过单个canvas也应该可以实现类似功能
    • 注意当前版本bug:
      • 鼠标事件vm报错:scratch-render warn Could not find skin for drawable,
        这是因为加载的skin文件有问题(v0.19已解决)
  6. v0.16:加载sprite信息成功

    • 注意当前版本bug: 在stage中无法显示sprite信息(v0.19已解决)
  7. v0.17:获取sprite资源成功

    • 注意当前版本bug:
      • 资源不能推送到vm中,scratch-render工作不正常(v0.19已解决)
  8. v0.18:添加了sb2兼容模式

    • 注意当前版本bug:
      • vm初始化出现一些问题(v0.19已解决)
  9. v0.19:可正常加载project,新建sprite功能可用,并可以在stage中渲染skin,scratch-render工作正常

  10. v0.20:虚拟keyBoard可用,为vm映射了space和down按键,stage能够响应blocks的键盘按键事件

    • 虚拟IO的作用:用于屏蔽底层差异,来实现跨端(比如鼠标的点击事件,触摸屏的touch事件,都会在vm中统一映射成一个scratch能识别的key),scratch中自定义了一套key,每个key对应一个sprite动作,虚拟键盘IO建立起了Ascll码与scratch-key之间的联系, 这里space建的ascll码是32,down键的ascll码是40
  11. v0.21:选择角色功能可用,解决了导出vm.runtime.targets的问题

    • 当点击角色选择界面时,角色会有变化,是因为我们的点击事件改变了vm.editingTarget对象,我们可以在vm.runtime.targets列表中获取所有加载的角色和舞台
    • 注意我们天天用的console.log是个异步函数,比如
    let obj={}; 
    console.log(obj)  // 输出{a:'abc'}
    obj.a='abc'
    

    这在虚拟机中调试会造成巨大的问题,因为虚拟机的渲染也是异步的,但是速度会比console块,所以经常会出现上述情况
    解决方案:1,使用emit发送消息,通过实时监听的方式能够避免这个问题 2,console.log(JSON.stringify(obj)) 3,用debugger调试

  12. v0.22:选择角色功能可用

    • 注意当前版本bug:
      • 但角色图片缓存无法缓存,且新建同名角色会报错(v0.23已解决)
  13. v0.23: 解决了sprite图片缓存以及重名精灵图片缓存的问题

    • 在sprite-library中选择了sprite之后会触发vm.addSprite函数,我开始以为,执行完add后的onActivateBlocksTab异步函数是缓存customs的,追踪一上午发现这个函数最后改变了redux/edit-tab的值只是改变了标签.所以追踪这个函数根本没有用
    • 解决方案: scratch的这个功能实现过于复杂我没看懂,我的思路是当点击添加时索引资源的md5去服务器上下载,反正在新建时也下载过一遍,浏览器里是有缓存的,最使用redux缓存每次随机生成的target名字和Md5(因为有重名sprite,比如两个苹果vm会当做两个独立的精灵,所以target名字末尾是数字递增的,因此使用名字对sprite进行索引需要使用startsWith函数进行判断,而md5与custom重名,可以作为custom的资源索引),进而就可以在服务器上进行查询了.
  14. v0.24:七月三十一号,我被公司开除了,理由是我水平不行,跟不上项目进度,完成不了kpi,在震惊了一分钟之后,我意识到以后终于不用再写这些恶心代码了,哈哈,而我震惊不是因为我被开了,而是因为我拿着7.2k税前,6.8k税后的试用期工资,主管居然会觉得我水平不行?! scratch的二次开发我觉得本质上是一个AST的问题,想要做好必须要招懂算法和编译原理的前端工程师,精通react反而不是最重要的,在深圳满足这种条件的前端,我不相信他18k以下能招的到。反正我也搞不定这玩意,以后也不会再写了,不过这个行业未来不可限量,也祝大家改的开心~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342