175 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			175 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| 
								 | 
							
								#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>
							 | 
						|||
| 
								 | 
							
									App::setOrigin(App::getOriginX() + getX(), App::getOriginY() + getY());
							 | 
						|||
| 
								 | 
							
									for (auto sprite : m_vSprites)
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										sprite->_onDraw();
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
									App::setOrigin(App::getOriginX() - getX(), App::getOriginY() - getY());
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								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;
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								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);
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								}
							 |