javascript js:在对象后面的画布上放置文本或图像

wh6knrhe  于 2023-05-27  发布在  Java
关注(0)|答案(4)|浏览(110)

我想将字体或静态图像放置到画布上,但不确定使用Matter.js的最佳方法是什么。现在,对于图像,我只是创建一个大小为'0'的主体,并将图像URL放在render.sprite.texture属性中。看起来很管用,但是有没有一种不同的/更好的方法可以把静态图像放在画布上?
此外,我在创建/绘制任何其他内容之前,使用脚本顶部附近的'afterRender'事件将文本放置到画布上:

_sceneEvents.push(
    Events.on(_engine, 'afterRender', function(event) {
        var context = _engine.render.context;
        context.font = "45px 'Cabin Sketch'";
        context.fillText("THROW OBJECT HERE", 150, 80);
    });
);

唯一的问题是文本一直画在上面,所以我的可拖动对象一直在文本后面。我只是想让文本留在背景中,就像静态图像一样,但我认为将字体绘制到画布上可能比让用户下载另一个图像更好。有什么帮助吗?

v6ylcynt

v6ylcynt1#

Matter.js中包含的渲染器实际上只用于演示,所以最好的做法是复制示例Render.js,然后在那里实现所有渲染(其中Render.world是每次tick调用的入口方法)。
将对象名称更改为其他名称,如CustomRenderer,然后在Engine.create选项中传递渲染类:

var engine = Engine.create({
    render: {
        element: element,
        controller: CustomRenderer
    }
});
unhi4e5o

unhi4e5o2#

有点晚了,但文档显示您有正确的方法将精灵添加到渲染器:

let head = Bodies.circle(450, 50, 17, {
                render: {
                    sprite: {
                        texture: './img/head.png'
                    }
                }}
            );

https://github.com/liabru/matter-js/blob/master/examples/sprites.js
(No关于问题的文本部分的想法,然而)

pzfprimi

pzfprimi3#

这就是你如何在函数中返回文本字符串作为基本图像

createImage($string) {

    let drawing = document.createElement("canvas");

    drawing.width = '150'
    drawing.height = '150'

    let ctx = drawing.getContext("2d");

    ctx.fillStyle = "blue";
    //ctx.fillRect(0, 0, 150, 150);
    ctx.beginPath();
    ctx.arc(75, 75, 20, 0, Math.PI * 2, true);
    ctx.closePath();
    ctx.fill();
    ctx.fillStyle = "#fff";
    ctx.font = "20pt sans-serif";
    ctx.textAlign = "center";
    ctx.fillText($string, 75, 85);
    // ctx.strokeText("Canvas Rocks!", 5, 130);

    return drawing.toDataURL("image/png");
},

// and then e.g. in your sprites

// ...

render: {
  sprite: {
      texture: createImage("Your Text String")
      xScale: 1,
      yScale: 1
  }
}
zbwhf8kr

zbwhf8kr4#

Matter.js的默认渲染器实际上并不打算以这种方式使用。大多数情况下,您希望使用自定义渲染器(如liabu talked about)或将Matter连接到您的DOM元素(如this post covers)。

相关问题