2013-11-03 13 views
9

Staram się więc stworzyć prostą aplikację przy użyciu najnowszej kompilacji cocos2d-x i z jakiegoś powodu nie mogę uzyskać połączenia za pomocą dotyku. Oto moje zajęcia:Nie można uzyskać dotyku do pracy w wieloplatformowej aplikacji cocos2d-x

class GameLayer : public cocos2d::Layer 
{ 
public: 
    static cocos2d::Layer* createLayer(); 
    void update(float dt); 
    virtual bool init(); 
    CREATE_FUNC(GameLayer); 
private: 
    bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event); 
    void onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event); 
    void onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event); 
}; 

cocos2d::Layer* GameLayer::createLayer() 
{ 
    GameLayer *layer = GameLayer::create(); 

    return layer; 
} 

bool GameLayer::init() 
{ 
    if (!cocos2d::Layer::init()) 
    { 
     return false; 
    } 

    this->schedule(schedule_selector(GameLayer::update)); 
    this->setTouchEnabled(true); 

    return true; 
} 

void GameLayer::update(float dt) 
{ 

} 

bool GameLayer::onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event) 
{ 
    cocos2d::log("You touched %f, %f", touch->getLocationInView().x, touch->getLocationInView().y); 
    return true; 
} 
void GameLayer::onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event) 
{ 

} 
void GameLayer::onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event) 
{ 

} 

zauważyłem kiedy zadzwonić do wywołania setTouchEnabled że wewnętrzny nazywany _running flaga jest ustawiona na false, więc nie ma właściwie zarejestrować moje zdarzeń dotykowych. Jednak nie mogę się domyślić, dlaczego tak się dzieje. Czy dzwonię do rzeczy nieprawidłowo lub w niewłaściwej kolejności?

Odpowiedz

19

Obecnie cocos2dx przechodzi gruntowny przegląd biblioteki i wiele rzeczy się zmieniło, w tym rejestracja i propagacja dotyku. Oto jak to działa teraz:

GameLayer.h

class GameLayer : public cocos2d::Layer 
{ 
public: 
    static cocos2d::Layer* createLayer(); 
    void update(float dt); 
    virtual bool init(); 
    CREATE_FUNC(GameLayer); 

private: 
    virtual void onEnter(); 
    virtual void onExit(); 

    bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event); 
    void onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event); 
    void onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event); 
}; 

GameLayer.cpp

cocos2d::Layer* GameLayer::createLayer() 
{ 
    GameLayer *layer = GameLayer::create(); 

    return layer; 
} 

bool GameLayer::init() 
{ 
    if (!cocos2d::Layer::init()) 
    { 
     return false; 
    } 

    this->schedule(schedule_selector(GameLayer::update)); 

    return true; 
} 

void GameLayer::onEnter() 
{ 
    Layer::onEnter(); 

    // Register Touch Event 
    auto dispatcher = Director::getInstance()->getEventDispatcher(); 
    auto listener = EventListenerTouchOneByOne::create(); 

    listener->onTouchBegan = CC_CALLBACK_2(GameLayer::onTouchBegan, this); 
    listener->onTouchMoved = CC_CALLBACK_2(GameLayer::onTouchMoved, this); 
    listener->onTouchEnded = CC_CALLBACK_2(GameLayer::onTouchEnded, this); 

    dispatcher->addEventListenerWithSceneGraphPriority(listener, this); 
} 

void GameLayer::onExit() 
{ 
    // You don't need to unregister listeners here as new API 
    // removes all linked listeners automatically in CCNode's destructor 
    // which is the base class for all cocos2d DRAWING classes 

    Layer::onExit(); 
} 

void GameLayer::update(float dt) 
{ 

} 

bool GameLayer::onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event) 
{ 
    cocos2d::log("You touched %f, %f", touch->getLocationInView().x, touch->getLocationInView().y); 
    return true; 
} 

void GameLayer::onTouchMoved(cocos2d::Touch* touch, cocos2d::Event* event) 
{ 

} 

void GameLayer::onTouchEnded(cocos2d::Touch* touch, cocos2d::Event* event) 
{ 

} 

Nadzieję, że to pomaga!

+0

Wygląda na to, że 'registerWithTouchDispatcher' jest przestarzałe, a' getTouchDispatcher() 'już nie istnieje w' Director' żadnej koncepcji jaki jest odpowiednik teraz? –

+0

Cóż, interfejs API został zaktualizowany ponownie. :) Proszę spojrzeć na moją zaktualizowaną odpowiedź. – nomann

+0

Dzięki za pomoc, używam wersji 3.0, która była właśnie na ich głównej stronie, a nie na github (co również zmieniło wszystko). Tak więc moja wersja nie ma również zdarzenia EventListener. Zamierzam uaktualnić to, co mają w Github, będę Cię informować na bieżąco, jeśli uda mi się go uruchomić. –

Powiązane problemy