cococos 2 dxタッチテストの3つの優先度と伝達を阻止する

13905 ワード

最初の2つのエッセイは、単一の画像のドラッグ&ズームを完了しました.
では、画面に同じ画像が2つ以上あるとどうなるのでしょうか.やってみよう
HelloWorldのinitメソッドを修正して、もう一つの画像を載せます
bool HelloWorld::init()

{

    if ( !CCLayer::init() )

    {

        return false;

    }

    MySprite* pSprite = MySprite::create("HelloWorld.png");

    pSprite->setPosition(VisibleRect::center());

    this->addChild(pSprite, 0);

    

    MySprite* pSprite2 = MySprite::create("Icon-114.png");

    pSprite2->setPosition(VisibleRect::center());

    pSprite2->setScale(2.0f);// , ...

    this->addChild(pSprite2, 1);

    

    return true;

}

シミュレータをつけて1つのポイントをドラッグしてみると、2つの画像が動いていることがわかります.
もし私たちが望むなら、上の画像をドラッグして、後ろの不動は?
Google検索して、資料を調べて、すべて処理が終わった後にtouchesを食べて注文すると言っています
やってみよう
ccTouchesMovedメソッドの変更
void MySprite::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent){

    CCLog("ccTouchesMoved touches point count:%i",pTouches->count());

    CCDictionary* touchesDic = CCDictionary::create();

    CCSetIterator iter = pTouches->begin();

    CCRect rect = this->boundingBox();

    for (; iter != pTouches->end(); iter++){

        CCTouch* pTouch = (CCTouch*)(*iter);

        if(rect.containsPoint(pTouch->getLocation())){

            touchesDic->setObject(pTouch, CCString::createWithFormat("%d",pTouch->getID())->getCString());

        }

    }

    CCArray* keys = touchesDic->allKeys();

    // 

    if (touchesDic->count() == 2){

        //CCLog("****ccTouchesMoved*");

        CCArray* keys = touchesDic->allKeys();

        CCTouch *touch1 = (CCTouch*)touchesDic->objectForKey(((CCString*)keys->objectAtIndex(0))->getCString());

        CCTouch *touch2 = (CCTouch*)touchesDic->objectForKey(((CCString*)keys->objectAtIndex(1))->getCString());

        

        CCPoint p1End = touch1->getLocation();

        CCPoint p2End = touch2->getLocation();

        CCPoint p1Start = touch1->getPreviousLocation();

        CCPoint p2Start = touch2->getPreviousLocation();

        

        float startDistance = ccpDistance(p1Start,p2Start);

        float endDistance = ccpDistance(p1End,p2End);

        

        //CCLog("startDistance:%f,endDistance:%f",startDistance,endDistance);

        float scale = this->getScale()*(endDistance/startDistance);

        if(scale<0.5f){

            scale = 0.5f;

        }else if(scale>3.0f){

            scale = 3.0f;

        }

        this->setScale(scale);

        

        pTouches->removeObject(touch1); pTouches->removeObject(touch2);

    }else if(touchesDic->count() ==1){// 

        CCTouch *pTouch = (CCTouch*)touchesDic->objectForKey(((CCString*)keys->objectAtIndex(0))->getCString());

        CCPoint start = pTouch->getPreviousLocation();

        CCPoint end = pTouch->getLocation();

        // , point position , , ,setPosition AnchorPoint 

        CCPoint sub = ccpSub(end, start);

        CCPoint newPosition = ccpAdd(this->getPosition(),sub);

        this->setPosition(newPosition);

        

        pTouches->removeObject(pTouch);

    }

}

試してみるとOK.
このように、2点以上のものを統一的に処理すれば、
if (touchesDic->count() >= 2)

私たちはremoveが2つの点しかありませんが、残りの点は下に伝わりますか?これは試していません.私はremoveAllObjectsを試して、それから間違いを報告しました~~
よし、しばらくは深く考えないで、少なくとも今は私が望んでいる効果に達しました.
 
タッチイベントの配布に優先順位があったのを覚えていますので、探してみてください.balabalabala....
2枚の図のコードを位置を変えましょう
bool HelloWorld::init()

{

    if ( !CCLayer::init() )

    {

        return false;

    }

    MySprite* pSprite2 = MySprite::create("Icon-114.png"); pSprite2->setPosition(VisibleRect::center()); pSprite2->setScale(2.0f); this->addChild(pSprite2, 1); MySprite* pSprite = MySprite::create("HelloWorld.png"); pSprite->setPosition(VisibleRect::center()); this->addChild(pSprite, 0); return true;

}

もう一度やってみると、後ろの大きな図がドラッグされていることに気づきました.これは私たちが望んでいるものではありません.なぜなら,後の大きな図がタッチイベントを優先的に処理しているからである.
では、画像を作成するときに優先順位を付けて、onEnterのときに設定します.
MySprite.h
class MySprite:public CCSprite,public CCTouchDelegate{

public:

    static MySprite* create(const char *pszFileName,int nPriority);

    

    virtual void onEnter();

    virtual void onExit();

    

    // optional

    virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);

    virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);

    virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);

    virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);

    void setPriority(int nPriority); int getPriority();

protected:  int _nPriority;

};

MySprite.cppのcreateメソッド
MySprite* MySprite::create(const char* pszFileName,int nPriority){

    MySprite *pobSprite = new MySprite();

    if (pobSprite && pobSprite->initWithFile(pszFileName))

    {

        pobSprite->setPriority(nPriority);

        pobSprite->autorelease();

        return pobSprite;

    }

    CC_SAFE_DELETE(pobSprite);

    return NULL;

}

MySprite.cppのonEnterメソッド
void MySprite::onEnter(){

    CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this, _nPriority);// 

    CCSprite::onEnter();

}

ハローワードのinitメソッドを修正して、試してみます
MySprite* pSprite2 = MySprite::create("Icon-114.png",2);// 

    pSprite2->setPosition(VisibleRect::center());

    pSprite2->setScale(2.0f);

    this->addChild(pSprite2, 1);

    

    MySprite* pSprite = MySprite::create("HelloWorld.png",3);

    pSprite->setPosition(VisibleRect::center());

    this->addChild(pSprite, 0);

やってみよう~~基本的には欲しい効果に達しています.