文章转载 shahdza 的BLOG: http://shahdza.blog.51cto.com/2410787/1550288
与2.x相比,节点类Node的属性和功能做了大幅度的修改与增加。
//
/**
* 位置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;
//
节点的操作有:标记、名字、自定义数据、父节点管理、子节点管理、其他操作管理。
//
/**
* 标记与名字 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& 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 draw() final;
//递归访问所有子节点,并重新绘制
virtual void visit() final;
//返回包含Node(节点)的Scene(场景).
//若不属于任何的场景,它将返回nullptr
virtual Scene* getScene() const;
//返回节点在父节点坐标中的矩形边界框
virtual Rect getBoundingBox() const;
//暂停所有的活动着的动作和调度器
virtual void cleanup();
动作管理:运行、暂停、取消等操作。
//
/**
* 动作管理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; //获取正在运行的动作数量
//
定时器管理,默认定时器、自定义定时器、一次性定时器。
//
/**
* 定时器管理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);
//
//
virtual void enumerateChildren(const std::string &name, std::function 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"
//
//
virtual void setGlobalZOrder(float globalZOrder);
virtual float getGlobalZOrder() const;
//
//
//设置这个节点的局部Z顺序((相对于兄弟节点))
virtual void setLocalZOrder(int localZOrder);
virtual int getLocalZOrder() const;
//
//
/**
* 坐标转换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;
//
//
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;
}
//