| 
									
										
										
										
											2017-09-27 17:56:28 +08:00
										 |  |  |  | #include "..\easy2d.h"
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | BatchSprite::BatchSprite() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | BatchSprite::~BatchSprite() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void BatchSprite::addSprite(Sprite * sprite, int z_Order) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	if (sprite == nullptr) return; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD>ýڵ<C3BD><DAB5>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 	sprite->setParentScene(this->getParentScene()); | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>е<EFBFBD> z <20><>˳<EFBFBD><CBB3>
 | 
					
						
							|  |  |  |  | 	sprite->setZOrder(z_Order); | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>һ
 | 
					
						
							|  |  |  |  | 	sprite->retain(); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// <20><> z <20><>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
 | 
					
						
							|  |  |  |  | 	size_t size = m_vSprites.size(); | 
					
						
							|  |  |  |  | 	for (unsigned i = 0; i <= size; i++) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		if (i != size) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			if (z_Order < m_vSprites.at(i)->getZOrder()) | 
					
						
							|  |  |  |  | 			{ | 
					
						
							|  |  |  |  | 				m_vSprites.insert(m_vSprites.begin() + i, sprite); | 
					
						
							|  |  |  |  | 				break; | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 		else | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			m_vSprites.push_back(sprite); | 
					
						
							|  |  |  |  | 			break; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | bool BatchSprite::delSprite(Sprite * sprite) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	if (sprite == nullptr) return false; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// Ѱ<><D1B0><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>ڵ<EFBFBD>
 | 
					
						
							|  |  |  |  | 	std::vector<Sprite*>::iterator iter; | 
					
						
							|  |  |  |  | 	for (iter = m_vSprites.begin(); iter != m_vSprites.end(); iter++) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		// <20>ҵ<EFBFBD><D2B5><EFBFBD>ͬ<EFBFBD>ڵ<EFBFBD>
 | 
					
						
							|  |  |  |  | 		if ((*iter) == sprite) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>һ
 | 
					
						
							|  |  |  |  | 			(*iter)->release(); | 
					
						
							|  |  |  |  | 			// ȥ<><C8A5><EFBFBD>ýڵ<C3BD>
 | 
					
						
							|  |  |  |  | 			m_vSprites.erase(iter); | 
					
						
							|  |  |  |  | 			return true; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	return false; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void BatchSprite::clearAllSprites() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD>нڵ<D0BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD>һ
 | 
					
						
							|  |  |  |  | 	for (auto s : m_vSprites) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		s->release(); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
					
						
							|  |  |  |  | 	m_vSprites.clear(); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | bool BatchSprite::_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_vSprites.size() - 1); i >= 0; i--) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		if (m_vSprites[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 BatchSprite::_onDraw() | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	// <20>ڵ<EFBFBD><DAB5>Ƿ<EFBFBD><C7B7><EFBFBD>ʾ
 | 
					
						
							|  |  |  |  | 	if (!m_bDisplay) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		return; | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ӽڵ<D3BD>
 | 
					
						
							|  |  |  |  | 	for (auto sprite : m_vSprites) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2017-10-09 01:16:08 +08:00
										 |  |  |  | 		// <20><><EFBFBD>ӽڵ<D3BD><DAB5>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
 | 
					
						
							|  |  |  |  | 		sprite->move(getX(), getY()); | 
					
						
							|  |  |  |  | 		// <20><><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD>
 | 
					
						
							| 
									
										
										
										
											2017-09-27 17:56:28 +08:00
										 |  |  |  | 		sprite->_onDraw(); | 
					
						
							| 
									
										
										
										
											2017-10-09 01:16:08 +08:00
										 |  |  |  | 		// <20><><EFBFBD>ӽڵ<D3BD><DAB5>ƻ<EFBFBD>ԭλ
 | 
					
						
							|  |  |  |  | 		sprite->move(-getX(), -getY()); | 
					
						
							| 
									
										
										
										
											2017-09-27 17:56:28 +08:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Sprite * BatchSprite::isCollisionWith(Sprite * sprite) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	for (int i = int(m_vSprites.size() - 1); i >= 0; i--) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		if (m_vSprites[i]->isCollisionWith(sprite)) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			return m_vSprites[i]; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	return nullptr; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | Sprite * BatchSprite::isPointIn(CPoint point) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	for (int i = int(m_vSprites.size() - 1); i >= 0; i--) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		if (m_vSprites[i]->isPointIn(point)) | 
					
						
							|  |  |  |  | 		{ | 
					
						
							|  |  |  |  | 			return m_vSprites[i]; | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	return nullptr; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-08 12:39:07 +08:00
										 |  |  |  | void BatchSprite::addAction(Action * action) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	Sprite::addAction(action); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-27 17:56:28 +08:00
										 |  |  |  | float BatchSprite::getScaleX() const | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	return m_fScaleX; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | float BatchSprite::getScaleY() const | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	return m_fScaleY; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | float BatchSprite::getOpacity() const | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	return m_nAlpha / 255.0f; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void BatchSprite::setScale(float scaleX, float scaleY) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	m_fScaleX = scaleX; | 
					
						
							|  |  |  |  | 	m_fScaleY = scaleY; | 
					
						
							|  |  |  |  | 	for (auto s : m_vSprites) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		s->setScale(scaleX, scaleY); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void BatchSprite::setOpacity(float opacity) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	m_nAlpha = BYTE(min(max(opacity, 0), 1) * 255); | 
					
						
							|  |  |  |  | 	for (auto s : m_vSprites) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		s->setOpacity(opacity); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void BatchSprite::setImage(Image * image) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	for (auto s : m_vSprites) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		s->setImage(image); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-10-09 10:28:52 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | void BatchSprite::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 s : m_vSprites) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		s->move(var, 0); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	RectNode::setX(x); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void BatchSprite::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 s : m_vSprites) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		s->move(0, var); | 
					
						
							|  |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-10-09 10:42:20 +08:00
										 |  |  |  | 	RectNode::setY(y); | 
					
						
							| 
									
										
										
										
											2017-10-09 10:28:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void BatchSprite::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 s : m_vSprites) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		s->move(var); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	RectNode::setPos(x, y); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void BatchSprite::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 s : m_vSprites) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		s->move(var); | 
					
						
							|  |  |  |  | 	} | 
					
						
							|  |  |  |  | 	RectNode::setPos(p); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void BatchSprite::move(int x, int y) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD>λ<EFBFBD><CEBB>
 | 
					
						
							|  |  |  |  | 	for (auto s : m_vSprites) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		s->move(x, y); | 
					
						
							|  |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-10-09 10:42:20 +08:00
										 |  |  |  | 	RectNode::move(x, y); | 
					
						
							| 
									
										
										
										
											2017-10-09 10:28:52 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void BatchSprite::move(CVector v) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	// <20>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD>λ<EFBFBD><CEBB>
 | 
					
						
							|  |  |  |  | 	for (auto s : m_vSprites) | 
					
						
							|  |  |  |  | 	{ | 
					
						
							|  |  |  |  | 		s->move(v); | 
					
						
							|  |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-10-09 10:42:20 +08:00
										 |  |  |  | 	RectNode::move(v); | 
					
						
							| 
									
										
										
										
											2017-10-09 10:28:52 +08:00
										 |  |  |  | } |