#Camera ##介绍 相机概念自从3.3引入,相机用来观察场景中的物体。相机从Node继承,可以支持大部分Action。
cocos2d-x支持两种类型的相机,透视相机和正交相机。透视相机看的物体有近大远小的效果,正交相机看到的物体远近一样大。
透视相机示意图
正交相机示意图
##Camera的使用 每个Scene中会自动创建一个默认相机,默认相机的类型由Director::_projection来决定。如果需要多个相机或者对相机有更高级的操作要求,用户可以根据需要创建自己的相机,例如子定义的Layer的onEnter或者init中可以增加如下相机创建代码,
// create a perspective camera
auto s = Director::getInstance()->getWinSize();
Camera* camera = Camera::createPerspective(60, (GLfloat)s.width/s.height, 1, 1000);
// set parameter for camera
camera->setPosition3D(Vec3(0, 100, 100));
camera->lookAt(Vec3(0, 0, 0), Vec3(0, 1, 0));
camera->setCameraFlag(CameraFlag::USER1);
// you can also create a orthographic camera if you like
addChild(camera); //add camera to the scene
setCameraMask(2);
如果同时存在多个相机,怎么标记某个物体被那些相机看到呢?
注意到Camera中有个_cameraFlag属性,为枚举类型,定义如下
enum class CameraFlag
{
DEFAULT = 1,
USER1 = 1 << 1,
USER2 = 1 << 2,
USER3 = 1 << 3,
USER4 = 1 << 4,
USER5 = 1 << 5,
USER6 = 1 << 6,
USER7 = 1 << 7,
USER8 = 1 << 8,
};
Node中有个_cameraMask的属性,当相机的_cameraFlag & _cameraMask为true时,该Node可以被该相机看到。所以在上述相机的创建代码中,camera的CameraFlag设置为CameraFlag::USER1,并且该layer的CameraMask为2,则表示该layer只能被CameraFlag::USER1相机看到。
Camera从Node继承,所以可以支持大部分Action,可以对相机进行任意的平移旋转操作。
##常用相机介绍 一般游戏中都会有主角的概念,根据相机与主角的关系,我们将相机分成三种类型,第一人称相机,第三人称相机和自由相机。
第一人称相机,所看见的场景就是主角自己所看到的场景,相机位置大概在主角的头部,并且随着主角进行移动和旋转。
第三人称相机,以第三者的视角观察主角,并且跟随主角移动,有的也会跟随主角旋转。
自由相机,顾名思义,相机可以自由移动,不跟随主角的移动而移动。
三种相机的实现及使用方法参考CppTest中的Camera Test。