You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Matter.js结合JSON读取SVG路径创建多边形遇TypeError求助

问题分析与解决方案

你遇到的Cannot read properties of undefined (reading 'numberOfItems')错误,本质是Matter.Svg.pathToVertices接收到了无效的输入值,导致内部解析SVG路径时出错。以下是具体排查方向和修复方案:

1. 确认JSON解析后的路径值有效

首先要排查path变量是否真的拿到了正确的SVG路径字符串:

  • 在brickletStart函数里添加日志,验证路径内容和类型:
    function brickletStart(text){
      var jason = JSON.parse(text);
      var path = jason.svg.path; 
      console.log("SVG路径值:", path);
      console.log("路径类型:", typeof path);
      createPolygon(path);
    }
    
    如果输出的path是undefined,说明你的JSON结构和代码里的jason.svg.path不匹配。检查JSON文件的结构,必须是类似这样的格式:
    {
      "svg": {
        "path": "M 0 0 L 100 0 L 100 100 L 0 100 Z"
      }
    }
    
    若JSON里的路径直接在根节点(比如{"path": "..."}),则代码要改成var path = jason.path;。

2. 验证SVG路径语法合规

Matter.js的pathToVertices只支持标准的SVG路径指令(如M/L/Z/C等基础指令),且路径字符串必须是纯d属性值,不能包含SVG标签或其他无关内容:

  • 先测试最简单的闭合路径,比如"M0 0 L100 0 L100 100 L0 100 Z",确认是否能正常生成多边形;
  • 若你的路径包含复杂指令(如A/Q),可以先简化路径,排查是否是指令兼容性问题。

3. 排查JSON转义问题

如果SVG路径里包含特殊字符(比如引号、反斜杠),必须在JSON文件中正确转义。例如路径里的双引号要写成\",反斜杠写成\\。不过一般SVG路径不会涉及这类情况,但若你的路径有特殊格式,需要检查转义是否正确。

额外代码优化提示

你代码里的render选项存在属性错误:restitution(弹性)和velocity(速度)是物理体的属性,不属于render配置,应移到外层:

function createPolygon(value){
  var polygon = Matter.Bodies.fromVertices(
    400, 20, 
    Matter.Svg.pathToVertices(value, 10),
    {
      restitution: 2, // 移到render外
      velocity: { x: 0.5, y: 0 }, // velocity需是{x,y}对象,不是单个数字
      render: {
        fillStyle: color,
        strokeStyle: color,
        wireframes: false
      }
    }, 
    true
  ); 
  Matter.Composite.add(world, polygon);
}

内容的提问来源于stack exchange,提问作者Lula

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:15:27