Не удается получить прикосновения в COCOS 2dx?

Ниже мой класс HelloWorld.h:

class HelloWorld : public cocos2d::CCLayer
{
public:
HelloWorld();

// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();

b2World* world;

// there's no 'id' in cpp, so we recommend returning the class instance pointer
static cocos2d::CCScene* scene();

// a selector callback
void menuCloseCallback(CCObject* pSender);

// implement the "static node()" method manually
CREATE_FUNC(HelloWorld);

virtual void draw();
virtual void ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent* event);
virtual void ccTouchesMoved(cocos2d::CCSet* touches, cocos2d::CCEvent* event);
virtual void ccTouchesBegan(cocos2d::CCSet* touches, cocos2d::CCEvent* event);
void update(float dt);


};

И в моем классе HelloWorld.cpp я инициализировал метод My init

bool HelloWorld::init(){
setTouchEnabled( true );
setAccelerometerEnabled( true );
scheduleUpdate();
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
return true;
}

Этот код работает для меня сейчас! :)


person Harsh    schedule 12.03.2014    source источник
comment
Хм, просто предположение, попробуйте удалить ключевое слово virtual из объявлений метода ccTouches*.   -  person LearnCocos2D    schedule 12.03.2014
comment
Неа. Не работает. :(   -  person Harsh    schedule 12.03.2014
comment
cocos2d::CCLayer уже является производным от cocos2d::CCTargetedTouchDelegate, попробуйте удалить его из определения класса   -  person SBKarr    schedule 13.03.2014


Ответы (2)


Targeted Delegate предназначен для событий с одним касанием. Измените свои события на что-то вроде этого:

virtual bool ccTouchBegan (CCTouch *pTouch, CCEvent *pEvent)

Подробнее о целевых и стандартных сенсорных делегатах можно прочитать в документации Cocos2D на стороне iPhone по адресу Ссылка

Написание делегата в моем методе инициализации, как показано ниже, решило проблему.

    CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this, 1);
person microslop    schedule 12.03.2014
comment
Вы пытались запустить свой код в качестве стандартного делегата, чтобы увидеть, можете ли вы получать какие-либо касания? - person microslop; 13.03.2014
comment
Нет, я очень новичок в этом программировании! Так что я не знаю, что именно вы имеете в виду под этим! - person Harsh; 13.03.2014
comment
Избавьтесь от всего целевого кода делегата и добавьте следующую строку: CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this, 1); Затем посмотрите, входите ли вы в ccTouchesBegan с точки останова. Стандартный делегат должен обрабатывать касания так же, как обычное приложение, поэтому вы должны получать все события касания. - person microslop; 13.03.2014
comment
используя этот делегат, я получаю ошибку неоднозначного преобразования из производного класса hello world в cctouchdelegate - person Harsh; 13.03.2014
comment
Вы избавились от public cocos2d::CCTargetedTouchDelegate из своего заголовка, верно? Можете ли вы опубликовать весь свой метод инициализации. - person microslop; 13.03.2014
comment
Я отредактировал свой вопрос и внес необходимые изменения, которые могут вам помочь. - person Harsh; 13.03.2014

Если вы хотите отключить функцию multiTouch, вы можете использовать:

virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent){}
virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent){}

И поэтому вам необходимо:

bool init()
{
    ...
    setTouchEnabled(true);
    this->setTouchMode(ccTouchesMode::kCCTouchesOneByOne); // Important
}

Если вы пропустите последнюю строку, вам нужно будет переопределить их (режим multiTouch):

void ccTouchesBegan(cocos2d::CCSet* touches, cocos2d::CCEvent* event);
void ccTouchesMoved(cocos2d::CCSet* touches, cocos2d::CCEvent* event);
void ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent* event);
person Emadpres    schedule 02.06.2015