项目作者: nestarz

项目描述 :
ECS tryhard
高级语言: JavaScript
项目地址: git://github.com/nestarz/pecs.git
创建时间: 2020-04-10T22:22:07Z
项目社区:https://github.com/nestarz/pecs

开源协议:MIT License

下载


PECS, a small ECS (Entity Component System) attempt without class

Run

  1. python -m http.server 8080 --bind 127.0.0.1

Example

  1. import { createWorld } from "pecs";
  2. const game = ({ FPS = 60 } = {}) => {
  3. const world = createWorld();
  4. const positionComponent = world.createComponent("position", {
  5. x: Number,
  6. y: Number,
  7. });
  8. const velocityComponent = world.createComponent("velocity", {
  9. x: Number,
  10. y: Number,
  11. });
  12. const shapeComponent = world.createComponent("shape", {
  13. color: String,
  14. size: Object,
  15. });
  16. const rendererComponent = world.createComponent("renderer", {
  17. context2d: CanvasRenderingContext2D,
  18. });
  19. const movableSystem = world.createSystem("movable");
  20. world.linkSystem(movableSystem, positionComponent, { mutable: true });
  21. world.linkSystem(movableSystem, velocityComponent);
  22. world.linkSystem(movableSystem, rendererComponent);
  23. world.querySystem(movableSystem, (results, delta) => {
  24. results.map(({ position, velocity, renderer }) => {
  25. position.x += delta * velocity.x;
  26. position.y += delta * velocity.y;
  27. if (position.x > renderer.context2d.canvas.width) position.x = 0;
  28. if (position.x < 0) position.x = renderer.context2d.canvas.width;
  29. if (position.y > renderer.context2d.canvas.height) position.y = 0;
  30. if (position.y < 0) position.y = renderer.context2d.canvas.height;
  31. });
  32. });
  33. const renderSystem = world.createSystem("render");
  34. world.linkSystem(renderSystem, positionComponent);
  35. world.linkSystem(renderSystem, shapeComponent);
  36. world.linkSystem(renderSystem, rendererComponent, { mutable: true });
  37. world.querySystem(renderSystem, (results) => {
  38. results.forEach((entity, i) => {
  39. entity.renderer.context2d.fillStyle = entity.shape.color;
  40. entity.renderer.context2d.fillRect(
  41. entity.position.x,
  42. entity.position.y,
  43. entity.shape.size.x,
  44. entity.shape.size.y
  45. );
  46. });
  47. });
  48. const canvas = document.body.appendChild(document.createElement("canvas"));
  49. canvas.width = window.innerWidth;
  50. canvas.height = window.innerHeight;
  51. for (let i = 0; i < 400; i++) {
  52. const entity = world.createEntity();
  53. world.linkEntity(entity, positionComponent, {
  54. x: Math.random() * canvas.width,
  55. y: Math.random() * canvas.height,
  56. });
  57. world.linkEntity(entity, velocityComponent, {
  58. x: Math.random() / 10,
  59. y: Math.random() / 10,
  60. });
  61. world.linkEntity(entity, shapeComponent, {
  62. color: "red",
  63. size: { x: 10, y: 10 },
  64. });
  65. world.linkEntity(entity, rendererComponent, {
  66. context2d: canvas.getContext("2d"),
  67. });
  68. }
  69. console.log(world.data);
  70. return {
  71. start: () =>
  72. setTimeout(function update(lastTime = performance.now()) {
  73. const time = performance.now();
  74. canvas.getContext("2d").clearRect(0, 0, canvas.width, canvas.height);
  75. world.execute(time - lastTime, time);
  76. setTimeout(() => update(time), 1000 / FPS);
  77. }, 1000 / FPS),
  78. };
  79. };
  80. game().start();