C++ Cocos2d-x和触摸事件的处理

C++ Cocos2d-x和触摸事件的处理,c++,cocos2d-iphone,cocos2d-x,multi-touch,C++,Cocos2d Iphone,Cocos2d X,Multi Touch,我有我的精灵在屏幕上,我有一个存储每个精灵的向量 CCSprite*能处理触摸事件吗?还是仅仅是CCLayer* 决定触摸了什么雪碧的最佳方法是什么?我是否应该存储精灵在精灵类中的位置坐标,当我获取事件时,通过查看向量并获取每个精灵的当前坐标,查看用户触摸的位置是否是精灵所在的位置? 更新:I子类CCSprite: 类字段:public cocos2d::CCSprite,public cocos2d::CCTargetedTouchDelegate 我执行以下功能: cocos2d::

我有我的精灵在屏幕上,我有一个存储每个精灵的向量

CCSprite*能处理触摸事件吗?还是仅仅是CCLayer*

决定触摸了什么雪碧的最佳方法是什么?我是否应该存储精灵在精灵类中的位置坐标,当我获取事件时,通过查看向量并获取每个精灵的当前坐标,查看用户触摸的位置是否是精灵所在的位置? 更新:I子类CCSprite:

类字段:public cocos2d::CCSprite,public cocos2d::CCTargetedTouchDelegate

我执行以下功能:

    cocos2d::CCRect rect();

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

    bool containsTouchLocation(cocos2d::CCTouch* touch);
    virtual bool ccTouchBegan(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);
    virtual void ccTouchMoved(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);
    virtual void ccTouchEnded(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);

    virtual void touchDelegateRetain();
    virtual void touchDelegateRelease();
我把CCLOG语句放在每一条语句中,我不点击它们

当我触摸CCLayer时,这个精灵是打开的,尽管我确实点击了实现该层的类中的那些精灵,并将这些精灵放在该层上

更新:我一直在尝试的代码:

Field* Field::createWithLocation(cocos2d::CCPoint p)
{
    Field* f = new Field();
    f->autorelease();
    f->initWithLocation(p);
    return f;
}

void Field::initWithLocation(cocos2d::CCPoint p)
{
    setFieldCenterPoint(p);
    setFieldGraphicName(FIELD::fieldIconFileName);

    setFieldSprite(cocos2d::CCSprite::create(getFieldGraphicName().c_str()));
    getFieldSprite()->setPosition(ccp(getFieldCenterPoint().x, getFieldCenterPoint().y));

    setFieldSize(getFieldSprite()->getContentSize());
}

cocos2d::CCRect Field::rect()
{
    cocos2d::CCSize s = getFieldSprite()->getTexture()->getContentSize();
    return cocos2d::CCRectMake(-s.width / 2, -s.height / 2, s.width, s.height);
}

void Field::onEnter()
{
    CCLOG("In onEnter");
    cocos2d::CCDirector* pDirector = cocos2d::CCDirector::sharedDirector();
    pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
    //_dir->Instance()->getDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
    cocos2d::CCSprite::onEnter();
}

void Field::onExit()
{
    CCLOG("In onExit");
    cocos2d::CCDirector* pDirector = cocos2d::CCDirector::sharedDirector();
    pDirector->getTouchDispatcher()->removeDelegate(this);
    //_dir->Instance()->getDirector()->getTouchDispatcher()->removeDelegate(this);
    cocos2d::CCSprite::onExit();
}

bool Field::containsTouchLocation(cocos2d::CCTouch* touch)
{
    return rect().containsPoint(convertTouchToNodeSpaceAR(touch));
}

bool Field::ccTouchBegan(cocos2d::CCTouch* touch, cocos2d::CCEvent* event)
{
    CCLOG("In ccTouchBegan");

    return true;
}

void Field::ccTouchMoved(cocos2d::CCTouch* touch, cocos2d::CCEvent* event)
{
    CCLOG("In ccTouchMoved");
}

void Field::ccTouchEnded(cocos2d::CCTouch* touch, cocos2d::CCEvent* event)
{
     CCLOG("In ccTouchEnded");
}

void Field::touchDelegateRetain()
{
    this->retain();
}

void Field::touchDelegateRelease()
{
    this->release();
}

我以前回答过这个问题


请转到查找详细信息。

我想我已经在做所有这些了。让我仔细看一下你先前的回答。我确实发现,如果我甚至在我的图层上捕捉到触感,并通过我的向量运行,那么我就可以让它工作。我只是想让每个精灵自己负责。@你错过了CCDirector::sharedDirector->getTouchDispatcher->AddTargetedElegatethis,0,true;在一内。如果您没有在TouchDispatcher上注册精灵,您的精灵如何获得触摸?别忘了注销onExit@Jason注册过程就像有人说嗨,Jason,如果系统发生触摸事件,请把它传给我,不要给任何人。我有你上面提到的getTouchDispatcher线路onEnter@Jason您能为您的Field类发布创建函数的代码吗?您在哪里创建并使用了Field对象?并确保您设置的AddTargetedElegatethis,INT_MIN,true priority高于任何其他对象。@m.ding,我已经尝试了您给出的链接中提到的解决方案,但在我的情况下它没有用。@Rv15-您在细分什么?