191 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			191 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | #include "..\easy2d.h"
 | |||
|  | #include "..\EasyX\easyx.h"
 | |||
|  | 
 | |||
|  | BatchNode::BatchNode() | |||
|  | { | |||
|  | } | |||
|  | 
 | |||
|  | 
 | |||
|  | BatchNode::~BatchNode() | |||
|  | { | |||
|  | 	clearAllChildren(); | |||
|  | } | |||
|  | 
 | |||
|  | bool BatchNode::_exec(bool active) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>Ƿ<EFBFBD><C7B7><EFBFBD>ʾ
 | |||
|  | 	if (!m_bDisplay) | |||
|  | 	{ | |||
|  | 		return false; | |||
|  | 	} | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD>
 | |||
|  | 	for (int i = int(m_vChildren.size() - 1); i >= 0; i--) | |||
|  | 	{ | |||
|  | 		if (m_vChildren[i]->_exec(active)) | |||
|  | 		{ | |||
|  | 			active = false; | |||
|  | 		} | |||
|  | 	} | |||
|  | 	// <20><><EFBFBD>ӽڵ<D3BD>ȡ<EFBFBD><C8A1><EFBFBD>˻<EFBFBD><CBBB>潹<EFBFBD>㣬<EFBFBD><E3A3AC><EFBFBD>ýڵ<C3BD>Ҳȡ<D2B2><C8A1><EFBFBD>˽<EFBFBD><CBBD><EFBFBD>
 | |||
|  | 	return !active; | |||
|  | } | |||
|  | 
 | |||
|  | void BatchNode::_onDraw() | |||
|  | { | |||
|  | 	// <20>ڵ<EFBFBD><DAB5>Ƿ<EFBFBD><C7B7><EFBFBD>ʾ
 | |||
|  | 	if (!m_bDisplay) | |||
|  | 	{ | |||
|  | 		return; | |||
|  | 	} | |||
|  | 	 | |||
|  | 	for (auto child : m_vChildren) | |||
|  | 	{ | |||
|  | 		// <20><><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD>
 | |||
|  | 		child->_onDraw(); | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | void BatchNode::add(Node * child, int z_Order) | |||
|  | { | |||
|  | 	if (child == nullptr) return; | |||
|  | 
 | |||
|  | 	// <20><><EFBFBD>ýڵ<C3BD><DAB5>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	child->setParentScene(this->getParentScene()); | |||
|  | 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>е<EFBFBD> z <20><>˳<EFBFBD><CBB3>
 | |||
|  | 	child->setZOrder(z_Order); | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>һ
 | |||
|  | 	child->retain(); | |||
|  | 	// <20><EFBFBD><DEB8>ӽڵ<D3BD>λ<EFBFBD><CEBB>
 | |||
|  | 	child->move(getPos()); | |||
|  | 
 | |||
|  | 	// <20><> z <20><>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
 | |||
|  | 	size_t size = m_vChildren.size(); | |||
|  | 	for (unsigned i = 0; i <= size; i++) | |||
|  | 	{ | |||
|  | 		if (i != size) | |||
|  | 		{ | |||
|  | 			if (z_Order < m_vChildren.at(i)->getZOrder()) | |||
|  | 			{ | |||
|  | 				m_vChildren.insert(m_vChildren.begin() + i, child); | |||
|  | 				break; | |||
|  | 			} | |||
|  | 		} | |||
|  | 		else | |||
|  | 		{ | |||
|  | 			m_vChildren.push_back(child); | |||
|  | 			break; | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | bool BatchNode::del(Node * child) | |||
|  | { | |||
|  | 	if (child == nullptr) return false; | |||
|  | 
 | |||
|  | 	// Ѱ<><D1B0><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>ڵ<EFBFBD>
 | |||
|  | 	std::vector<Node*>::iterator iter; | |||
|  | 	for (iter = m_vChildren.begin(); iter != m_vChildren.end(); iter++) | |||
|  | 	{ | |||
|  | 		// <20>ҵ<EFBFBD><D2B5><EFBFBD>ͬ<EFBFBD>ڵ<EFBFBD>
 | |||
|  | 		if ((*iter) == child) | |||
|  | 		{ | |||
|  | 			// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>һ
 | |||
|  | 			(*iter)->release(); | |||
|  | 			// ȥ<><C8A5><EFBFBD>ýڵ<C3BD>
 | |||
|  | 			m_vChildren.erase(iter); | |||
|  | 			return true; | |||
|  | 		} | |||
|  | 	} | |||
|  | 	return false; | |||
|  | } | |||
|  | 
 | |||
|  | int BatchNode::getCount() | |||
|  | { | |||
|  | 	return (int)m_vChildren.size(); | |||
|  | } | |||
|  | 
 | |||
|  | std::vector<Node*>& BatchNode::getChildren() | |||
|  | { | |||
|  | 	return m_vChildren; | |||
|  | } | |||
|  | 
 | |||
|  | void BatchNode::clearAllChildren() | |||
|  | { | |||
|  | 	// <20><><EFBFBD>нڵ<D0BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>һ
 | |||
|  | 	for (auto child : m_vChildren) | |||
|  | 	{ | |||
|  | 		child->autoRelease(); | |||
|  | 		child->release(); | |||
|  | 	} | |||
|  | 	// <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | |||
|  | 	m_vChildren.clear(); | |||
|  | } | |||
|  | 
 | |||
|  | void BatchNode::setX(int x) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>λ<EFBFBD><CEBB>
 | |||
|  | 	int var = x - getX(); | |||
|  | 	// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD>λ<EFBFBD><CEBB>
 | |||
|  | 	for (auto child : m_vChildren) | |||
|  | 	{ | |||
|  | 		child->move(var, 0); | |||
|  | 	} | |||
|  | 	Node::setX(x); | |||
|  | } | |||
|  | 
 | |||
|  | void BatchNode::setY(int y) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>λ<EFBFBD><CEBB>
 | |||
|  | 	int var = y - getY(); | |||
|  | 	// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD>λ<EFBFBD><CEBB>
 | |||
|  | 	for (auto child : m_vChildren) | |||
|  | 	{ | |||
|  | 		child->move(0, var); | |||
|  | 	} | |||
|  | 	Node::setY(y); | |||
|  | } | |||
|  | 
 | |||
|  | void BatchNode::setPos(int x, int y) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>λ<EFBFBD><CEBB>
 | |||
|  | 	CPoint var(x - getX(), y - getY()); | |||
|  | 	// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD>λ<EFBFBD><CEBB>
 | |||
|  | 	for (auto child : m_vChildren) | |||
|  | 	{ | |||
|  | 		child->move(var); | |||
|  | 	} | |||
|  | 	Node::setPos(x, y); | |||
|  | } | |||
|  | 
 | |||
|  | void BatchNode::setPos(CPoint p) | |||
|  | { | |||
|  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>λ<EFBFBD><CEBB>
 | |||
|  | 	CPoint var(p - getPos()); | |||
|  | 	// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD>λ<EFBFBD><CEBB>
 | |||
|  | 	for (auto child : m_vChildren) | |||
|  | 	{ | |||
|  | 		child->move(var); | |||
|  | 	} | |||
|  | 	Node::setPos(p); | |||
|  | } | |||
|  | 
 | |||
|  | void BatchNode::move(int x, int y) | |||
|  | { | |||
|  | 	// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD>λ<EFBFBD><CEBB>
 | |||
|  | 	for (auto child : m_vChildren) | |||
|  | 	{ | |||
|  | 		child->move(x, y); | |||
|  | 	} | |||
|  | 	Node::move(x, y); | |||
|  | } | |||
|  | 
 | |||
|  | void BatchNode::move(CVector v) | |||
|  | { | |||
|  | 	// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD>λ<EFBFBD><CEBB>
 | |||
|  | 	for (auto child : m_vChildren) | |||
|  | 	{ | |||
|  | 		child->move(v); | |||
|  | 	} | |||
|  | 	Node::move(v); | |||
|  | } |