需要实现一个类似点击屏幕,进行切换精灵图片的功能。
思路是这样的:
HelloWorldScene.h
class HelloWorld : public cocos2d::Layer
{
protected:
int m_Index; // 精灵帧下标
cocos2d::SpriteFrame* m_Frame; // 精灵帧
cocos2d::Sprite* m_Sprite; // 精灵
public:
static cocos2d::Scene* createScene();
virtual bool init();
void menuCloseCallback(cocos2d::Ref* pSender);
CREATE_FUNC(HelloWorld);
void onTouchesEnded(const std::vector<cocos2d::Touch*>& touches, cocos2d::Event *event);
}
HelloWorldScene.cpp
bool HelloWorld::init()
{
// 前略前略前略前略前略
/////////////////////////////
// 3. add your codes below...
auto listener = EventListenerTouchAllAtOnce::create();
listener->onTouchesEnded = CC_CALLBACK_2(HelloWorld::onTouchesEnded, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
auto image = Director::getInstance()->getTextureCache()->addImage("grossini_dance_atlas.png");
for(int i = 0; i < 4; i++)
{
m_Frame* = SpriteFrame::createWithTexture(image, Rect(85*i, 121, 85, 121));
m_Frame*->retain(); // 加入此行后解决问题
}
m_Index = 0;
m_Sprite = Sprite::createWithSpriteFrame(m_Frame);
m_Sprite->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
m_Sprite->setPosition(visibleSize.width/2, visibleSize.height/2);
addChild(m_Sprite, 1);
log("init: m_Frame:%u", m_Frame->getReferenceCount()); // 打印出 1
return true;
}
void HelloWorld::onTouchesEnded(const std::vector<Touch*>& touches, Event *event)
{
log("ended: m_Frame:%u", m_Frame->getReferenceCount()); // 打印出 0
m_Index++;
if (m_Index == 4)
m_Index = 0;
m_Sprite->setSpriteFrame(m_Frame); // 此处终止
}
**
终止在 CCRef.cpp
void Ref::retain()
{
CCASSERT(_referenceCount > 0, “reference count should greater than 0”); // 此处终止,但并不是这个断言报错,而是(见下文)
++_referenceCount;
报错信息
Unhandled exception at 0x00FA7B02 in MyCppGame.exe: 0xC0000005: Access violation reading location 0x18187157.
我想大概是那个自动释放机制把我的精灵帧给释放了,然后就不懂了,感觉这样很不合理啊,求解惑~
感觉jo1983提供的解决方法
*--- Begin quote from ____*
引用第5楼jo1983于2014-07-29 11:21发表的 :
for(int i = 0; i < 4; i++)
m_Frame* = SpriteFrame::createWithTexture(image, Rect(85*i, 121, 85, 121));
改成
for(int i = 0; i < 4; i++)
....... http://www.cocoachina.com/bbs/job.php?action=topost&tid=217236&pid=1015673

*
*--- End quote*