cocos2d спрайт подкласса для обработки касания?

Я новичок в мире cocos2d(-x).

Я хотел бы обнаружить прикосновение к спрайту, и учебники/примеры, похоже, предлагают использовать слой для обнаружения прикосновения и поиска подходящего спрайта с ограничивающей рамкой.

Является ли создание подкласса спрайта для обнаружения касания плохой идеей?


person eugene    schedule 06.07.2012    source источник


Ответы (4)


лучше и намного понятнее обрабатывать касания в одном месте. но я думаю, никто не может запретить тебе это делать

person Morion    schedule 06.07.2012
comment
Почему вы говорите, что лучше обрабатывать прикосновения в одном месте? - person eugene; 09.07.2012
comment
Это всего лишь спрайт, из него не нужно делать обработчик касаний. на мой взгляд, это недостаточно ясно, чтобы понять при чтении кода. - person Morion; 09.07.2012
comment
Это технически отвечает на вопрос, поэтому я тоже проголосую за это. Для тех, кто больше обеспокоен тем, как это сделать, а не тем, следует ли вам или не следует, прокрутите вниз и ознакомьтесь с ответом m.ding. - person ; 17.01.2013
comment
Ответ Таньянжи хорошо работает с последними версиями Cocos2D-x, такими как 3.5. - person Jonny; 02.06.2015

Примечание. Возможно, этот ответ устарел. Я ответил на этот вопрос в 2012 году.

Это неплохая идея. Вот как я это делаю:

заголовочный файл:

#include "cocos2d.h"
using namespace cocos2d;
class TouchableSprite : public cocos2d::CCSprite, public CCTargetedTouchDelegate {
    public:
    virtual void onEnter();
    virtual void onExit();
    virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
    virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
    virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);
};

СРР-файл:

#include "TouchableSprite.h"
void TouchableSprite::onEnter(){
    // before 2.0:
    // CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true);

    // since 2.0: 
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
    CCSprite::onEnter();
}
void TouchableSprite::onExit(){
    // before 2.0:
    // CCTouchDispatcher::sharedDispatcher()->removeDelegate(this);

    // since 2.0:
    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
    CCSprite::onExit();
}
bool TouchableSprite::ccTouchBegan(CCTouch* touch, CCEvent* event){
    //do whatever you want here
    return true;
}
void TouchableSprite::ccTouchMoved(CCTouch* touch, CCEvent* event){
    //do what you want
}
void TouchableSprite::ccTouchEnded(CCTouch* touch, CCEvent* event){
    //do your job here
}
person m.ding    schedule 08.07.2012
comment
Согласованный. Для этого есть веские причины, например, создание собственного диалога. Это лучший ответ здесь. - person ; 17.01.2013
comment
@JayGajjar в ccTouchMoved, используя touch->getLocation() и touch->getProviousLocation() для вычисления вектора движения. Затем позвоните this->setPosition(ccpAdd(this->getPosition(),moving_vector)); - person m.ding; 19.06.2013
comment
@m.ding эй, не могли бы вы сказать мне, могу ли я получить полный код того, как перетаскивать или перемещать ccsprite и b2body? Потому что я не могу переместить ccsprite - person Jay Gajjar; 29.06.2013
comment
@JayGajjar Извините, я не сделал этого раньше. но на сайте cocos2d-x есть примеры проектов, которые могут помочь (я не уверен) - person m.ding; 01.07.2013
comment
Событие касания Sprite срабатывает независимо от того, где я касаюсь экрана, не могли бы вы помочь... Я использовал этот код - person Antagonist; 15.08.2013
comment
это просто больше не работает в cocos2d-x, я никогда не работал, см. это: cocos2d-x.org/boards/6/topics/33443?r=33801 все говорят, что это должно быть на объекте контроллера, а не в самих спрайтах - person user63898; 18.08.2013
comment
Я пытался использовать это решение, но я все еще не могу вызвать суперметод CCSprite::create() - person kifcaliph; 04.02.2014

В cocos2d-x 3.0 alpha вы можете попробовать это:

auto listener = EventListenerTouchOneByOne::create();

listener->setSwallowTouches(true);

listener->onTouchBegan = [&](Touch* touch, Event* event){

    if (this->getBoundingBox().containsPoint(this->convertTouchToNodeSpace(touch))) {
        return true;
    }
    return false;

};

Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
person tanyanzhi    schedule 25.12.2013
comment
Исходя из мира Java, мне интересно, что означает [&] в строке: listener-›onTouchBegan = [&](Touch* touch, Event* event){? - person Ari R. Fikri; 25.06.2014
comment
@AriR.Fikri Не уверен, но я думаю, это отсылка к this? - person TankorSmash; 03.11.2014

Вам не нужно создавать подклассы спрайтов для обнаружения касания.

Здесь перейдите по этой ССЫЛКЕ, это отличное место для начала работы с Cocos2d.

person Shailesh    schedule 06.07.2012