自定义实体

本功能较为复杂,故以逐步教程的形式进行讲解。

构造碰撞箱

可以使用序列化后的对象构造出碰撞箱对象。

const  = {
  : "CollisionBox",
  : [
    {
      : "Rectangle",
      : { : "Vector", : 0, : 0 },
      : { : "Vector", : 100, : 100 },
    },
  ],
};

可以简单封装一下。

function (: number, : number) {
  return { : "Vector", ,  };
}
function (: number, : number, : number, : number) {
  return { : "Rectangle", : (, ), : (, ) };
}
function (: any[]) {
  return { : "CollisionBox",  };
}
const  = ([(0, 0, 100, 100)]);

编写渲染函数

渲染函数输入实体的数据,输出 ImageBitmap 对象,可使用 OffscreenCanvas 进行绘制。

async function (: {
  : string;
  : string;
  : string;
}): <ImageBitmap> {
  const  = new (100, 100);
  const  = .("2d")!;
  . = "white";
  .(0, 0, 100, 100);
  . = .;
  . = 5;
  .();
  .(50, 50, 40, 0, . * 2);
  .();
  . = "black";
  . = `20px ${.}`;
  . = "center";
  . = "middle";
  .(., 50, 50);
  return ();
}

注册实体

await .(
  // id,扩展之间相互独立
  "circle",
  // 默认数据
  { : "", : "#fff", : "system-ui" },
  // 碰撞箱
  ([(0, 0, 100, 100)]),
  // 渲染函数
  .(),
);

响应点击事件

await .(
  "circle",
  .(async () => {
    // 先获取到 Entity 对象,或者在创建实体时把 Entity 对象存起来(见下文)
    const  = await .();
    if (!) return;
    const  = await .;
    const : any[] = await (.([
      await .,
    ]) as any);
    if (! || . === 0) return;
    const  = [0];
    if (!) return;
    // 必须使用 `setCustomData` 修改实体数据!否则不会触发重新渲染
    await 
      .setCustomData
      // ...
      ();
  }),
);

创建实体

const  = await .(
  "circle",
  {
    : "Hello",
    : "#fff",
    : "system-ui",
  },
  {
    : 100,
    : 100,
  },
);

On this page