cocos API



--node
一个节点的主要特点:
    > 他们可以包含其他的节点对象(addChild, getChildByTag, removeChild, etc)
    > 他们可以安排定期的回调(schedule, unschedule, etc)
    > 他们可以执行一些动作(runAction, stopAction, etc)
    > 子类节点通常意味着(单一的/所有的):
        > 重写初始化资源并且可以安排回调
        > 创建回调来操作进行的时间
        > 重写“draw”来渲染节点
    > 节点的属性有:位置、缩放、旋转、倾斜、锚点、内容大小、可见性

    下面将介绍一下节点主要常用的一些操作函数,以及新的功能特性。
    (1)节点的属性
    (2)节点的操作
    (3)动作相关Action
    (4)定时器相关schedule
    (5)整合NodeRBGA类
    (6)查找子节点enumerateChildren
    (7)渲染顺序zOrder
    (8)坐标转换


 1、节点的属性
 节点的属性有:位置、缩放、旋转、倾斜、锚点、内容大小、可见性。
  位置Position
 *     设置节点的坐标(x,y).在OpenGL中的坐标
 *     增加3D坐标
 *     增加标准化坐标设置
 */
    virtual void setPosition(const Vec2 &position); //Vec2坐标
    virtual void setPosition(float x, float y);     //(x,y),比Vec2更有效率
    virtual void setPositionX(float x);
    virtual void setPositionY(float y);
    virtual const Vec2& getPosition() const;
    virtual void  getPosition(float* x, float* y) const;
    virtual float getPositionX(void) const;
    virtual float getPositionY(void) const;

//增加3D坐标
    virtual void setPosition3D(const Vec3& position); //Vec3坐标
    virtual Vec3 getPosition3D() const;
    virtual void setPositionZ(float positionZ);
    virtual float getPositionZ() const;

//增加标准化坐标设置
    //Node的位置像素会根据它的父节点的尺寸大小计算
    //Size s = getParent()->getContentSize();
    //_position = pos * s;
    virtual void setNormalizedPosition(const Vec2 &position);
    virtual const Vec2& getNormalizedPosition() const;


/**
 * 放缩Scale
 *     设置节点的放缩比例. 对XYZ轴进行放缩
 *     例如一张图片. 放缩它的宽X,高Y,深Z
 */
    virtual void setScaleX(float scaleX);              //放缩宽X
    virtual void setScaleY(float scaleY);              //放缩高Y
    virtual void setScaleZ(float scaleZ);              //放缩深Z
    virtual void setScale(float scaleX, float scaleY); //X放缩fScaleX倍,Y放缩fScaleY倍
    virtual void setScale(float scale);                //XYZ同时放缩scale倍
    virtual float getScaleX() const;
    virtual float getScaleY() const;
    virtual float getScaleZ() const;
    virtual float getScale()  const;                   //当x,y放缩因子相同时,得到该节点的缩放因子


/**
 * 旋转Rotation
 *     设置节点的旋转角度. 负顺,正逆时针旋转
 *     增加3D旋转
 */
    virtual void setRotation(float rotation);
    virtual float getRotation() const;

//增加3D旋转
    virtual void setRotation3D(const Vec3& rotation); 
    virtual Vec3 getRotation3D() const;


/**
 * 倾斜Skew
 *     设置XY轴的倾斜角度
 *     setRotationalSkew()  模拟Flash的倾斜功能
 *     setSkew()            使用真正的倾斜功能
 */
    virtual void setSkewX(float skewX); //水平旋转倾斜.负顺时针变形
    virtual void setSkewY(float skewY); //垂直旋转倾斜
    virtual void setRotationSkewX(float rotationX);
    virtual void setRotationSkewY(float rotationY);
    virtual float getSkewX() const;
    virtual float getSkewY() const;
    virtual float getRotationSkewX() const;
    virtual float getRotationSkewY() const;


/**
 * 锚点AnchorPoint
 *     锚点就像一枚图钉,将图片钉在屏幕上.而锚点就是图片的坐标.
 *     当然图钉可以钉在图片的左下角,右上角,或者中心都可以.
 *     (0,0)表示左下角,(1,1)表示右上角
 *     默认的锚点是(0.5,0.5),即节点的正中心
 */
    virtual void setAnchorPoint(const Vec2& anchorPoint); //标准化的锚点
    virtual const Vec2& getAnchorPoint() const;           //标准化的锚点
    virtual const Vec2& getAnchorPointInPoints() const;   //返回绝对像素的锚点,即屏幕坐标

//是否忽略锚点的设置
    //若忽略锚点设置,锚点永远为(0,0)
    //默认值是false, 但是在Layer和Scene中是true
    //这是一个内部方法,仅仅被Layer和Scene使用,不要自行调用!
    virtual void ignoreAnchorPointForPosition(bool ignore);
    virtual bool isIgnoreAnchorPointForPosition() const;


/**
 * 内容大小ContentSize
 *     contentSize依然是相同的,无论节点是缩放或者旋转 
 *     所有的节点都有大小,图层和场景有相同的屏幕大小
 */
    virtual void setContentSize(const Size& contentSize);
    virtual const Size& getContentSize() const;

/**
 * 可见性Visible
 */
    virtual void setVisible(bool visible);
    virtual bool isVisible() const;


2、节点的操作
    节点的操作有:标记、名字、自定义数据、父节点管理、子节点管理、其他操作管理。

//
/**
 * 标记与名字 Tag and Name
 *     setTag  : 给节点设置一个编号
 *     setName : 给节点设置一个名字
 */
    virtual void setTag(int tag);
    virtual void setName(const std::string& name);
    virtual int getTag() const;
    virtual std::string getName() const;


/**
 * 自定义数据UserData/Object
 *     setUserData   : 设置一个用户自定义的数据. 可以为一个数据块, 结构体或者一个对象.
 *     setUserObject : 设置一个用户自定义的对象. 和userData类似, 但它是一个对象而不是void*
 */
    virtual void setUserData(void *userData);
    virtual void setUserObject(Ref *userObject);
    virtual void* getUserData();
    virtual Ref* getUserObject();


/**
 * 设置父节点Parent
 *     setParent , removeFromParent
 */
    virtual void setParent(Node* parent);
    virtual Node* getParent();
    virtual void removeFromParent();
    virtual void removeFromParentAndCleanup(bool cleanup); //true则删除该节点的所有动作及回调函数.


/**
 * 管理子节点Child
 *     addChild , 
 *     getChildBy** , getChildren       , getChildrenCount
 *     removeChild  , removeAllChildren
 *     reorderChild , sortAllChildren
 */
    //添加子节点
    //localZOrder   Z轴顺序为了绘画的优先权
    //tag           节点编号,可通过tag获取子节点
    //name        节点名字,可通过name获取子节点
    virtual void addChild(Node * child);
    virtual void addChild(Node * child, int localZOrder);
    virtual void addChild(Node* child, int localZOrder, int tag);
    virtual void addChild(Node* child, int localZOrder, const std::string &name);

    //获取子节点
    virtual Node* getChildByTag(int tag) const;
    virtual Node* getChildByName(const std::string& name) const;
    virtual Vector<Node*>& getChildren();     //获得所有子节点,并以Vector数组返回
    virtual ssize_t getChildrenCount() const; //子节点总数

    //删除子节点
    virtual void removeChild(Node* child, bool cleanup = true);
    virtual void removeChildByTag(int tag, bool cleanup = true);
    virtual void removeChildByName(const std::string &name, bool cleanup = true);
    virtual void removeAllChildren();                        //删除所有节点
    virtual void removeAllChildrenWithCleanup(bool cleanup); //cleanup为true则删除子节点的所有动作

    //重排子节点
    //重新排序一个子节点,设定一个新的z轴的值
    //child         它必须是已经添加的
    //localZOrder   Z轴顺序为了绘画优先级
    virtual void reorderChild(Node * child, int localZOrder);
    virtual void sortAllChildren(); //重新排序所有子节点


/**
 * 其他操作管理
 */
    virtual void onEnter();                    //节点开始进入舞台时调用.即创建时调用.
    virtual void onEnterTransitionDidFinish(); //节点进入舞台后调用.即创建完后调用.
    virtual void onExit();                     //节点离开舞台时调用.即移除时调用
    virtual void onExitTransitionDidStart();   //节点离开舞台前调用.

    virtual void visit() final;

    //返回包含Node(节点)的Scene(场景). 
    //若不属于任何的场景,它将返回nullptr
    virtual Scene* getScene() const;

    //返回节点在父节点坐标中的矩形边界框
    virtual Rect getBoundingBox() const;

    //暂停所有的活动着的动作和调度器
    virtual void cleanup();
//
//
//
3、动作相关Action
    动作管理:运行、暂停、取消等操作。
    //
/**
 * 动作管理Action
 *     setActionManager
 *     runAction , stopAction , getActionByTag , getNumberOfRunningActions
 */
    //设置被所有动作使用的ActionManager对象
    //如果你设置了一个新的ActionManager, 那么之前创建的动作将会被删除
    virtual void setActionManager(ActionManager* actionManager);
    virtual ActionManager* getActionManager();

    Action* runAction(Action* action);          //执行一个动作
    Action* getActionByTag(int tag);            //获取动作, 根据tag标记
    void stopAllActions();                      //暂停动作
    void stopAction(Action* action);            //暂停动作
    void stopActionByTag(int tag);              //暂停动作
    ssize_t getNumberOfRunningActions() const;  //获取正在运行的动作数量


4、定时器相关schedule
    定时器管理,默认定时器、自定义定时器、一次性定时器。
    //
/**
 * 定时器管理schedule
 *     setScheduler
 *     scheduleUpdate : 默认定时器
 *     schedule       : 自定义定时器
 *     scheduleOnce   : 一次性定时器
 */
    //设置一个调度器对象,来调度所有的“update”和定时器
    //如果你设置了一个新的调度器,那么之前创建的timers/update将会被删除。
    virtual void setScheduler(Scheduler* scheduler);
    virtual Scheduler* getScheduler(); //得到调度器对象

    //开启默认定时器.刷新次数为60次/秒.即每秒60帧.
    //与update(float delta)回调函数相对应.
    //给予定时器优先级priority.其中priority越小,优先级越高
    void scheduleUpdate(void);
    void scheduleUpdateWithPriority(int priority);
    void unscheduleUpdate(void);      //取消默认定时器
    virtual void update(float delta); //update为scheduleUpdate定时器的回调函数.

    //设置自定义定时器.默认为每秒60帧.
    //interval  :   每隔interval秒,执行一次.
    //repeat    :   重复次数.
    //delay     :   延迟时间,即创建定时器delay后开始执行.
    void schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay);
    void schedule(SEL_SCHEDULE selector, float interval);
    void schedule(SEL_SCHEDULE selector);                  //默认为每秒60帧
    void scheduleOnce(SEL_SCHEDULE selector, float delay); //只执行一次,delay秒后执行

    void unschedule(SEL_SCHEDULE selector);                //取消一个自定义定时器
    void unscheduleAllSelectors(void);                     //取消所有定时器
    void resume(void);                                     //恢复所有定时器和动作
    void pause(void);                                      //暂停所有定时器和动作
//
//
5、整合NodeRGBA类
    整合NodeRGBA类,增加颜色、透明度的设置。
    //
/**
 * 整合NodeRGBA类
 *     setOpacity : 透明度
 *     setColor   : 颜色
 */
    virtual GLubyte getOpacity() const;
    virtual GLubyte getDisplayedOpacity() const;
    virtual void setOpacity(GLubyte opacity);

    virtual const Color3B& getColor() const;
    virtual const Color3B& getDisplayedColor() const;
    virtual void setColor(const Color3B& color);
//
//
6、enumerateChildren
    新增的Node::enumerateChildren方法,且支持C++ 11的正则表达式。
    用于枚举某个Node节点的子节点,并让名字符合"name通配符"的子节点执行callback函数。
    且callback函数返回类型应该为一个bool值,并且返回为true时,结束查找。

    virtual void enumerateChildren(const std::string &name, std::function<bool(Node* node)> callback) const;

    使用举例:
    //Find nodes whose name is 'nameToFind' and end with digits. 
    node->enumerateChildren("nameToFind[[:digit:]]+", 
        [](Node* node) -> bool { ... return false; // return true to stop at first match });
    //Find nodes whose name is 'nameToFind' and end with digits recursively. 
    node->enumerateChildren("nameToFind[[:digit:]]+", 
        [](Node* node) -> bool { ... return false; // return true to stop at first match });

    通配符匹配举例:
        //搜索语法选项
        '//' : 递归访问所有子节点,   只能放在搜索串的开头位置
        '..' : 搜索移至node的父节点, 只能放在某个字符串的结束位置
        '/'  : 搜索移至node的子节点, 可以放在任何位置,除了搜索串的开头位置

        //代码举例
        enumerateChildren("//MyName", ...)     : 递归访问Node的所有子节点。查找匹配 "MyName" 的子节点
        enumerateChildren("[[:alnum:]]+", ...) : 在Node的儿子节点中查找。  所有项
        enumerateChildren("A[[:digit:]]", ...) : 在Node的儿子节点中查找。  名字为 "A0","A1",...,"A9" 的子节点
        enumerateChildren("Abby/Normal", ...)  : 在Node的孙子节点中查找。  其节点为"Normal",且父节点为"Abby"
        enumerateChildren("//Abby/Normal", ...): 递归访问Node的所有子节点。其节点为"Normal",且父节点为"Abby"

7、渲染顺序
    在2.x中是使用Zorder来控制节点渲染的先后顺序的。而在3.x中渲染的顺序则是由两个因素决定。
        > 全局Z顺序:GlobalZOrder。所有节点之间对比。
        > 局部Z顺序:LocalZOrder。 兄弟节点之间对比。
    且Z顺序越小,最先渲染。

    7.1、全局Z顺序
        > 定义渲染节点的顺序,拥有全局Z顺序越小的节点,最先渲染。
        > 假设:两个或者更多的节点拥有相同的全局Z顺序,那么渲染顺序无法保证。唯一的例外是如果节点的全局Z顺序为零,那么场景图顺序是可以使用的。
        > 默认的,所有的节点全局Z顺序都是零。这就是说,默认使用场景图顺序来渲染节点。
        > 全局Z顺序是非常有用的当你需要渲染节点按照不同的顺序而不是场景图顺序。
        > 局限性: 全局Z顺序不能够被拥有继承“SpriteBatchNode”的节点使用。
        virtual void setGlobalZOrder(float globalZOrder);
        virtual float getGlobalZOrder() const;

    7.2、局部Z顺序
    > LocalZOrder是“key”(关键)来分辨节点和它兄弟节点的相关性。
    > 父节点将会通过LocalZOrder的值来分辨所有的子节点。如果两个节点有同样的LocalZOrder,那么先加入子节点数组的节点将会比后加入的节点先得到渲染,
      那么先加入的节点会被后加入的节点遮盖[update 20140927]。
    > 同样的,场景图使用“In-Order(按顺序)”遍历数算法来遍历。并且拥有小于0的LocalZOrder的值的节点是“left”子树(左子树) 
      所以拥有大于0的LocalZOrder的值得节点是“right”子树(右子树)。
       //设置这个节点的局部Z顺序((相对于兄弟节点))
      virtual void setLocalZOrder(int localZOrder);
      virtual int getLocalZOrder() const;



8、坐标转换

坐标分为两种坐标:
        > 世界坐标:就是相对节点的世界坐标。
        > 局部坐标:就是相对节点的坐标。

    8.1
    /**
     * 坐标转换convertTo
     *     WorldSpace :   世界坐标
     *     NodeSpace  :  局部坐标
     *
     */
        //把世界坐标, 转换到当前节点的本地坐标系中
        //基于Anchor Point, 把基于当前节点的本地坐标系下的坐标, 转换到世界坐标系中
        Vec2 convertToNodeSpace(const Vec2& worldPoint) const;
        Vec2 convertToNodeSpaceAR(const Vec2& worldPoint) const;


        //把基于当前节点的本地坐标系下的坐标, 转换到世界坐标系中
        //基于Anchor Point. 把世界坐标, 转换到当前节点的本地坐标系中
        Vec2 convertToWorldSpace(const Vec2& nodePoint) const;
        Vec2 convertToWorldSpaceAR(const Vec2& nodePoint) const;


        //把触点坐标, 转换到当前节点的本地坐标系中
        Vec2 convertTouchToNodeSpace(Touch * touch) const;
        Vec2 convertTouchToNodeSpaceAR(Touch * touch) const;
    8.2
        > node1坐标为:(20,40), 锚点(0,0)。
        > node2坐标为:(-5,-20),锚点(1,1)。
        > Vec2 point1 = node1->convertToNodeSpace(node2->getPosition());
            结果为:(-25,-60)。(即:相对node1节点坐标位置,的,相对坐标)
            分析  :node2相对node1节点的坐标为:(-5,-20) - (20,40) 。
                    也就是说:node2相对node1的坐标位置。
        > Vec2 point2 = node1->convertToWorldSpace(node2->getPosition());
            结果为:(15,20)。(即:相对node1的世界坐标系统下,的,世界坐标)
            分析  :将node1作为参照,转换到世界坐标为:(20,40) + (-5,-20) 。
                    也就是说:node2的坐标现在被看做是相对node1的坐标位置,然后转换到世界坐标。
    8.3
        判断触摸点是否触摸到某个精灵图片sp的内部区域
        bool HelloWorld::onTouchBegan(Touch *touch, Event *unused_event)
        {
            //将触点坐标, 转换为相对节点sp的, 相对坐标
            Vec2 point = sp->convertTouchToNodeSpace(touch);

            //构造sp的尺寸矩形
            Size size = sp->getContentSize();
            Rect rect = Rect(0, 0, size.width, size.height);

            //判断触点是否触摸到sp内部
            if (rect.containsPoint(point)) {
                CCLog("点中");
                return true;
            }    
            return false;
        }


--------------------------------Director

    导演Director
    就和现实中的导演一样,这里的导演也是起到指导的作用的。导演在这里负责的就是让不同的场景切换,控制整个游戏的流程,包括开始,继续,暂停等。以及设置、获取系统信息,比如调整OpenGL相关的设置,获取屏幕的大小等。
    和Scene、Layer、Sprite等不同的是,导演类Director是直接继承Ref类的,而不是Node类。

        //
    /** 
        导演类Director主要是用来:
            - 创建一个主窗口
            - 管理场景Scene
        Director 也负责以下: 
            - 初始化 OpenGL 内容
            - 设置 OpenGL 像素格式 (默认值时 RGB565) 
            - 设置 OpenGL 缓存大小 (默认是 0-bit) 
            - 设置 投影 (默认是一个 3D) 
            - 设置 方向 (默认是竖屏Portrait)

        Director 是一个单例对象, 标准的调用方法是:
            - Director::getInstance()->methodName(); 
    */

    class CC_DLL Director : public Ref
    {
    /**
     * 获取单例对象
     */
        //获取全局唯一的Director实例 , 替代 sharedDirector
        //使用方法:Director::getInstance()->replaceScene(scene);
        static Director* getInstance();


    /**
     * 场景管理相关
     *     - runWithScene
     *     - pushScene
     *     - popScene , popToRootScene , popToSceneStackLevel
     *     - replaceScene
     *     - pause , resume , end
     *     - getRunningScene , isPaused
     */
        //指定进入Director的主循环运行的场景.
        //ps:仅在运行第一个场景时调用,如果已经存在运行中的场景,不能调用本方法.
        //本方法调用后将调用pushScene方法,然后调用startAnimation.
        void runWithScene(Scene *scene);

        //将运行中的场景暂停,并push到场景堆栈中,运行新的场景.
        void pushScene(Scene *scene);

        //从场景堆栈中pop出一个场景,替换现在正运行的场景,而运行中的场景将被删除.
        void popScene();

        //从场景堆栈中pop出所有场景,最后一个栈底的场景将替换现在正运行的场景,而运行中的场景将被删除.
        void popToRootScene();

        //弹出从队列中的所有场景,直到它到达 level.
        //如果 level 是 0,它将结束 director. 
        //如果 level 是 1, 从队列中弹出所有的场景,直到只有根场景在队列中. 
        //如果 level <= 当前的堆栈水平,它不会做任何事情。
       void popToSceneStackLevel(int level);

        //使用新场景替换当前场景,而运行中的场景将被删除.
        //PS:旧场景不压入堆栈,而是直接删除.
        void replaceScene(Scene *scene);

        void pause(void);                //暂停场景
        void resume(void);               //恢复被暂停的场景
        void end(void);                  //终止执行,释放运行中的场景. GL view需手动移除.

        inline Scene* getRunningScene(); //获取当前运行的场景
        inline bool isPaused();          //Director 是否被暂停


    /**
     * 刷新帧数FPS相关
     *     - setAnimationInterval
     *     - setDisplayStats
     *     - getSecondsPerFrame , getTotalFrames
     */
        //设置程序的FPS值. 即刷新频率,相连两帧的时间间隔.
        //如dValue = 1.0/60.0 表示每秒60帧.
        virtual void setAnimationInterval(double interval) = 0;
        inline double getAnimationInterval();

        //是否在左下角显示 FPS
        inline void setDisplayStats(bool displayStats);
        inline bool isDisplayStats();

        //获取每秒执行帧数
        inline float getSecondsPerFrame()

        //从 Director 开机后,总共已经渲染了多少帧
        inline unsigned int getTotalFrames();


    /**
     * OpenGL图形渲染相关
     *     - setOpenGLView
     *     - setProjection
     *     - getTextureCache
     *     - setViewport , setGLDefaultValues , setAlphaBlending , setDepthTest
     */
        //获取渲染所有东西的GLView
        void setOpenGLView(GLView *openGLView);
        inline GLView* getOpenGLView();

        //设置一个 OpenGL 投影
        //  Projection::_2D           : 设定的二维投影(正投影)
        //  Projection::_3D           : 使用 fovy=60, znear=0.5f and zfar=1500 设置一个3D投影
        //  Projection::CUSTOM        : 投影委托里面它调用 "updateProjection".
        //  Projection::DEFAULT = _3D : 默认投影是 3D 投影
        void setProjection(Projection projection);
        inline Projection getProjection();

        TextureCache* getTextureCache() const; //获取纹理缓冲
        void setViewport();                    //设置glViewport
        void setGLDefaultValues();             //设置 OpenGL 默认值
        void setAlphaBlending(bool on);        //启用/禁用 OpenGL alpha 混合
        void setDepthTest(bool on);            //启用/禁用 OpenGL 深度测试


    /**
     * OpenGL View视图相关
     *     - getWinSize
     *     - getVisibleSize , getVisibleOrigin
     *     - convertToGL , convertToUI
     */
        //类似手机屏幕的大小
        const Size& getWinSize() const;      //获取OpenGL view大小,单位点.
        Size getWinSizeInPixels() const;     //获取OpenGL view大小,单位像素.

        //类似程序的游戏区域
        //如果不调用GLView::setDesignResolutionSize(), 值等于getWinSize
        Size getVisibleSize() const;         //获取OpenGL View可视区域大小,单位点.
        Vec2 getVisibleOrigin() const;       //获取可视区域的原点坐标.

        //将UIKit坐标与OpenGL坐标的相互转换
        //UIKit坐标 :原点在屏幕的左上角. 从左到右,从上到下.
        //OpenGL坐标:原点在屏幕的左下角. 从左到右,从下到上.
        Vec2 convertToGL(const Vec2& point); //转为GL坐标
        Vec2 convertToUI(const Vec2& point); //转为UI坐标


    /**
     * 其他操作
     *     - purgeCachedData
     *     - getRenderer
     *     - setDefaultValues
     *     - setScheduler , setActionManager , setEventDispatcher
     */
        void purgeCachedData();                               //移除所有 cocos2d 缓存数据.
        Renderer* getRenderer() const;                        //获取渲染器(Renderer). v3.0
        void setDefaultValues();                              //设置配置信息的默认值

        void setScheduler(Scheduler* scheduler);              //设置与director关联的调度器
        void setActionManager(ActionManager* actionManager);  //设置与director关联的ActionManager
        void setEventDispatcher(EventDispatcher* dispatcher); //设置与director关联的EventDispatcher. v3.0
        Scheduler* getScheduler() const;
        ActionManager* getActionManager() const;
        EventDispatcher* getEventDispatcher() const;
    }
    //
    //



精灵Sprite
    精灵说简单一点,其实就是一个2D的图片。并赋予图片各种属性以及特性。如大小、颜色、放缩、旋转、动作等。精灵一般都是放在布景层(Layer)上面的,
    即一个布景层(Layer)应当有许多的精灵存在。精灵可以用来当做背景、人物、鸟、白云等内容。
    Sprite不仅继承了Node,还继承了纹理协议接口TextureProtocol。
    TextureProtocol纹理协议接口主要是负责纹理图片的管理。
    注意:精灵的锚点默认为(0.5,0.5),即中心点。

    //
/**
    Sprite定义为二维图像, 可以通过一个图像或一个图像的矩形裁剪部分创建Sprite.

        - 为了优化Sprite渲染,请遵循以下最佳用法:
            - 所有Sprite放入同一个SpriteSheet
            - 所有Sprite使用相同的渲染混合函数(BlendFunc)
            - 使得渲染器(Renderer)自动批量处理("batch")Sprite (将会在一次OpenGL调用内绘制完成)

        - 为了获得额外5%~10的渲染优化效果,你可以把Sprite作为子节点加入到SpriteBatchNode中, 
        - 但这么做有以下限制:
            - Alias/Antialias属性属于SpriteBatchNode,不能单独设置Sprite的Alias属性。
            - 渲染混合函数(BlendFunc)属于SpriteBatchNode,不能单独设置Sprite的渲染混合函数(BlendFunc)。
            - 不支持ParallaxNode,不过可以使用代理("proxy")Sprite模拟实现。

        - Sprite的子节点只能是其它Sprite(或Sprite的子类)
        - Sprite的默认锚点(anchorPoint)为(0.5, 0.5)。
 */

    class CC_DLL Sprite : public Node, public TextureProtocol
    {
    /**
     * 创建方法
     *     - create
     *     - createWithTexture
     *     - createWithSpriteFrame
     */
        static Sprite* create();                                                                    //默认创建空精灵对象
        static Sprite* create(const std::string& filename);                                         //图片文件(*.png)
        static Sprite* create(const std::string& filename, const Rect& rect);                       //截取图片文件中某一区域图片
        static Sprite* createWithTexture(Texture2D *texture);                                       //纹理图片
        static Sprite* createWithTexture(Texture2D *texture, const Rect& rect, bool rotated=false); //截取纹理图片中某一区域图片,是否旋转
        static Sprite* createWithSpriteFrame(SpriteFrame *spriteFrame);                             //精灵帧. 精灵帧一般从plist中读取的
        static Sprite* createWithSpriteFrameName(const std::string& spriteFrameName);               //精灵帧的名字



    /**
     * 批处理节点BatchNode
     *     - updateTransform
     *     - setBatchNode
     *     - getBatchNode
     */
        virtual void updateTransform(void);                          //更新四个值:position(x,y), rotation, scale
        virtual void setBatchNode(SpriteBatchNode *spriteBatchNode); //设置批节点,不推荐手工调用
        virtual SpriteBatchNode* getBatchNode(void);                 //如果精灵是由批节点渲染,则返回批节点


    /**
     * 纹理Texture
     *     - setTexture
     *     - setTextureRect
     */
        //设置精灵的纹理图片.
        virtual void setTexture(const std::string &filename ); //调用setTextureRect设置Sprite尺寸
        virtual void setTexture(Texture2D *texture) override;  //纹理的矩形尺寸大小不会改变
        virtual Texture2D* getTexture() const override;

        //设置Sprite纹理(texture)的Rect尺寸(rect)、是否旋转(rotated)、裁剪尺寸(untrimmedSize)。 
        //调用此方法会修改纹理(texture)的坐标和顶点位置
        virtual void setTextureRect(const Rect& rect, bool rotated = false, const Size& untrimmedSize = rect.size); 


    /**
     * 精灵帧SpriteFrames & 动画Animation
     *     - setSpriteFrame
     *     - isFrameDisplayed
     *     - getSpriteFrame
     *     - setDisplayFrameWithAnimationName
     */   
        //设置新的显示精灵帧. 替代setDisplayFrame
        virtual void setSpriteFrame(const std::string &spriteFrameName);
        virtual void setSpriteFrame(SpriteFrame* newFrame);

        //返回精灵帧是否正在显示
        virtual bool isFrameDisplayed(SpriteFrame *pFrame) const;

        //返回当前显示的精灵帧. 替代 getDisplayFrame
        virtual SpriteFrame* getSpriteFrame() const;

        //通过动画帧的第frameIndex那一帧来设置显示精灵帧
        //动画帧是从CCAnimationCache中读取的
        virtual void setDisplayFrameWithAnimationName(const std::string& animationName, ssize_t frameIndex);


    /**
     * 精灵属性相关
     *     - setDirty
     *     - getQuad
     *     - isTextureRectRotated
     *     - setAtlasIndex
     *     - getTextureRect
     *     - setTextureAtlas
     *     - getOffsetPosition
     *     - setFlippedX , setFlippedY
     */
        //设置Sprite在纹理集Atlas中是否需要更新
        virtual void setDirty(bool dirty);
        virtual bool isDirty(void) const;

        //返回四个值的信息:坐标(x,y),顶点,颜色
        inline V3F_C4B_T2F_Quad getQuad(void) const;

        //判断纹理是否被旋转
        inline bool isTextureRectRotated(void) const;

        //设置纹理集(TextureAtlas)的当前使用索引
        //警告: 除非你了解调用此方法的影响,否则不要改变此值
        inline void setAtlasIndex(ssize_t atlasIndex);
        inline ssize_t getAtlasIndex(void) const;

        //返回Sprite的Rect区域信息,单位点
        inline const Rect& getTextureRect(void);

        //如果采用批渲染,设置纹理地图集
        inline void setTextureAtlas(TextureAtlas *pobTextureAtlas);
        inline TextureAtlas* getTextureAtlas(void);

        //获取偏移值
        inline const Vec2& getOffsetPosition(void) const;

        //设置是否翻转。
        void setFlippedX(bool flippedX); //设置Sprite是否水平翻转。替代 setFlipX
        bool isFlippedX(void) const;
        void setFlippedY(bool flippedY); //设置Sprite是否垂直翻转。替代 setFlipY
        bool isFlippedY(void) const;


    /**
     * 继承于TextureProtocol
     *     - setBlendFunc
     */
        //设置颜色混合模式
        inline void setBlendFunc(const BlendFunc &blendFunc) override;
        inline const BlendFunc& getBlendFunc() const override;


    /**
     * 继承于Node
     *     - Scale , Position , Skew , AnchorPoint , Visible
     *     - addChild , removeChild , reorderChild , sortAllChildren
     *     - draw , setOpacityModifyRGB , isOpacityModifyRGB
     */
        virtual void setScaleX(float scaleX) override;
        virtual void setScaleY(float scaleY) override;
        virtual void setScale(float scaleX, float scaleY) override;
        virtual void setScale(float scale) override;

        virtual void setPosition(const Vec2& pos) override;
        virtual void setPosition(float x, float y) override;
        virtual void setRotation(float rotation) override;
        virtual void setPositionZ(float positionZ) override;

        virtual void setSkewX(float sx) override;
        virtual void setSkewY(float sy) override;
        virtual void setRotationSkewX(float rotationX) override;
        virtual void setRotationSkewY(float rotationY) override;

        virtual void setAnchorPoint(const Vec2& anchor) override;
        virtual void ignoreAnchorPointForPosition(bool value) override;

        virtual void setVisible(bool bVisible) override;

        virtual void addChild(Node *child, int zOrder, int tag) override;
        virtual void addChild(Node *child, int zOrder, const std::string &name) override;
        virtual void removeChild(Node* child, bool cleanup) override;
        virtual void removeAllChildrenWithCleanup(bool cleanup) override;
        virtual void reorderChild(Node *child, int zOrder) override;
        virtual void sortAllChildren() override;

        virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override;
        virtual void setOpacityModifyRGB(bool modify) override;
        virtual bool isOpacityModifyRGB(void) const override;
    };
    //
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值