Matter.js:在画布上放置文本或图像

时间:2014-09-25 16:16:06

标签: javascript html5 canvas physics-engine

我想将字体或静态图像放在画布上,但不确定使用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);
    });
);

唯一的问题是文本不断被绘制在顶部,所以我的可拖动对象继续在文本后面。我只是希望文本保留在后台,就像静态图像一样,但我认为在画布上绘制字体可能比让用户下载另一个图像更好。有什么帮助吗?

3 个答案:

答案 0 :(得分:4)

Matter.js中包含的渲染器实际上仅用于演示,因此最好的做法是复制示例Render.js,然后在那里实现所有渲染(Render.world是每个tick上调用的入口方法。

将对象名称更改为CustomRenderer之类的其他名称,然后在Engine.create选项中传递渲染类:

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

答案 1 :(得分:2)

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

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

https://github.com/liabru/matter-js/blob/master/examples/sprites.js

(不知道问题的文本部分)

答案 2 :(得分:2)

这是将函数中的文本字符串作为基础图像返回的方式

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
  }
}