【已解决】触摸事件出现未知异常

各位大神,我参照公开课第26集中写了触摸事件的代码,但是出现了下面错误:

错误出现在CCobject.cpp中的CCAssert(m_uReference > 0, “reference count should greater than 0”);

主程序MyScene.cpp中的CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true);

MyScene.cpp中设置触摸事件的代码如下


void MyScene::onEnter(){
    CCLayer::onEnter();
    //注册触摸事件
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true);
    //参数3是否继续低优先级操作
}
 
void MyScene::onExit(){
    CCLayer::onExit();
    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
}
 
bool MyScene::ccTouchBegan(CCTouch *pTouch, CCEvent *event){
    CCLOG("touchbegan");
 
    return true;//true表示还响应后面的其他响应函数,false不响应后面的操作
}
void MyScene::ccTouchMoved(CCTouch *pTouch, CCEvent *event){
    CCLOG("touchmoved");
}
void MyScene::ccTouchEnded(CCTouch *pTouch, CCEvent *event){
    CCLOG("touchended");
}
void MyScene::ccTouchCancelled(CCTouch *pTouch, CCEvent *event){
    CCLOG("touchended");
}

MyScene.h中声明函数如下:

virtual void onEnter();
virtual void onExit();
 
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *event);//第一次碰到屏幕时响应
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *event);//滑动操作
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *event);//离开屏幕
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *event);//取消操作

代码没啥问题。你的异常是某个变量被重复释放导致计数<0。

不过我把其他代码删了,就保留了这些代码和scene()还有init()怎么还是这个错误。。init里面只有一个return true
这是scene的代码

CCScene* MyScene::scene(){
    // 'scene' is an autorelease object
    CCScene *scene = CCScene::create();

    // 'layer' is an autorelease object
    MyScene *layer = MyScene::create();

    // add layer as a child to scene
    scene->addChild(layer);
    // return the scene
    return scene;
}

到底是哪里重复释放了= =不懂。。。。

这段代码也没问题。

把这个类贴出来或者发我邮箱:Geek.Jacky@Gmail.com

MyScene.h

#pragma once
#include "cocos2d.h"

using namespace cocos2d;


class MyScene : CCLayer
{
public:
    MyScene(void);
    ~MyScene(void);
    static CCScene* scene();
    virtual bool init();

    virtual void onEnter();
    virtual void onExit();

    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *event);//第一次碰到屏幕时响应
    virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *event);//滑动操作
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *event);//离开屏幕
    virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *event);//取消操作

    CREATE_FUNC(MyScene);
};


MyScene.cpp

#include "MyScene.h"
MyScene::MyScene(void)
{
}


MyScene::~MyScene(void)
{
}

CCScene* MyScene::scene(){
    // 'scene' is an autorelease object
    CCScene *scene = CCScene::create();

    // 'layer' is an autorelease object
    MyScene *layer = MyScene::create();

    // add layer as a child to scene
    scene->addChild(layer);
    // return the scene
    return scene;
}

bool MyScene::init(){

    return true;
}

void MyScene::onEnter(){
    CCLayer::onEnter();
    //注册触摸事件
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true);
    //参数3是否继续低优先级操作
}

void MyScene::onExit(){
    CCLayer::onExit();
    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
}

bool MyScene::ccTouchBegan(CCTouch *pTouch, CCEvent *event){
    CCLOG("touchbegan");

    return true;//true表示还响应后面的其他响应函数,false不响应后面的操作
}
void MyScene::ccTouchMoved(CCTouch *pTouch, CCEvent *event){
    CCLOG("touchmoved");
}
void MyScene::ccTouchEnded(CCTouch *pTouch, CCEvent *event){
    CCLOG("touchended");
}
void MyScene::ccTouchCancelled(CCTouch *pTouch, CCEvent *event){
    CCLOG("touchended");
}

谢谢了!!

:12::12::12:之前没注意看。。。放到我的项目中,才发现一堆问题啊。。。

1.public继承

2.setTouchEnabled没写

3.注册触摸要在registerWithTouchDispatcher进行。

4.onExit调用顺序错误

5.init没有调父类的init初始化

改完的已经发mail给你了。。。

初学的话建议用3.x版本。

太感谢了!没想到这么多错误。。还是要好好学呢。。
请问学3.x版本有没有什么比较好的网络教程?

论坛就有很多中文教程啊。可以点击导航栏的教程分享。

官方也有英文教程:http://www.cocos2d-x.org/wiki