Cocos2dx引擎4-Node系统

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)是具体渲染图元,在自定义图元中必须实现该方法,该方法为图元的具体渲染过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值