UI都是树状形式组织。
每一个小的控件就是一个小的节点。
同时,为了表示父子节点的关系需要保存一个父节点。
最简单的形式是这样的:
#include <vector>class Node { Node *_parent;// 父节点指针 std::vector<Node*> _children;// 子节点指针};因为子节点的个数是不确定的,因为需要用一个vector来保存子节点。
当然除了这两个最重要的信息之外,还有一些其他的属性也很重要,比人zOrder,tag和name等。
在demo7的基础上,添加Node.h头文件,代码如下:
#ifndef __NODE_H__#define __NODE_H__#include "Ref.h"#include <vector>class Node: Ref { public: static const int INVALID_TAG = -1; static Node* create(); Node(); virtual ~Node(); virtual bool init(); virtual voID setTag(int tag); virtual int getTag() const; virtual const std::string& getname() const; virtual voID setname(const std::string& 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,const std::string &name); virtual Node* getParent(); protected: voID childrenAlloc(voID); voID insertChild(Node* child,int z); voID setParent(Node * parent); Node *_parent; std::vector<Node*> _children;//所有子节点集合 int _localZOrder;// z轴 int _tag;// node标记 std::string _name;// node名字 private: voID addChildHelper(Node* child,int tag,const std::string &name,bool setTag);};Node::Node(): _parent(NulL),_localZOrder(0),_tag(INVALID_TAG),_name(""){}Node::~Node() {}Node* Node::create() { Node* ret = new Node(); if (ret && ret->init()) { ret->autorelease(); } else { if (ret != NulL) { delete ret; ret = NulL; } } return ret;}bool Node::init() { return true;}voID Node::childrenAlloc() { _children.reserve(4);}voID Node::insertChild(Node* child,int z) { _children.push_back(child); child->_localZOrder = z;}voID Node::setParent(Node * parent) { _parent = parent;}Node* Node::getParent() { return _parent; }voID Node::setTag(int tag) { _tag = tag ;}int Node::getTag() const { return _tag;}voID Node::setname(const std::string& name) { _name = name;}const std::string& Node::getname() const { return _name;}voID Node::addChild(Node *child,int zOrder) { this->addChild(child,zOrder,child->_name);}voID Node::addChild(Node *child) { addChild(child,child->_localZOrder,child->_name);}voID Node::addChild(Node *child,int tag) { addChildHelper(child,localZOrder,tag,"",true);}voID Node::addChild(Node* child,const std::string &name) { addChildHelper(child,INVALID_TAG,name,false);}voID Node::addChildHelper(Node* child,bool setTag) { if (_children.empty()) { childrenAlloc(); } insertChild(child,localZOrder); child->setParent(this); if (setTag) { child->setTag(tag); } else { child->setname(name); }}#endif
添加了一些对这些属性 *** 作的方法,并让Node继承自Ref。
修改AppDelegate.h文件如下:
#ifndef __APP_DELEGATE_H__#define __APP_DELEGATE_H__#include "Application.h"#include "Director.h"#include "GLVIEw.h"#include "GLVIEwImpl.h"#include "Geometry.h"#include "Node.h"#include <iostream>class AppDelegate: private Application { public: virtual bool applicationDIDFinishLaunching(); };bool AppDelegate::applicationDIDFinishLaunching() { Director* director = Director::getInstance(); GLVIEw* glvIEw = director->getopenGLVIEw(); if (!glvIEw) { glvIEw = GLVIEwImpl::createWithRect("Winname",Rect(0,960,640)); director->setopenGLVIEw(glvIEw); } Node* node = Node::create(); node->setname("parent"); Node* lnode = Node::create(); lnode->setname("child"); node->addChild(lnode); std::cout << lnode->getParent()->getname() << std::endl; std::cout << lnode->getname() << std::endl; return true;}#endif
在AppDelegate中,对我们前面写的Node类进行了一个简单的测试。
代码
总结以上是内存溢出为你收集整理的自己动手写cocos2dx游戏引擎(八)——Node节点全部内容,希望文章能够帮你解决自己动手写cocos2dx游戏引擎(八)——Node节点所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)