Node继承于Ref,Ref为内存管理类
Node在cocos2dx中为抽象类,需要渲染的对象都是从Node继承来的,例如:Scene、Layer、LayerColor、Sprite等等。
成员函数:
virtual bool init();
static CCNode * create(void);
创建和初始化接口,create函数会自动调用autorelease
virtual void setZOrder(int zOrder);
virtual void _setZOrder(int z);
virtual int getZOrder();
ZOrder相关设置,ZOrder是指在Z轴方向的顺序,指示对象的覆盖关系,其中_setZOrder只是改变本对象的成员函数,setZOrder除了改变本对象成员,还会调用父节点相关函数改变该对象在父对象中的位置
virtual void setScaleX(float fScaleX);
virtual float getScaleX();
virtual void setScaleY(float fScaleY);
virtual float getScaleY();
virtual void setScale(float scale);
virtual float getScale();
virtual void setScale(float fScaleX,floatfScaleY);
设置获取缩放因子
virtual void setPosition(const CCPoint&position);
virtual const CCPoint& getPosition();
virtual void setPosition(float x, float y);
virtual void getPosition(float* x, float*y);
virtual void setPositionX(float x);
virtual float getPositionX(void);
virtual void setPositionY(float y);
virtual float getPositionY(void);
设置位置,这个位置基于父节点的坐标
virtual void setSkewX(float fSkewX);
virtual float getSkewX();
virtual void setSkewY(float fSkewY);
virtual float getSkewY();
设置翻转
virtual void setAnchorPoint(constCCPoint& anchorPoint);
virtual const CCPoint&getAnchorPoint();
设置锚点,锚点是指设置点相对于自己的坐标点,这里anchorPoint是一个比例值,默认一般(0.5,0.5);(0.5,0.5)为Node中心点,(0,0)为Node左下角,(1,1)为Node右上角
virtual void setContentSize(constCCSize& contentSize);
virtual const CCSize& getContentSize()const;
设置未转换的节点尺寸,所有的node都有尺寸,Scene和Layer的尺寸与屏幕相同
virtual void setVisible(bool visible);
virtual bool isVisible();
设置是否显示
virtual void setRotation(float fRotation);
virtual float getRotation();
virtual void setRotationX(float fRotaionX);
virtual float getRotationX();
virtual void setRotationY(floatfRotationY);
virtual float getRotationY();
设置旋转角度
virtual void setOrderOfArrival(unsigned intuOrderOfArrival);
virtual unsigned int getOrderOfArrival();
设置arrival order,当两个node有相同的zorder时,按照arrival order次序来绘画
virtual void addChild(CCNode * child);
virtual void addChild(CCNode * child, intzOrder);
virtual void addChild(CCNode* child, intzOrder, int tag);
增加子节点,可以在增加子节点时,设定zOrder和tag
virtual Node * getChildByTag(int tag)
virtual Node* getChildByName(conststd::string& name) const
inline T getChildByName(const std::string&name)
virtual Vector<Node*>&getChildren()
virtual ssize_t getChildrenCount() const;
获取子节点
virtual void cleanup(void);
停止所有的schedule和actions
virtual void draw(void);
绘制node
virtual void visit(void);
访问所有子节点
virtual void setScheduler(CCScheduler*scheduler);
virtual CCScheduler* getScheduler();
设置调度器
bool isScheduled(SEL_SCHEDULE selector);
检查函数selector是否被调度
void scheduleUpdate(void);
调度update函数
void scheduleUpdateWithPriority(intpriority);
有优先级的调度,priority越小,越先被调度
void unscheduleUpdate(void);
取消调度
void schedule(SEL_SCHEDULE selector, floatinterval, unsigned int repeat, float delay);
void schedule(SEL_SCHEDULE selector, floatinterval);
void scheduleOnce(SEL_SCHEDULE selector,float delay);
void schedule(SEL_SCHEDULE selector);
void unschedule(SEL_SCHEDULE selector);
void unscheduleAllSelectors(void);
定时调度,delay是多少时间后,interval是两次调度之间间隔多少时间,repeat是重复次数
void resumeSchedulerAndActions(void);
void pauseSchedulerAndActions(void);
调度的暂停和继续
所有的Node实例(包括子类实例)存储方式为树状
Vector<Node*>_children; 存储子节点,子节点使用Z值排序
Node *_parent; 指向父节点
void Node::addChildHelper(Node* child, intlocalZOrder, int tag, const std::string &name, bool setTag) {
if (_children.empty()){
this->childrenAlloc();
}
this->insertChild(child, localZOrder);
if (setTag)
child->setTag(tag);
else
child->setName(name);
child->setParent(this);
child->setOrderOfArrival(s_globalOrderOfArrival++);
………………..
if( _running ) {
child->onEnter();
if (_isTransitionFinished) {
child->onEnterTransitionDidFinish();
}
}
if (_cascadeColorEnabled) {
updateCascadeColor();
}
if (_cascadeOpacityEnabled) {
updateCascadeOpacity();
}
}
this->childrenAlloc()若该节点子节点为空,则申请存储子节点空间;this->insertChild(child, localZOrder)将子节点按照ZOrder顺序插入子节点列表中;
child->setOrderOfArrival(s_globalOrderOfArrival++)设置Arrival值,若ZOrder值相同的兄弟节点,则按照Arrival大小渲染;
void Director::drawScene()
{
calculateDeltaTime();
if(_deltaTime < FLT_EPSILON) {
return;
}
if (_openGLView) {
_openGLView->pollInputEvents();
}
if (! _paused){
_scheduler->update(_deltaTime);
_eventDispatcher->dispatchEvent(_eventAfterUpdate);
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (_nextScene) {
setNextScene();
}
pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
if (_runningScene) {
_runningScene->visit(_renderer, Mat4::IDENTITY, false);
_eventDispatcher->dispatchEvent(_eventAfterVisit);
}
if (_notificationNode) {
_notificationNode->visit(_renderer, Mat4::IDENTITY, false);
}
if (_displayStats) {
showStats();
}
_renderer->render();
_eventDispatcher->dispatchEvent(_eventAfterDraw);
popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
_totalFrames++;
if (_openGLView) {
_openGLView->swapBuffers();
}
if (_displayStats) {
calculateMPF();
}
}
calculateDeltaTime()计算此帧和上一帧之间相差的时间,_deltaTime < FLT_EPSILON若两帧相差时间小于设定帧数,则退出,确保渲染游戏帧数不大于游戏设定帧数;
_scheduler->update(_deltaTime)调度设定的update方法,_eventDispatcher->dispatchEvent()为广播eventAfterUpdate事件;
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT)使用OpenGL中glClear函数清除颜色缓冲区&深度缓冲区,即将游戏背景画面设为设定颜色;
if (_nextScene) setNextScene();如果_nextScene不为空,则将_nextScene设置为当前渲染Scene _runningScene
pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW)模型视图举证压入栈;
_runningScene->visit(_renderer, Mat4::IDENTITY,false);遍历当前Scene所有子节点,孙节点……
_eventDispatcher->dispatchEvent(_eventAfterVisit)广播eventAfterVisit事件
_notificationNode->visit(_renderer,Mat4::IDENTITY, false)若果存在悬浮渲染树,遍历悬浮渲染树中所有子节点,孙节点…..
_eventDispatcher->dispatchEvent(_eventAfterDraw)广播eventAfterDraw事件
popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW)模型视图举证弹出栈
if (_openGLView) _openGLView->swapBuffers();交换OpenGL缓冲区,为了让图形渲染显示效果,OpenGL采用两渲染缓冲区,正在渲染缓冲区会在后台渲染,渲染完成后会和当前显示缓冲区交换。
void Node::visit(Renderer* renderer, constMat4 &parentTransform, uint32_t parentFlags){
if (!_visible) {
return;
}
uint32_t flags = processParentFlags(parentTransform, parentFlags);
Director* director = Director::getInstance();
director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW,_modelViewTransform);
int i = 0;
if(!_children.empty()){
sortAllChildren();
for( ; i < _children.size(); i++ ) {
auto node = _children.at(i);
if ( node && node->_localZOrder < 0 )
node->visit(renderer,_modelViewTransform, flags);
else
break;
}
this->draw(renderer, _modelViewTransform, flags);
for(auto it=_children.cbegin()+i; it != _children.cend(); ++it)
(*it)->visit(renderer, _modelViewTransform, flags);
}else{
this->draw(renderer, _modelViewTransform, flags);
}
director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
}
director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW,_modelViewTransform);将模型视图矩阵压入堆栈,加载模型视图矩阵;
node->visit(renderer,_modelViewTransform, flags);遍历Node所有子节点;
director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW)将模型视图矩阵弹出堆栈
this->draw(renderer,_modelViewTransform, flags)是具体渲染图元,在自定义图元中必须实现该方法,该方法为图元的具体渲染过程。