我想在Matter.js中将定制的HTML元素呈现为Body。我在Reaction中使用它,这增加了一些复杂性,但它与我的问题无关。
我搜索了很多,我找到的唯一示例是this one here,它似乎使用querySelector
来选择位于HTML代码中的元素,然后以某种方式在矩形形状中使用它们。
似乎正在做这项工作的部分如下:
var bodiesDom = document.querySelectorAll('.block');
var bodies = [];
for (var i = 0, l = bodiesDom.length; i < l; i++) {
var body = Bodies.rectangle(
VIEW.centerX,
20,
VIEW.width*bodiesDom[i].offsetWidth/window.innerWidth,
VIEW.height*bodiesDom[i].offsetHeight/window.innerHeight
);
bodiesDom[i].id = body.id;
bodies.push(body);
}
World.add(engine.world, bodies);
(VIEW
变量可以只是随机数,因为它们定义了形状)
然而,我不明白如何像上面的例子那样在Body矩形内传递一个HTML元素。
理想情况下,我希望有复杂的HTML元素与物理世界交互(就像一个带有按钮的小框,等等)。
对如何实现这一点有什么想法吗?或者,您能解释一下在该示例中使用的方法似乎成功了吗?
1条答案
按热度按时间8cdiaqws1#
然而,我不明白如何像上面的例子那样在Body矩形内传递一个HTML元素。
这并不完全是本例所做的。当无头运行时,Matter.js处理物理,而不知道它是如何呈现的。对于每个动画帧,您可以使用MJS身体的当前位置并重新定位您的元素(或在画布上绘制等)以反映MJS的世界观。
向MJS提供根元素似乎确实打破了单向数据流,但这只是为了通知MJS有关鼠标位置和点击之类的事件--不要与呈现混淆。
这里有一个最小的例子,希望能更清楚地说明这一点:
React
Reaction改变了工作流,但基本概念是相同的--MJS主体数据单向地从MJS后端流向呈现前端,因此从MJS的Angular 来看,一切都与上面的普通示例完全相同。大部分工作是正确设置refs和
useEffect
,以便与requestAnimationFrame
一起使用。请注意,这些只是概念验证。在它们能够支持更复杂的用例之前,可能需要更多的工作来建立抽象。