An autoscale sprite

patch of CCSprite: Header
@
virtual void setUnFlippedOffsetPositionFromCenter(const CCPoint& ptPoint);@

source:

void CCSprite::setDisplayFrame(CCSpriteFrame *pNewFrame) { this->setUnFlippedOffsetPositionFromCenter(pNewFrame->getOffset());
CCTexture2D **pNewTexture = pNewFrame~~>getTexture;
// update texture before updating texture rect
if
{
setTexture;
}
// update rect
m_bRectRotated = pNewFrame~~>isRotated;
setTextureRect, m_bRectRotated, pNewFrame~~>getOriginalSize);
this~~>setColorRect);
}
void CCSprite::setUnFlippedOffsetPositionFromCenter
{
m_obUnflippedOffsetPositionFromCenter = ptPoint;
}

Header
class CC_DLL CCScaleSprite : public CCSprite
{
public:
CCScaleSprite;
CCScaleSprite;
virtual ~CCScaleSprite;
sourcecode:
float CCScaleSprite::s_BaseResScaleWithSD = 1.0f;
CCScaleSprite::CCScaleSprite
{
m_fScale = CC_CONTENT_SCALE_FACTOR / s_AllScale;
}
CCScaleSprite::CCScaleSprite
{
m_fScale = fScale;
}

void CCScaleSprite::setContentSize
{
CCSize s = size;
s.width**= m_fScale;
s.height **= m_fScale;
CCSprite::setContentSize;
}

void CCScaleSprite::setVertexRect
{
CCRect rectNew = rect;
rectNew.origin.x**= m_fScale;
rectNew.origin.y = m_fScale;
rectNew.size.width
= m_fScale;
rectNew.size.height = m_fScale;
CCSprite::setVertexRect;
}
void CCScaleSprite::setTextureCoords
{
CCRect rectNew = rect;
//rectNew.origin.x
= m_fScale;
//rectNew.origin.y = m_fScale;
//rectNew.size.width
= m_fScale;
//rectNew.size.height **= m_fScale;
CCSprite::setTextureCoords;
}

CCScaleSprite** CCScaleSprite::createWithTexture( CCTexture2D pTexture )
{
CCScaleSprite
pSprite = new CCScaleSprite();
if (pSprite && pSprite~~>initWithTexture)
{
pSprite~~>autorelease();
return pSprite;
}
return NULL;
}

CCScaleSprite* CCScaleSprite::createWithTexture( CCTexture2D pTexture, const CCRect& rect )
{
CCScaleSprite
pSprite = new CCScaleSprite();
if (pSprite && pSprite~~>initWithTexture)
{
pSprite~~>autorelease();
return pSprite;
}
return NULL;
}

CCScaleSprite* CCScaleSprite::createWithSpriteFrame( CCSpriteFrame pSpriteFrame )
{
CCScaleSprite
pSprite = new CCScaleSprite();
if (pSprite && pSprite~~>initWithSpriteFrame)
{
pSprite~~>autorelease();
return pSprite;
}
return NULL;
}

CCScaleSprite* CCScaleSprite::createWithSpriteFrameName( const char pszSpriteFrameName )
{
CCScaleSprite
pSprite = new CCScaleSprite();
if (pSprite && pSprite~~>initWithSpriteFrameName)
{
pSprite~~>autorelease();
return pSprite;
}
return NULL;
}

CCScaleSprite* CCScaleSprite::create( const char pszFileName )
{
CCScaleSprite
pSprite = new CCScaleSprite();
if (pSprite && pSprite~~>initWithFile)
{
pSprite~~>autorelease();
return pSprite;
}
return NULL;
}

CCScaleSprite* CCScaleSprite::create( const char pszFileName, const CCRect& rect )
{
CCScaleSprite
pSprite = new CCScaleSprite();
if (pSprite && pSprite~~>initWithFile)
{
pSprite~~>autorelease();
return pSprite;
}
return NULL;
}

CCScaleSprite* CCScaleSprite::create()
{
CCScaleSprite* pSprite = new CCScaleSprite();
if (pSprite && pSprite~~>init)
{
pSprite~~>autorelease();
return pSprite;
}
return NULL;
}

void CCScaleSprite::setUnFlippedOffsetPositionFromCenter( const CCPoint& ptPoint )
{
CCPoint ptNew = ptPoint;
ptNew.x = m_fScale;
ptNew.y
= m_fScale;

CCSprite::setUnFlippedOffsetPositionFromCenter(ptNew);
}

s_BaseResScaleWithSD means your resource true Resolution with sd Resolution. iphone4 is 2.0f and 3gs is 1.0f and so on.
so if your DesignResolution is 480*320, and you only have retina resources, you can just set this value to 2.0f.

you can also use like this:
CCScaleSprite* spr = new CCScaleSprite(trueScaleOfTheRes);
spr->initxxxx() // like the normal sprite;

thx for sharing