组件 ================================ 组件存储且只存储数据,并且每个组件都被一个实体 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(one, TextureComp{ &r->GetTexture("li") }); // 绑定变换组件 // 组件的构造信息以此为:位置,尺寸,旋转角度 // 尽管 Alice 几乎没有使用到 glm 提供的高级功能 // 但因为一些设计上的原因,glm 还无法完全去除 // 所以我们在使用一些功能时,仍然需要使用 glm 来构造向量 // Alice 自定义的 Math 库开发完成后,会对 glm 进行全面替换 w->AtachComp(one, TransformComp{ glm::vec2(200, 100), glm::vec2(100, 100), 0.0f }); // 绑定颜色组件 w->AtachComp(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:使用分离轴算法的碰撞组件,可以为实体附加碰撞效果。