2012-06-21 28 views
6

Tôi đang sử dụng Cocos2d-x và cố gắng phát hiện các chạm trong dự án HelloWorld của mình. Mặc dù tôi không có may mắn.Phát hiện cảm ứng Cocos2d-x

.h

class HelloWorld : public CCLayer{ 

private: 
    CCSpriteBatchNode * _batchNode; 
    CCSprite *_turkey; 
    virtual void ccTouchesBegan(cocos2d::CCSet* touches, cocos2d::CCEvent* event); 

.ccp

void HelloWorld::ccTouchesBegan(cocos2d::CCSet* touches, cocos2d::CCEvent* event){ 
    CCLog("this"); 
} 

nhưng vấn đề là khi tôi nhấp vào màn hình 'này' không bao giờ xuất hiện trong nhật ký. Tôi đang thiếu gì ở đây?

cảm ơn!

Chỉnh sửa,

Im sử dụng hướng dẫn này. http://www.raywenderlich.com/11338/cocos2d-x-for-ios-and-android-space-game

Trả lời

20

Bạn phải đăng ký với CCTouchDispatcher để nhận được chạm:

Viết này trong phương pháp init() của bạn để nhận được chạm:

CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this, 0); 

Ngoài ra tôi khuyên bạn nên nhận được sự kiện liên lạc qua các phương thức ủy nhiệm liên lạc được nhắm mục tiêu:

virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); 
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); 
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); 
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); 

Để các phương thức này c alled bạn phải đăng ký với liên lạc phối một chút khác nhau:

CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true); 

EDIT

Trong phiên bản mới cocos CCTouchDispatcher tọa lạc tại CCDirector:

Nó sẽ giống như thế này:

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true); 
+0

hmmm tôi nhận được error 'No memeber có tên 'sharedDispatcher'' trong' cocos2d :: CCTouchDispatcher 'khi tôi đặt nó vào init của tôi(), trong HelloWorld.cpp –

+0

@JamesDunay: bạn dùng phiên bản cocos nào? – Andrew

+0

@JamesDunay: xin vui lòng, xem chỉnh sửa của tôi – Andrew

7

Vì vậy, điều gì đó cực kỳ đơn giản, chỉ cần thêm

this->setIsTouchEnabled(true);

tới init() của tôi; chức năng.

2
'this' never shows up in the log 

gợi ý Bạn có thể sử dụng một phiên bản khác của thư viện Cocos2D. Vui lòng truy cập cocos2d.h trên dự án của bạn và xác nhận. (mẫu được viết trên 1.0.1). Nếu bạn đang sử dụng phiên bản khác, (đoán) bạn có thể phải sử dụng chữ ký ccTouchesBegan khác và/hoặc sửa nhiều hơn chỉ setIsTouchEnabled để làm cho nó hoạt động. Tôi vừa tải xuống mẫu và cuộc gọi ccTouchesBegan hoạt động hoàn hảo - mà không có bất kỳ thay đổi nào.

-1

this->setTouchEnabled(true); hoạt động tốt hơn so với CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true); may ccTouchMoved của tôi không chọn bất cứ điều gì lên ... :(

-1

cho cocos2d-x v3.0 ..

viết này trong thư mục'.h 'tập tin

{bool onTouchBegan (cocos2d::Touch * touch, cocos2d::Event * event);} 

viết này trong thư mục 'init()' function ..

{ 
auto listner = EventListenerTouchOneByOne::create(); 

listner->setSwallowTouches(true);  

listner->onTouchBegan = CC_CALLBACK_2(Gameplay::onTouchBegan, this); 

_eventDispatcher->addEventListenerWithSceneGraphPriority(listner, this); 
} 

và viết những dòng này trong' cpp' tập tin ..

bool "YOURCLASSNAME"::onTouchBegan(cocos2d::Touch* touch, cocos2dEvent* event) 
{ 
     CCLOG("this"); 
      return true; 
} 
0

đây trong phương pháp dưới đây tôi đang áp dụng chạm vào Sprite, Nếu bạn muốn áp dụng sự kiện cảm ứng trên TextField, Node, Background, hoặc trong bất kỳ thành phần nào, chỉ cần Pass ComponentType vào phương thức này và nó sẽ hoạt động ....

OK LETS BEGIN !!!!

void YourClassName::YourListnerMethodName(cocos2d::Sprite* object) 
{ 
    auto listener = cocos2d::EventListenerTouchOneByOne::create(); 
    listener->setSwallowTouches(false); 

    listener->onTouchBegan = [=](cocos2d::Touch* touch, cocos2d::Event* event) 
    { 
     auto target = event->getCurrentTarget(); 
     Point locationInNode = target->convertToNodeSpace(touch->getLocation()); 

     // Suppose your sprite or any component is inside in any parent object then use this line instead of above line ... 
     //just uncomment below line and it will work fine in this case 
     //Point locationInNode = target->getParent()->convertToNodeSpace(touch->getLocation()); 

     if (target->getBoundingBox().containsPoint(locationInNode)) { 

      // CODE FOR RESPONSE AFTER TOUCH 

      return true; 
     } 
     return false; 
    }; 

    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, object); 
} 

Ở đây, mục tiêu là thành phần của bạn, nơi bạn muốn áp dụng cảm ứng trên nó

Chỉ cần đừng quên để gọi phương pháp này từ ctor hoặc bất cứ nơi nào theo yêu cầu của bạn

Các vấn đề liên quan