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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-10-09 14:35:29 +08:00
|
|
|
|
int BatchSprite::getCount()
|
|
|
|
|
|
{
|
|
|
|
|
|
return (int)m_vSprites.size();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<Sprite*>& BatchSprite::getChildren()
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_vSprites;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2017-09-27 17:56:28 +08:00
|
|
|
|
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
|
|
|
|
}
|