zoukankan      html  css  js  c++  java
  • scratch-ui使用自己资源文件

    scratch-ui从官方git下载启动之后,角色和舞台背景图片资源都无法加载,因为scratch的资源使用的是cdn服务器,而且cdn服务器h国内被墙了,要想办法解决这些资源的问题

    资源的路径形如:static/assets/de6a2ca491eb20b2b669e732e84ce7af.png

    具体的全路径如:https://cdn.assets.scratch.mit.edu/internalapi/asset/0015433a406a53f00b792424b823268c.png/get

    从思路上来说,使用一个爬虫把这些图片爬下来就可以了

    1.获取scratch所有的资源路径名称

    2.爬虫所有的资源文件

    3.修改scratch资源路径到自己的资源路径

    一.获取scratch所有的资源路径名称

    1在scratch-guisrcliblibraries目录下有四个*.json文件里面记录了资源的配置信息

    1.sprites.json

    2,sounds.json

    3.costumes.json

    4.backdrops.json

    二.爬虫所有的资源文件

    参考这里,有一个朋友写了一个python脚本来爬虫所有的资源(需要FQ)

    三.修改scratch资源路径到自己的资源路径

    1.资源url分析

    对于选择舞台背景时候弹出的多个预览背景图片,每个图片的地址格式是:https://cdn.assets.scratch.mit.edu/internalapi/asset/d3344650f594bcecdf46aa4a9441badd.svg/get/

    选定了背景后再把背景图片再加载到舞台上的时,使用图片的地址格式是:https://assets.scratch.mit.edu/internalapi/asset/d3344650f594bcecdf46aa4a9441badd.svg/get/

    前者url比后者url多了一个cdn

    上面是背景的研究,对于角色造型和声音的资源也是一样的,所以说对于静态资源

    预览的缩略图地址格式是:https://cdn.assets.scratch.mit.edu/internalapi/asset/{MD5}.svg/get/

    选中以后实际资源地址是:https://assets.scratch.mit.edu/internalapi/asset/{MD5}.svg/get/

    结论:

    缩略图地址和选中后的资源地址不一样,两个cdn服务器,内容都是一样的,为什么?

     2.找到scratch-ui中加载资源的代码

    在vscode中整个项目搜索关键字"assets.scratch.mit.edu",可以搜到两个.jsx文件,srccontainerslibrary-item.jsx和srclibproject-fetcher-hoc.jsx

    srccontainerslibrary-item.jsx代码在line:109

        render () {
            const iconMd5 = this.curIconMd5();
            const iconURL = iconMd5 ?
                `https://cdn.assets.scratch.mit.edu/internalapi/asset/${iconMd5}/get/` :
                this.props.iconRawURL;
            return (
                <LibraryItemComponent
                    bluetoothRequired={this.props.bluetoothRequired}
                    ...
          }

    srclibproject-fetcher-hoc.jsx代码在line:133

        ProjectFetcherComponent.defaultProps = {
            assetHost: 'https://assets.scratch.mit.edu',
            projectHost: 'https://projects.scratch.mit.edu'
        };

    3. 写一个服务提供资源服务

    const express = require("express");
    const path = require("path");
    const fs = require("fs");
    
    const app = express();
    
    app.get("*", function (req, res, next) {
      //设置跨域访问
      res.header("Access-Control-Allow-Origin", "*");
      res.header("Access-Control-Allow-Headers", "X-Requested-With");
      res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
      res.header("X-Powered-By", " 3.2.1");
      res.header("Content-Type", "application/json;charset=utf-8");
    
      next();
    });
    
    app.get("/internalapi/asset/*/get/", function (req, res) {
      let url = req.url.replace("/get/", "");
      file = path.join(process.cwd(), url);
      if (fs.existsSync(file)) {
        res.sendFile(file);
      } else {
        res.end("no file " + url);
      }
    });
    
    const port = 8603;
    app.listen(port, function () {
      console.log("sever listen to : " + port);
    });

    也修改scratch-ui中两个地方对应的的资源路径

    首先,srccontainerslibrary-item.jsx中

        render () {
            const iconMd5 = this.curIconMd5();
            const iconURL = iconMd5 ?
                // `https://cdn.assets.scratch.mit.edu/internalapi/asset/${iconMd5}/get/` :
                `http://localhost:8603/internalapi/asset/${iconMd5}/get/` :
                this.props.iconRawURL;
            return (
                <LibraryItemComponent
            ...

    其次,srclibproject-fetcher-hoc.jsx中

        ProjectFetcherComponent.defaultProps = {
            // assetHost: 'https://assets.scratch.mit.edu',
            assetHost: 'http://localhost:8603',
            projectHost: 'https://projects.scratch.mit.edu'
        };

    图片和声音加载可以了,但是有一个问题,在精灵选择时显示的缩略图界面,精灵的图片显示不正常,但是选择了精灵以后舞台下面的精灵图片显示正常

    作者    :秋时

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

  • 相关阅读:
    mysq 日期相减
    说说时间观与时间管理——北漂18年(71)
    ionic之切换开关
    ionic之单选框
    SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE locks在RR模式下可以看到最新的记录
    14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
    14.5.2.2 autocommit, Commit, and Rollback
    14.5.2 事务隔离级别
    对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间
    mysql explain 解释
  • 原文地址:https://www.cnblogs.com/Netsharp/p/14450983.html
Copyright © 2011-2022 走看看