mirror of https://github.com/axmolengine/axmol.git
fixed anchor point issue, removed rect rotated property
This commit is contained in:
parent
0e318dd8dc
commit
5620da1adf
|
@ -105,8 +105,6 @@ void MarchingSquare::marchSquare(int startx, int starty)
|
||||||
int prevy = 0;
|
int prevy = 0;
|
||||||
int curx = startx;
|
int curx = startx;
|
||||||
int cury = starty;
|
int cury = starty;
|
||||||
float halfWidth = width/2.0;
|
|
||||||
float halfHeight = height/2.0;
|
|
||||||
unsigned int count = 0;
|
unsigned int count = 0;
|
||||||
unsigned int totalPixel = width*height;
|
unsigned int totalPixel = width*height;
|
||||||
bool problem = false;
|
bool problem = false;
|
||||||
|
@ -249,8 +247,8 @@ void MarchingSquare::marchSquare(int startx, int starty)
|
||||||
cury += stepy;
|
cury += stepy;
|
||||||
if(stepx == prevx && stepy == prevy)
|
if(stepx == prevx && stepy == prevy)
|
||||||
{
|
{
|
||||||
points.back().x = (float)(curx-halfWidth) / scaleFactor;
|
points.back().x = (float)(curx) / scaleFactor;
|
||||||
points.back().y = (float)(height-cury-halfHeight) / scaleFactor;
|
points.back().y = (float)(height-cury) / scaleFactor;
|
||||||
}
|
}
|
||||||
else if(problem)
|
else if(problem)
|
||||||
{
|
{
|
||||||
|
@ -258,10 +256,10 @@ void MarchingSquare::marchSquare(int startx, int starty)
|
||||||
//TODO: maybe we can detect if we go into a hole and coming back the hole, we should extract those points and remove them
|
//TODO: maybe we can detect if we go into a hole and coming back the hole, we should extract those points and remove them
|
||||||
points.back().x -= 0.00001;
|
points.back().x -= 0.00001;
|
||||||
points.back().y -= 0.00001;
|
points.back().y -= 0.00001;
|
||||||
points.push_back(Vec2((float)curx-halfWidth, (float)height-cury-halfHeight)/ scaleFactor);
|
points.push_back(Vec2((float)curx, (float)height-cury)/ scaleFactor);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
points.push_back(Vec2((float)curx-halfWidth, (float)height-cury-halfHeight)/ scaleFactor);
|
points.push_back(Vec2((float)curx, (float)height-cury)/ scaleFactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
count++;
|
count++;
|
||||||
|
|
|
@ -61,10 +61,10 @@ SpritePolygon *SpritePolygon::create(const std::string& file, std::vector<cocos2
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SpritePolygon *SpritePolygon::create(const std::string& file, std::vector<cocos2d::Vec2>& verts,std::vector<unsigned short>& indices, const cocos2d::Rect& rect, bool rotated)
|
SpritePolygon *SpritePolygon::create(const std::string& file, std::vector<cocos2d::Vec2>& verts,std::vector<unsigned short>& indices, const cocos2d::Rect& rect)
|
||||||
{
|
{
|
||||||
SpritePolygon *ret = new (std::nothrow) SpritePolygon();
|
SpritePolygon *ret = new (std::nothrow) SpritePolygon();
|
||||||
if (ret && ret->initWithRect(file, verts, indices, rect, rotated))
|
if (ret && ret->initWithRect(file, verts, indices, rect))
|
||||||
{
|
{
|
||||||
ret->autorelease();
|
ret->autorelease();
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -75,7 +75,7 @@ SpritePolygon *SpritePolygon::create(const std::string& file, std::vector<cocos2
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SpritePolygon *SpritePolygon::create(const std::string& file, std::vector<cocos2d::Vec2>& verts, const cocos2d::Rect& rect, bool rotated)
|
SpritePolygon *SpritePolygon::create(const std::string& file, std::vector<cocos2d::Vec2>& verts, const cocos2d::Rect& rect)
|
||||||
{
|
{
|
||||||
SpritePolygon *ret = new (std::nothrow) SpritePolygon();
|
SpritePolygon *ret = new (std::nothrow) SpritePolygon();
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -115,7 +115,7 @@ SpritePolygon *SpritePolygon::create(const std::string &file, const cocos2d::Rec
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SpritePolygon::calculateUV()
|
void SpritePolygon::calculateUVandContentSize()
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
whole texture UV coordination
|
whole texture UV coordination
|
||||||
|
@ -142,6 +142,8 @@ void SpritePolygon::calculateUV()
|
||||||
|
|
||||||
// the texture rect in pixels, for example, an image is 32x32 pixels
|
// the texture rect in pixels, for example, an image is 32x32 pixels
|
||||||
Rect* textRect = &_polygonInfo->_rect;
|
Rect* textRect = &_polygonInfo->_rect;
|
||||||
|
|
||||||
|
|
||||||
bool needDelete = false;
|
bool needDelete = false;
|
||||||
if(textRect->equals(Rect::ZERO))
|
if(textRect->equals(Rect::ZERO))
|
||||||
{
|
{
|
||||||
|
@ -149,23 +151,19 @@ void SpritePolygon::calculateUV()
|
||||||
textRect = new Rect(0,0, texWidth, texHeight);
|
textRect = new Rect(0,0, texWidth, texHeight);
|
||||||
needDelete = true;
|
needDelete = true;
|
||||||
}
|
}
|
||||||
|
setContentSize(textRect->size);
|
||||||
|
|
||||||
// find center point of the texture rect, as all vertices refers to this point
|
|
||||||
Vec2 center = Vec2(textRect->size.width/2 + textRect->origin.x, textRect->size.height/2 + textRect->origin.y);
|
|
||||||
|
|
||||||
auto end = &_polygonInfo->_triangles.verts[_polygonInfo->_triangles.vertCount];
|
auto end = &_polygonInfo->_triangles.verts[_polygonInfo->_triangles.vertCount];
|
||||||
for(auto i = _polygonInfo->_triangles.verts; i != end; i++)
|
for(auto i = _polygonInfo->_triangles.verts; i != end; i++)
|
||||||
{
|
{
|
||||||
// for every point, offset with the centerpoint
|
// for every point, offset with the centerpoint
|
||||||
float u = (i->vertices.x + center.x) / texWidth;
|
float u = i->vertices.x / texWidth;
|
||||||
float v = (texHeight - i->vertices.y - center.y) / texHeight;
|
float v = (texHeight - i->vertices.y) / texHeight;
|
||||||
i->texCoords.u = u;
|
i->texCoords.u = u;
|
||||||
i->texCoords.v = v;
|
i->texCoords.v = v;
|
||||||
// CCLOG("%f, %f",u,v);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(needDelete)
|
if(needDelete)
|
||||||
delete textRect;
|
delete textRect;
|
||||||
}
|
}
|
||||||
|
@ -184,16 +182,7 @@ TrianglesCommand::Triangles SpritePolygon::triangulate(std::vector<cocos2d::Vec2
|
||||||
|
|
||||||
vector<V3F_C4B_T2F> *_verts = new vector<V3F_C4B_T2F>();
|
vector<V3F_C4B_T2F> *_verts = new vector<V3F_C4B_T2F>();
|
||||||
vector<unsigned short> *_indices = new vector<unsigned short>;
|
vector<unsigned short> *_indices = new vector<unsigned short>;
|
||||||
auto bb = setContentSizeFromVecs(verts);
|
|
||||||
// auto bb = Rect(_textureRect);
|
|
||||||
// bb.origin.x = -bb.size.width/2;
|
|
||||||
// bb.origin.y = -bb.size.height/2;
|
|
||||||
unsigned short idx = 0;
|
unsigned short idx = 0;
|
||||||
auto texture = _texture;
|
|
||||||
auto textureWidth = (float)texture->getPixelsWide();
|
|
||||||
auto textureHeight = (float)texture->getPixelsHigh();
|
|
||||||
// auto scaledRect = CC_RECT_POINTS_TO_PIXELS(Rect(0,0, bb.size.width, bb.size.height));
|
|
||||||
auto scaledRect =Rect(0,0, bb.size.width, bb.size.height);
|
|
||||||
for(std::vector<p2t::Triangle*>::const_iterator ite = tris.begin(); ite < tris.end(); ite++)
|
for(std::vector<p2t::Triangle*>::const_iterator ite = tris.begin(); ite < tris.end(); ite++)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < 3; i++)
|
for(int i = 0; i < 3; i++)
|
||||||
|
@ -219,16 +208,11 @@ TrianglesCommand::Triangles SpritePolygon::triangulate(std::vector<cocos2d::Vec2
|
||||||
{
|
{
|
||||||
//vert does not exist yet, so we need to create a new one,
|
//vert does not exist yet, so we need to create a new one,
|
||||||
auto c4b = Color4B::WHITE;
|
auto c4b = Color4B::WHITE;
|
||||||
auto u = (scaledRect.origin.x + scaledRect.size.width* (p->x - bb.origin.x)/_contentSize.width)/textureWidth;
|
auto t2f = Tex2F(0,0);
|
||||||
auto v = (scaledRect.origin.y + scaledRect.size.height* (p->y - bb.origin.y)/_contentSize.height)/textureHeight;
|
|
||||||
auto t2f = Tex2F(u,1-v);
|
|
||||||
_verts->push_back(V3F_C4B_T2F{v3,c4b,t2f});
|
_verts->push_back(V3F_C4B_T2F{v3,c4b,t2f});
|
||||||
_indices->push_back(idx);
|
_indices->push_back(idx);
|
||||||
idx++;
|
idx++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(auto j : points)
|
for(auto j : points)
|
||||||
|
@ -257,13 +241,8 @@ bool SpritePolygon::initWithMarching(const std::string &file, const cocos2d::Rec
|
||||||
{
|
{
|
||||||
CCASSERT(file.size()>0, "Invalid filename for sprite");
|
CCASSERT(file.size()>0, "Invalid filename for sprite");
|
||||||
Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(file);
|
Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(file);
|
||||||
if (texture)
|
CCASSERT(texture, "texture was not loaded properly");
|
||||||
{
|
|
||||||
initWithTexture(texture, rect);
|
initWithTexture(texture, rect);
|
||||||
}
|
|
||||||
else{
|
|
||||||
throw "some error";
|
|
||||||
}
|
|
||||||
optimization = (optimization < 0)? (float)texture->getPixelsHigh()*(float)texture->getPixelsWide()*0.00015/Director::getInstance()->getContentScaleFactor() : optimization/Director::getInstance()->getContentScaleFactor();
|
optimization = (optimization < 0)? (float)texture->getPixelsHigh()*(float)texture->getPixelsWide()*0.00015/Director::getInstance()->getContentScaleFactor() : optimization/Director::getInstance()->getContentScaleFactor();
|
||||||
|
|
||||||
//Marching Square
|
//Marching Square
|
||||||
|
@ -271,10 +250,10 @@ bool SpritePolygon::initWithMarching(const std::string &file, const cocos2d::Rec
|
||||||
marcher->trace();
|
marcher->trace();
|
||||||
|
|
||||||
marcher->optimize(optimization);
|
marcher->optimize(optimization);
|
||||||
// marcher->printPoints();
|
|
||||||
auto p = marcher->getPoints();
|
auto p = marcher->getPoints();
|
||||||
auto calculatedRect = setContentSizeFromVecs(p);
|
// auto calculatedRect = setContentSizeFromVecs(p);
|
||||||
auto _textureRect = Rect(rect.origin.x,rect.origin.y,calculatedRect.size.width, calculatedRect.size.height);
|
// auto _textureRect = Rect(rect.origin.x,rect.origin.y,calculatedRect.size.width, calculatedRect.size.height);
|
||||||
auto _triangles = triangulate(p);
|
auto _triangles = triangulate(p);
|
||||||
|
|
||||||
delete marcher;
|
delete marcher;
|
||||||
|
@ -283,20 +262,18 @@ bool SpritePolygon::initWithMarching(const std::string &file, const cocos2d::Rec
|
||||||
//save result to cache
|
//save result to cache
|
||||||
SpritePolygonInfo *info = new SpritePolygonInfo();
|
SpritePolygonInfo *info = new SpritePolygonInfo();
|
||||||
info->_rect = rect;
|
info->_rect = rect;
|
||||||
// info->_vertRect = _textureRect;
|
|
||||||
info->_triangles = _triangles;
|
info->_triangles = _triangles;
|
||||||
_polygonInfo = SpritePolygonCache::getInstance()->addSpritePolygonCache(file, *info);
|
_polygonInfo = SpritePolygonCache::getInstance()->addSpritePolygonCache(file, *info);
|
||||||
calculateUV();
|
calculateUVandContentSize();
|
||||||
// _polygonInfo = info;
|
|
||||||
delete _triangles.verts;
|
delete _triangles.verts;
|
||||||
delete _triangles.indices;
|
delete _triangles.indices;
|
||||||
#if CC_SPRITE_DEBUG_DRAW
|
#if CC_SPRITE_DEBUG_DRAW
|
||||||
debugDraw();
|
debugDraw();
|
||||||
#endif
|
#endif
|
||||||
// SpritePolygonCache::printInfo(*info);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool SpritePolygon::initWithPoly2tri(const std::string &filename, std::vector<cocos2d::Vec2> & verts, const cocos2d::Rect &Rect, bool rotated)
|
bool SpritePolygon::initWithPoly2tri(const std::string &filename, std::vector<cocos2d::Vec2> & verts, const cocos2d::Rect &Rect)
|
||||||
{
|
{
|
||||||
CCASSERT(filename.size()>0, "Invalid filename for sprite");
|
CCASSERT(filename.size()>0, "Invalid filename for sprite");
|
||||||
Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(filename);
|
Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(filename);
|
||||||
|
@ -405,10 +382,9 @@ Rect SpritePolygon::setContentSizeFromVecs(std::vector<cocos2d::Vec2>& verts)
|
||||||
setContentSize(Size(width, height));
|
setContentSize(Size(width, height));
|
||||||
return Rect(left,bot,width,height);
|
return Rect(left,bot,width,height);
|
||||||
}
|
}
|
||||||
bool SpritePolygon::initWithRect(const std::string& filename, std::vector<cocos2d::Vec2>& verts, std::vector<unsigned short>& indices, const cocos2d::Rect& rect, bool rotated)
|
bool SpritePolygon::initWithRect(const std::string& filename, std::vector<cocos2d::Vec2>& verts, std::vector<unsigned short>& indices, const cocos2d::Rect& rect)
|
||||||
{
|
{
|
||||||
CCASSERT(filename.size()>0, "Invalid filename for sprite");
|
CCASSERT(filename.size()>0, "Invalid filename for sprite");
|
||||||
_rectRotated = rotated;
|
|
||||||
Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(filename);
|
Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(filename);
|
||||||
if (texture)
|
if (texture)
|
||||||
{
|
{
|
||||||
|
@ -455,7 +431,7 @@ bool SpritePolygon::initWithTexture(Texture2D *texture, const Rect &rect)
|
||||||
|
|
||||||
setTexture(texture);
|
setTexture(texture);
|
||||||
// _textureRect = (rect.equals(Rect::ZERO))? Rect(0,0,texture->getPixelsWide(), texture->getPixelsHigh()) : rect;
|
// _textureRect = (rect.equals(Rect::ZERO))? Rect(0,0,texture->getPixelsWide(), texture->getPixelsHigh()) : rect;
|
||||||
|
setAnchorPoint(Vec2(0.5,0.5));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,12 +47,12 @@ public:
|
||||||
bool initWithVerts(const std::string&, std::vector<cocos2d::V3F_C4B_T2F>&, std::vector<unsigned short>&);
|
bool initWithVerts(const std::string&, std::vector<cocos2d::V3F_C4B_T2F>&, std::vector<unsigned short>&);
|
||||||
|
|
||||||
//create from list of vertices, with texture rect, and triangle indices, UV is calculated from the texture rect
|
//create from list of vertices, with texture rect, and triangle indices, UV is calculated from the texture rect
|
||||||
static SpritePolygon *create(const std::string&, std::vector<cocos2d::Vec2>&, std::vector<unsigned short>&, const cocos2d::Rect& rect = cocos2d::Rect::ZERO, bool rotated = false);
|
static SpritePolygon *create(const std::string&, std::vector<cocos2d::Vec2>&, std::vector<unsigned short>&, const cocos2d::Rect& rect = cocos2d::Rect::ZERO);
|
||||||
bool initWithRect(const std::string&, std::vector<cocos2d::Vec2>&, std::vector<unsigned short>&, const cocos2d::Rect&, bool);
|
bool initWithRect(const std::string&, std::vector<cocos2d::Vec2>&, std::vector<unsigned short>&, const cocos2d::Rect&);
|
||||||
|
|
||||||
// //create from ordered list of vertices, with texture rect, and rotated property, Triangles and UV is calculated on the fly
|
// //create from ordered list of vertices, with texture rect, Triangles and UV is calculated on the fly
|
||||||
static SpritePolygon *create(const std::string&, std::vector<cocos2d::Vec2>&, const cocos2d::Rect& rect = cocos2d::Rect::ZERO, bool rotated = false);
|
static SpritePolygon *create(const std::string&, std::vector<cocos2d::Vec2>&, const cocos2d::Rect& rect = cocos2d::Rect::ZERO);
|
||||||
bool initWithPoly2tri(const std::string&, std::vector<cocos2d::Vec2>&, const cocos2d::Rect&, bool);
|
bool initWithPoly2tri(const std::string&, std::vector<cocos2d::Vec2>&, const cocos2d::Rect&);
|
||||||
|
|
||||||
//create from a texture (rect), and automatically trace and optimize the points.
|
//create from a texture (rect), and automatically trace and optimize the points.
|
||||||
//not recommended for production, its better to use the vec2 list for better performance
|
//not recommended for production, its better to use the vec2 list for better performance
|
||||||
|
@ -76,10 +76,9 @@ protected:
|
||||||
cocos2d::DrawNode *_debugDrawNode;
|
cocos2d::DrawNode *_debugDrawNode;
|
||||||
void debugDraw();
|
void debugDraw();
|
||||||
|
|
||||||
void calculateUV();
|
void calculateUVandContentSize();
|
||||||
|
|
||||||
bool _triangleDirty; //if triangle is dirty, then it needs to be recalculated from verts and indices
|
bool _triangleDirty; //if triangle is dirty, then it needs to be recalculated from verts and indices
|
||||||
bool _rectRotated;
|
|
||||||
// std::vector<cocos2d::V3F_C4B_T2F> _verts;
|
// std::vector<cocos2d::V3F_C4B_T2F> _verts;
|
||||||
// std::vector<unsigned short> _indices;
|
// std::vector<unsigned short> _indices;
|
||||||
cocos2d::TrianglesCommand _tcmd;
|
cocos2d::TrianglesCommand _tcmd;
|
||||||
|
|
|
@ -152,7 +152,7 @@ void SpritePolygonCache::removeSpritePolygonCache(const std::string& filePath,
|
||||||
auto infoIter = it->second.begin();
|
auto infoIter = it->second.begin();
|
||||||
for (; infoIter != it->second.end(); infoIter++)
|
for (; infoIter != it->second.end(); infoIter++)
|
||||||
{
|
{
|
||||||
|
//TODO: write clean up code...
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -160,7 +160,12 @@ void SpritePolygonCache::removeSpritePolygonCache(const std::string& filePath,
|
||||||
|
|
||||||
void SpritePolygonCache::removeAllSpritePolygonCache()
|
void SpritePolygonCache::removeAllSpritePolygonCache()
|
||||||
{
|
{
|
||||||
|
for (std::unordered_map<std::string, VecSpritePolygonInfo>::iterator it = _SpritePolygonCacheMap.begin(); it != _SpritePolygonCacheMap.end(); ++it)
|
||||||
|
{
|
||||||
|
//TODO: write clean up code...
|
||||||
|
it->second.clear();
|
||||||
|
}
|
||||||
|
_SpritePolygonCacheMap.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SpritePolygonCache::isSpritePolygonCachExist(const std::string& filePath, const cocos2d::Rect& rect)
|
bool SpritePolygonCache::isSpritePolygonCachExist(const std::string& filePath, const cocos2d::Rect& rect)
|
||||||
|
|
|
@ -15,6 +15,7 @@ USING_NS_CC;
|
||||||
SpritePolygonTest::SpritePolygonTest()
|
SpritePolygonTest::SpritePolygonTest()
|
||||||
{
|
{
|
||||||
ADD_TEST_CASE(SpritePolygonTest1);
|
ADD_TEST_CASE(SpritePolygonTest1);
|
||||||
|
ADD_TEST_CASE(SpritePolygonTest2);
|
||||||
}
|
}
|
||||||
void SpritePolygonTestDemo::initDefaultSprite(const std::string &filename, cocos2d::experimental::SpritePolygon * inst)
|
void SpritePolygonTestDemo::initDefaultSprite(const std::string &filename, cocos2d::experimental::SpritePolygon * inst)
|
||||||
{
|
{
|
||||||
|
@ -88,6 +89,16 @@ void SpritePolygonTestDemo::onBackCallback(cocos2d::Ref *sender)
|
||||||
|
|
||||||
SpritePolygonTest1::SpritePolygonTest1()
|
SpritePolygonTest1::SpritePolygonTest1()
|
||||||
{
|
{
|
||||||
|
SpritePolygonCache::getInstance()->removeAllSpritePolygonCache();
|
||||||
|
_title = "SpritePolygon Creation";
|
||||||
|
_subtitle = "SpritePolygon::create(\"Images/grossini.png\")";
|
||||||
|
auto s = experimental::SpritePolygon::create(s_pathGrossini);
|
||||||
|
initDefaultSprite(s_pathGrossini, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
SpritePolygonTest2::SpritePolygonTest2()
|
||||||
|
{
|
||||||
|
SpritePolygonCache::getInstance()->removeAllSpritePolygonCache();
|
||||||
_title = "SpritePolygon Creation";
|
_title = "SpritePolygon Creation";
|
||||||
_subtitle = "SpritePolygon::create(\"Images/grossini.png\")";
|
_subtitle = "SpritePolygon::create(\"Images/grossini.png\")";
|
||||||
auto s = experimental::SpritePolygon::create(s_pathGrossini);
|
auto s = experimental::SpritePolygon::create(s_pathGrossini);
|
||||||
|
|
|
@ -24,7 +24,13 @@ class SpritePolygonTest1 : public SpritePolygonTestDemo
|
||||||
public:
|
public:
|
||||||
CREATE_FUNC(SpritePolygonTest1);
|
CREATE_FUNC(SpritePolygonTest1);
|
||||||
SpritePolygonTest1();
|
SpritePolygonTest1();
|
||||||
|
};
|
||||||
|
|
||||||
|
class SpritePolygonTest2 : public SpritePolygonTestDemo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CREATE_FUNC(SpritePolygonTest2);
|
||||||
|
SpritePolygonTest2();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* defined(__cocos2d_tests__SpritePolygonTest__) */
|
#endif /* defined(__cocos2d_tests__SpritePolygonTest__) */
|
||||||
|
|
Loading…
Reference in New Issue