代码之家  ›  专栏  ›  技术社区  ›  Sergio Escalona

matter.js的JavaScript svg规模问题

  •  0
  • Sergio Escalona  · 技术社区  · 2 年前

    我正在使用matter.js开发一个Javascript动画。以下是链接:

    https://codepen.io/Sergio-Escalona/pen/VwNrwbw

    document.addEventListener("DOMContentLoaded", function () {
        // Basic setup
        let Engine = Matter.Engine,
            World = Matter.World,
            Bodies = Matter.Bodies,
            Body = Matter.Body;
    
        let engine = Engine.create();
        engine.world.gravity.y = 0; // No gravity for a space-like effect
    
        let render = Matter.Render.create({
            element: document.body,
            engine: engine,
            options: {
                width: window.innerWidth,
                height: window.innerHeight,
                background: 'transparent',
                wireframes: false // for sprite rendering
            }
        });
    
        // Create static walls
        let thickness = 50; // Ensures ducks don't escape through fast movements
        let wallOptions = { isStatic: true, restitution: 1.0 }; // Perfectly elastic collisions
        let ground = Bodies.rectangle(window.innerWidth / 2, window.innerHeight + thickness / 2, window.innerWidth, thickness, wallOptions);
        let leftWall = Bodies.rectangle(-thickness / 2, window.innerHeight / 2, thickness, window.innerHeight, wallOptions);
        let rightWall = Bodies.rectangle(window.innerWidth + thickness / 2, window.innerHeight / 2, thickness, window.innerHeight, wallOptions);
        let topWall = Bodies.rectangle(window.innerWidth / 2, -thickness / 2, window.innerWidth, thickness, wallOptions);
    
        World.add(engine.world, [ground, leftWall, rightWall, topWall]);
    
        // Function to add a new duck with random selection for black duck
        function addDuck() {
            let safeMargin = 100; // A margin to avoid spawning too close to the edge
            let radius = 25;
            // Randomly choose the texture for the duck
            let textureUrl = Math.random() < 0.9 ? 
                'https://assets.codepen.io/12210161/duckling-svgrepo-com.svg' : 
                'https://assets.codepen.io/12210161/duckling-svgrepo-com-bk.svg';
            let duck = Bodies.circle(Math.random() * (window.innerWidth - 2 * safeMargin) + safeMargin, Math.random() * (window.innerHeight - 2 * safeMargin) + safeMargin, radius, {
                restitution: 0.9,
                friction: 0.0,
                frictionAir: 0.0,
                density: 0.001,
                render: {
                    sprite: {
                        texture: textureUrl,
                        xScale: 0.1,
                        yScale: 0.1
                    }
                }
            });
    
            // Apply an initial force to ensure movement
            Body.applyForce(duck, {x: duck.position.x, y: duck.position.y}, {x: (Math.random() - 0.5) * 0.05, y: (Math.random() - 0.5) * 0.05});
            World.add(engine.world, duck);
        }
    
        document.getElementById("oneMoreBtn").addEventListener("click", addDuck);
    
        // Start the engine and renderer
        Engine.run(engine);
        Matter.Render.run(render);
    
        // Initially add a duck to start with
        addDuck();
    });
    

    我不知道为什么黑鸭子比普通的小。svg文件的维度(px)完全相同,我找不到问题出在哪里。

    有人能帮我解决吗?

    提前感谢!!!

    我已经检查了svg文件,两者的大小完全相同。关于Javascript代码,我找不到任何超出渲染比例的东西,但我认为这应该不是问题所在。

    1 回复  |  直到 2 年前
        1
  •  0
  •   FiddlingAway    2 年前

    如果在浏览器选项卡中打开SVG文件,您会注意到它们不一样。我说的不是尺寸或颜色,而是 协调 -与黄色/橙色鸭子不同,黑色鸭子居中,这导致了黑色鸭子显示的问题。

    您需要执行以下操作:

    1. 在您选择的文本编辑器中打开两个SVG文件
    2. 复制您的样式 duckling-svgrepo-com-bk.svg 到一个单独的文件中
    3. 替换您的全部内容 小鸭子svgrepo-com-bk.svg 的内容 duckling-svgrepo-com.svg ,因此现在黑色的鸭子与黄色/橙色的鸭子完全相同
    4. 删除的内联样式 path circle 的元素 小鸭子svgrepo-com-bk.svg ,而是应用 st 在步骤2中复制到空文件中的类
    5. 复制回步骤3中的样式,并保存 小鸭子svgrepo-com-bk.svg 文件

    这样做的结果是,黑鸭子svg现在与黄/橙鸭子完全相同(没有颜色),您的代码现在就可以工作了。

    这应该是您的黑鸭子SVG的最终结果:

    <?xml version="1.0" encoding="windows-1252"?>
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
    <svg height="800px" width="800px" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 49 49" xml:space="preserve">
    <style type="text/css">
        .st0{fill:#D77328;}
        .st1{fill:#FFFFFF;}
        .st2{fill:#2C2F38;}
        .st3{stroke:#FFFFFF;stroke-miterlimit:10;}
    </style>
    <g>
    <path d="M37.19,26.375c-0.999-1.983-2.486-3.818-4.687-5.119c-0.231-0.136-0.295-0.436-0.123-0.641   c1.116-1.332,4.669-5.868,4.669-9.615c0-6.075-4.925-11-11-11s-11,4.925-11,11c0,6,5.008,9.048,5.873,9.88   c0.086,0.082,0.13,0.186,0.128,0.305c-0.012,1.015-0.342,5.794-5.532,3.985c-1.398-0.487-2.64-1.341-3.686-2.387L5.888,16.84   c-0.469-0.469-1.239-0.409-1.634,0.125C2.92,18.768,0.431,23.017,1.048,29c0,0,0.366,16.187,11.604,19.514   C13.861,48.872,15.126,49,16.386,49h6.858c2.854,0,5.645-0.829,8.027-2.402c0.083-0.055,0.166-0.11,0.25-0.166   C38.085,42.017,40.75,33.439,37.19,26.375z"/>
    <path class="st0" d="M47.538,10h-8.206h-2.335c0.03,0.33,0.05,0.662,0.05,1c0,2.351-1.398,5.011-2.716,6.997V18h5.871   c0.926,0,1.854-0.218,2.632-0.721c2.568-1.658,4.434-5.064,5.161-6.554C48.161,10.389,47.912,10,47.538,10z"/>
    <circle class="st1" cx="28.048" cy="9" r="4"/>
    <circle class="st2" cx="30.048" cy="10" r="2"/>
    <path class="st3" d="M20.515,29.887c6.723-3.413,7.533,4.125,7.533,4.125c0,8.75-7,8-7,8   c-5.947,0-8.933-6.269-9.758-8.343c-0.138-0.346,0.071-0.727,0.434-0.808l0.377-0.084C15.006,32.132,17.863,31.233,20.515,29.887z"/>
    </g>
    </svg>
    

    当然,您也可以调整您的Javascript代码,以涵盖SVG文件不居中的情况,但这是更容易采取的方法。