我正在使用Matter.js编写一个简单的游戏。我很难弄清楚如何最好地将我的模型连接到Matter.js中。
我的游戏的特点是细菌,我想有一个类Bacterium,以便我可以管理这些家伙。在我当前的实现中,这个类创建并存储自己的Matter.Body,并将其传递给引擎。这就是我遇到麻烦的地方。我想更新我的模型的某些方面,当细菌相互碰撞,与墙壁,但我无法找到一个有效的方法,在我的模型中的细菌碰撞在我的物质碰撞处理程序。
我应该扩展Matter.Body的原型吗?有什么建议吗?还是我应该考虑的更大的网络项目?
发布于 2015-12-29 22:24:32
查看一下Render.collisions类中的Render.js函数。此函数呈现正在呈现的框架中发生的所有冲突。我认为,通过理解它们是如何呈现出来的,你可以在你所处的环境中找到你需要的东西。
记住,matterjs使用的是一个游戏循环,这与网页通常使用的基于事件的设置非常不同。查看一下Render.js类,以更好地理解如何使用matterjs提供的引擎。
发布于 2022-07-03 19:51:41
不要扩展你不拥有的原型。在类中将MJS主体作为字段添加是一种很好的方法,您可以通过使用Map将每个MJS主体与其相应的类实例关联起来来跟踪哪些主体正在碰撞。
下面是一个将链接到collisionStart和collisionEnd MJS事件中的例子,以调用在MJS主体上组成的自定义类上的方法。
class Box {
constructor(x, y, w, h, bodyOpts) {
// composition, not inheritance
this.body = Matter.Bodies.rectangle(
x, y, w, h, {
...bodyOpts,
render: {fillStyle: "blue"}
},
);
// ... other properties relevant to your app ...
}
highlight() {
this.body.render.fillStyle = "red";
}
unhighlight() {
this.body.render.fillStyle = "blue";
}
}
const engine = Matter.Engine.create();
engine.gravity.y = 0; // enable top-down
const map = {width: 300, height: 300};
const render = Matter.Render.create({
element: document.body,
engine,
options: {...map, wireframes: false},
});
const rnd = n => ~~(Math.random() * n);
const boxes = [...Array(40)].map(() => new Box(
rnd(map.width), // x
rnd(map.height), // y
rnd(10) + 15, // w
rnd(10) + 15, // h
{angle: rnd(Math.PI * 2)}
));
const walls = new Set([
Matter.Bodies.rectangle(
0, map.height / 2, 20, map.height, {isStatic: true}
),
Matter.Bodies.rectangle(
map.width / 2, 0, map.width, 20, {isStatic: true}
),
Matter.Bodies.rectangle(
map.width, map.height / 2, 20, map.height, {isStatic: true}
),
Matter.Bodies.rectangle(
map.width / 2, map.height, map.width, 20, {isStatic: true}
),
]);
const mouseConstraint = Matter.MouseConstraint.create(
engine, {element: document.body}
);
Matter.Composite.add(engine.world, [
...boxes.map(e => e.body), ...walls, mouseConstraint
]);
const bodiesToBoxes = new Map(boxes.map(e => [e.body, e]));
Matter.Events.on(engine, "collisionStart", event => {
for (const {bodyA, bodyB} of event.pairs) {
if (bodiesToBoxes.has(bodyA)) {
bodiesToBoxes.get(bodyA).highlight();
}
if (bodiesToBoxes.has(bodyB)) {
bodiesToBoxes.get(bodyB).highlight();
}
}
});
Matter.Events.on(engine, "collisionEnd", event => {
for (const {bodyA, bodyB} of event.pairs) {
if (bodiesToBoxes.has(bodyA)) {
bodiesToBoxes.get(bodyA).unhighlight();
}
if (bodiesToBoxes.has(bodyB)) {
bodiesToBoxes.get(bodyB).unhighlight();
}
}
});
Matter.Render.run(render);
Matter.Runner.run(Matter.Runner.create(), engine);<script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.18.0/matter.min.js"></script>
Body.label属性可以帮助区分主体类型,但最终MJS没有提供任何类型的实体管理解决方案。我提醒大家不要过度依赖.label。最终,这取决于你选择一个适合你的应用程序需求的设计。
https://stackoverflow.com/questions/33575883
复制相似问题