我想将字体或静态图像放在画布上,但不确定使用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);
});
);
唯一的问题是文本不断被绘制在顶部,所以我的可拖动对象继续在文本后面。我只是希望文本保留在后台,就像静态图像一样,但我认为在画布上绘制字体可能比让用户下载另一个图像更好。有什么帮助吗?
答案 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
}
}