组件

组件存储且只存储数据,并且每个组件都被一个实体 ID 标记,表明组件与实体的所属关系。

在实体那一章,我们已经创建了一个实体,现在我们想要将这个实体渲染到窗口中,需要为其绑定能够被渲染系统所识别的组件组合。

现在我们使用纹理渲染作为实例,Alice 的纹理渲染系统会识别以下三个组件: TransformComp,TextureComp,ColorComp

TransformComp:变换组件存储坐标,尺寸,旋转角度,这些信息用来描述一个实体被渲染在窗口中的形态,如果你的实体是窗口中可见的,那么这个组件是必须的。

TextureComp:纹理组件,存储一个纹理,这个纹理你可以通过使用 Alice 的资源管理器进行加载和获取。

ColorComp:颜色组件,存储颜色信息。这个信息用来控制纹理的颜色。这个颜色效果来自一个默认的着色器,渲染系统都提供了着色器相关的接口,你可以自定义自己的着色器,实体不同的效果。

你可以像下面这样为实体绑定这些组件,并将其渲染到屏幕上。

World* w = game.GetWorld();
// 获取资源管理器
ResourceMngr* r = game.GetResourceMngr();
// 加载一张纹理,并命名为 'li'
r->LoadTexture("li",
    Path::GeneratePath(A_IMAGE, "li.png").c_str()
);

Entity one = w->CreateEntity();
// 绑定纹理组件
w->AtachComp<TextureComp>(one, TextureComp{
    &r->GetTexture("li")
});
// 绑定变换组件
// 组件的构造信息以此为:位置,尺寸,旋转角度
// 尽管 Alice 几乎没有使用到 glm 提供的高级功能
// 但因为一些设计上的原因,glm 还无法完全去除
// 所以我们在使用一些功能时,仍然需要使用 glm 来构造向量
// Alice 自定义的 Math 库开发完成后,会对 glm 进行全面替换
w->AtachComp<TransformComp>(one, TransformComp{
    glm::vec2(200, 100),
    glm::vec2(100, 100),
    0.0f
});
// 绑定颜色组件
w->AtachComp<ColorComp>(one, ColorComp{
    glm::vec3(1.0f, 1.0f, 1.0f)
});

每一次实体被绑定或卸载组件,签名信息都会被更新,在下一轮 Update 中,实体会被不同的系统识别,从而产生不一样的逻辑。

Alice 已经为你准备好了这些组件:

  • TextureAnimComp:纹理集合动画组件,使用一组纹理来表示动画。

  • TextureComp:纹理组件,用来显示一个静态纹理。

  • TransformComp:变换组件,用来表示一个实体在窗口中的位置。

  • SpriteAnimComp:精灵动画组件,存储一张精灵图纹理和处理信息,可以用来在窗口中渲染一个帧动画。

  • ColorComp:颜色组件,存储一个长度为 3 的向量,向量的 x, y, z 分别对应 R, G, B 值,为被渲染的物体附上一个颜色。

  • ForceComp:力组件,存储四个方向的力和重力,默认的重力会使实体具有向下的速度,可以自定义四个方向不同的力,给实体带来不一样的运动效果。

  • VisualBoxComp 组件:用来开启 OBB 盒子的可视化,用于 Debug。

  • AABBComp:使用 AABB 算法的碰撞组件,可以为实体附加碰撞效果。

  • OBBComp:使用分离轴算法的碰撞组件,可以为实体附加碰撞效果。