C++学习_组件对象封装(一)

C++学习_组件对象封装(一)
创建组件文件
#pragma once#ifndef __GAME_COMPONENT_H__#define __GAME_COMPONENT_H__//定义一些组件的类型enum emComponentType{    ComType_None,  //空类型    ComType_Transform, // 坐标变换组件    ComType_MeshRender, //渲染组件    ComType_Camera, // 摄像机组件    ComType_Light, //灯光组件    //...};//使用前置声明游戏对象类class GameObject;typedef class Component{public:    virtual ~Component() = default; //创建默认析构    Component(const Component& that) = delete; //删除拷贝功能    Component& operator = (const Component& that) = delete;//删除赋值功能    //初始化类型    Component(GameObject* pObject)    {        mType = emComponentType::ComType_None;        mOwner = pObject;    }    emComponentType Type() { return mType; }// 获取组件类型    GameObject* gameobject() { return mOwner; }//获取持有对象protected:    GameObject* mOwner;//谁持有该组件    emComponentType mType;//组件的类型}COMPONENT,*LPCOMPONENT;#endif

创建Obj 对象类文件,每一个游戏对象至少都应该有这么唯一的一个tansform组件

#pragma once#ifndef __GAME_OBJECT_H__#define __GAME_OBJECT_H__#include "Transform.h"#include <vector>class GameObject{public:    //初始    GameObject()    {        //创建transform组件        mpTransform = nullptr;        mpTransform = (Transform*)AddComponent(emComponentType::ComType_Transform);    }    virtual ~GameObject()    {        //将创建的组件释放    }    //增加组件的功能    //如果不为空返回,为空则创建    LPCOMPONENT AddComponent(emComponentType t)    {        switch (t)        {        case emComponentType::ComType_Transform:        {            if (mpTransform!=nullptr)            {                return mpTransform;            }            mpTransform = new Transform(this);            return mpTransform;        }break;        case emComponentType::ComType_Camera:        {        }break;        case emComponentType::ComType_MeshRender:        {        }break;        case emComponentType::ComType_Light:        {        }break;        default:        {        }        }        return nullptr;    }    //获取组件的功能    LPCOMPONENT GetComponent(emComponentType t)    {        if (t == emComponentType::ComType_Transform)        {            return mpTransform;        }        for (auto& itr:mComponents)        {            if (itr->Type() == t)            {                return itr;            }        }        return nullptr;    }    //删除组件的功能    void RemoveComponent(emComponentType t)    {        if (t == emComponentType::ComType_Transform) { return; }        for (auto it = mComponents.begin();it!=mComponents.end();it++)        {            if ((*it)->Type() == t)            {                delete* it;                mComponents.erase(it);                return;            }        }    }    Transform& transform() { return *mpTransform; }protected:    Transform* mpTransform;//每一个游戏对象至少都应该有这么唯一的一个tansform组件    std::vector<LPCOMPONENT> mComponents;//组件存储除了transform的所有的组件};#endif

创建Transform 坐标变换组件对象类

#pragma once#ifndef __GAME_COMPONENT_TRANSFORM_H__#define __GAME_COMPONENT_TRANSFORM_H__#include "Component.h"#include "Matrix4x4.h"class Transform:public Component{public:    //必须使用初始化列表的方式初始化父类唯一的带参构造    Transform(GameObject* pObj) :Component(pObj)    {        mType = emComponentType::ComType_Transform;        mPosition = vector3d::Zero();        mScale = vector3d::One();        mRotation = vector3d::Zero();        //凡是修改位置、缩放、旋转的成员值,都应该调用对应的矩阵更新函数        _update_Matrix_Translate();        _update_Matrix_Scale();        _update_Matrix_Rotate();    }    //获取变换组件成员 函数    vector3d forward() { return mZ; }    vector3d back() { return -mZ; }    vector3d right() { return mX; }    vector3d left() { return -mX; }    vector3d up() { return mY; }    vector3d down() { return -mY; }    const vector3d& localScale() { return mScale; }    const vector3d& position() { return mPosition; }    const vector3d& rotation() { return mRotation; }    Matrix4x4& MatT() { return MatrixTranslate; }    Matrix4x4& MatS() { return MatrixScale; }    Matrix4x4& MatR() { return MatrixRotate; }    //修改成员变量函数 ,每次修改都应该调用对应的矩阵更新函数    void SetPosition(const vector3d& v)    {        mPosition = v;        _update_Matrix_Translate();    }    void SetScale(const vector3d& v)    {        mScale = v;        _update_Matrix_Scale();    }    void SetRotation(const vector3d& v)    {        mRotation = v;        _update_Matrix_Rotate();    }    void translate(const vector3d& tv)    {        mPosition += tv;        _update_Matrix_Translate();    }    void scale(const vector3d& ts)    {        mScale *= ts;        _update_Matrix_Scale();    }    void rotate(const vector3d& v);protected:    //凡是修改了位置、缩放、旋转的成员值,都应该调用对应的矩阵更新函数    void _update_Matrix_Translate();    void _update_Matrix_Scale();    void _update_Matrix_Rotate();protected:    vector3d mPosition; //位置    vector3d mScale;//缩放    vector3d mRotation; //旋转    vector3d mX, mY, mZ;    Matrix4x4 MatrixTranslate;//平移矩阵    Matrix4x4 MatrixScale;//缩放矩阵    Matrix4x4 MatrixRotate;//旋转矩阵};#endif
#include "Transform.h"#include "GameObject.h"void Transform::rotate(const vector3d& v){    //将角度转换为弧度    vector3d angle_r = v * 0.01745329f;//M_PI/180;    //使用每一个轴旋转角度得到对应的旋转矩阵    Matrix4x4 _mx; _mx.SetRotateX_r(angle_r.x);    Matrix4x4 _my; _my.SetRotateY_r(angle_r.y);    Matrix4x4 _mz; _mz.SetRotateZ_r(angle_r.z);    //欧拉角的旋转顺序有6中 xyz,xzy,yxz,yzx,zxy,zyx    //我们选取zxy顺序进行旋转    Matrix4x4 _mr = _mz * _mx * _my;    //在这个基础上得到完整的旋转矩阵    MatrixRotate *= _mr;    Matrix4x4& r = MatrixRotate;    //根据正交矩阵的性质,对应轴向的矩阵的转置矩阵为其旋转矩阵    mX.x = r._11; mY.x = r._12; mZ.x = r._13;    mX.y = r._21; mY.y = r._22; mZ.y = r._23;    mX.z = r._31; mY.z = r._32; mZ.z = r._33;    mX.Normalize();    mY.Normalize();    mZ.Normalize();    //需要根据当前的数据求解欧拉角    double sy = sqrt(r._11 * r._11 + r._21 * r._21);    bool singular = sy < 1e-6;//1e-6使用的是科学计数法表示的 0.000001    if (!singular)    {        mRotation.x = atan2(r._32, r._32);        mRotation.y = atan2(-r._31, sy);        mRotation.z = atan2(r._21, r._11);    }    else    {        mRotation.x = atan2(r._23, r._22);        mRotation.y = atan2(-r._31, sy);        mRotation.z = 0;    }    //将弧度转换为角度    mRotation *= 57.2957795f;}void Transform::_update_Matrix_Translate(){    MatrixTranslate.SetTranslate(mPosition);}void Transform::_update_Matrix_Scale(){    MatrixScale.SetScale(mScale);}void Transform::_update_Matrix_Rotate(){    //将角度转换为弧度    vector3d angle_r = mRotation * 0.01745329f;//M_PI/180;    //使用每一个轴旋转角度得到对应的旋转矩阵    Matrix4x4 _mx; _mx.SetRotateX_r(angle_r.x);    Matrix4x4 _my; _my.SetRotateY_r(angle_r.y);    Matrix4x4 _mz; _mz.SetRotateZ_r(angle_r.z);    //欧拉角的旋转顺序有6中 xyz,xzy,yxz,yzx,zxy,zyx    //我们选取zxy顺序进行旋转    MatrixRotate = _mz * _mx * _my;    Matrix4x4& r = MatrixRotate;    //根据正交矩阵的性质,对应轴向的矩阵的转置矩阵为其旋转矩阵    mX.x = r._11; mY.x = r._12; mZ.x = r._13;    mX.y = r._21; mY.y = r._22; mZ.y = r._23;    mX.z = r._31; mY.z = r._32; mZ.z = r._33;    mX.Normalize();    mY.Normalize();    mZ.Normalize();}

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部