首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我自己的matter.js模型

我自己的matter.js模型
EN

Stack Overflow用户
提问于 2015-11-06 21:18:47
回答 2查看 319关注 0票数 4

我正在使用Matter.js编写一个简单的游戏。我很难弄清楚如何最好地将我的模型连接到Matter.js中。

我的游戏的特点是细菌,我想有一个类Bacterium,以便我可以管理这些家伙。在我当前的实现中,这个类创建并存储自己的Matter.Body,并将其传递给引擎。这就是我遇到麻烦的地方。我想更新我的模型的某些方面,当细菌相互碰撞,与墙壁,但我无法找到一个有效的方法,在我的模型中的细菌碰撞在我的物质碰撞处理程序。

我应该扩展Matter.Body的原型吗?有什么建议吗?还是我应该考虑的更大的网络项目?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-29 22:24:32

查看一下Render.collisions类中的Render.js函数。此函数呈现正在呈现的框架中发生的所有冲突。我认为,通过理解它们是如何呈现出来的,你可以在你所处的环境中找到你需要的东西。

记住,matterjs使用的是一个游戏循环,这与网页通常使用的基于事件的设置非常不同。查看一下Render.js类,以更好地理解如何使用matterjs提供的引擎。

票数 2
EN

Stack Overflow用户

发布于 2022-07-03 19:51:41

不要扩展你不拥有的原型。在类中将MJS主体作为字段添加是一种很好的方法,您可以通过使用Map将每个MJS主体与其相应的类实例关联起来来跟踪哪些主体正在碰撞。

下面是一个将链接到collisionStartcollisionEnd MJS事件中的例子,以调用在MJS主体上组成的自定义类上的方法。

代码语言:javascript
复制
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);
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.18.0/matter.min.js"></script>

Body.label属性可以帮助区分主体类型,但最终MJS没有提供任何类型的实体管理解决方案。我提醒大家不要过度依赖.label。最终,这取决于你选择一个适合你的应用程序需求的设计。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33575883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档