棋牌游戏之 触摸滑动-选牌(和欢乐斗地主效果一样)

来源:互联网 发布:淘宝客如何赚佣金 编辑:程序博客网 时间:2024/04/28 05:10

<1>成员变量

public:    CCPoint _touchBegan;    CCPoint _touchMoved;    CCPoint _touchEnd;    virtual void onEnter();    virtual void onExit();    virtual bool ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent);    virtual void ccTouchMoved(CCTouch* pTouch, CCEvent* pEvent);    virtual void ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent);private:    CCArray* _card;    void checkSelCard(CCPoint beganPoint, CCPoint endPoint, bool isBegan = false); //正向选牌    void checkSelCardEnd(); //选牌结束    void checkSelCardReserve(CCPoint touchBegan, CCPoint touchMoved); //处理逆向选牌

<2>实现方法

bool HelloWorld::init(){    //////////////////////////////    // 1. super init first    if ( !CCLayer::init() )    {        return false;    }        _card = CCArray::create();    CC_SAFE_RETAIN(_card);    CCSize size = CCDirector::sharedDirector()->getWinSize();    float dur = PaiJianJu;  //牌的间距    int num = 17;  //牌的数量    const float cardWidth = 144;  //牌的宽高    float beganX = size.width/2 - num/2 * dur - (cardWidth - dur)/2;    float beganY = 0;        CCPoint beganPoint = ccp(beganX, beganY);  //第一张牌的起始位置            for(int i = 0; i < num; i++)    {        CCSprite* card = CCSprite::create("Icon-144.png");        CCLog("====%f", card->getContentSize().width);        card->setAnchorPoint(CCPointZero);        card->setPosition(ccpAdd(beganPoint, ccp(i * dur, 0)));        addChild(card);        _card->addObject(card);    }        return true;}void HelloWorld::checkSelCard(CCPoint beganPoint, CCPoint endPoint, bool isBegan /*=false*/){    CCObject* obj = NULL;    if(isBegan)    {               CCARRAY_FOREACH_REVERSE(_card, obj)        {            CCSprite* card = dynamic_cast<CCSprite*>(obj);            if(card->boundingBox().containsPoint(beganPoint))            {                card->setColor(ccc3(150, 150, 150));                card->setTag(1);                return;            }        }    }    else    {        float x, y, w, h;        x = MIN(beganPoint.x, endPoint.x);        y = MIN(beganPoint.y, endPoint.y);        w = MAX(1, fabsf(beganPoint.x - endPoint.x));        h = MAX(1, fabsf(beganPoint.y - endPoint.y));        CCRect touchRect = CCRectMake(x, y, w, h);        CCARRAY_FOREACH_REVERSE(_card, obj)        {            CCSprite* card = dynamic_cast<CCSprite*>(obj);            if(card->boundingBox().intersectsRect(touchRect))            {                card->setColor(ccc3(150, 150, 150));  //变暗                card->setTag(1);                return;            }        }    }}void HelloWorld::checkSelCardReserve(CCPoint touchBegan, CCPoint touchMoved){    CCPoint p1 = touchBegan.x < touchMoved.x ? touchBegan : touchMoved;    float width = fabsf(touchBegan.x - touchMoved.x);    float height = fabsf(touchBegan.y - touchMoved.y) > 5 ? fabsf(touchBegan.y - touchMoved.y) : 5;    CCRect rect = CCRectMake(p1.x, p1.y, width, height);        CCObject* obj = NULL;    CCARRAY_FOREACH_REVERSE(_card, obj)    {        CCSprite* card = dynamic_cast<CCSprite*>(obj);        if(!card->boundingBox().intersectsRect(rect))        {            card->setColor(ccc3(255, 255, 255));  //            card->setTag(0);        }    }        CCARRAY_FOREACH(_card, obj)    {        CCSprite* card = dynamic_cast<CCSprite*>(obj);        if(p1.x - card->getPositionX() >= PaiJianJu)        {            card->setColor(ccc3(255, 255, 255));  //            card->setTag(0);        }    }}void HelloWorld::checkSelCardEnd(){    CCObject* obj = NULL;    CCARRAY_FOREACH_REVERSE(_card, obj)    {        CCSprite* card = dynamic_cast<CCSprite*>(obj);        if(card->getPositionY() == 0 && card->getTag() == 1)            card->setPosition(ccp(card->getPositionX(), card->getPositionY() + 35));        else if(card->getPositionY() > 0 && card->getTag() == 1)            card->setPosition(ccp(card->getPositionX(), card->getPositionY() - 35));        card->setColor(ccc3(255, 255, 255));  //变亮        card->setTag(0);    }}void HelloWorld::onEnter(){    CCLayer::onEnter();    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -125, true);}void HelloWorld::onExit(){    CCLayer::onExit();    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);}bool HelloWorld::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent){    _touchBegan = convertTouchToNodeSpace(pTouch);    checkSelCard(_touchBegan, _touchBegan, true);    return true;}void HelloWorld::ccTouchMoved(CCTouch* pTouch, CCEvent* pEvent){    _touchMoved = convertTouchToNodeSpace(pTouch);    checkSelCard(_touchMoved, _touchMoved);    checkSelCardReserve(_touchBegan, _touchMoved);}void HelloWorld::ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent){    _touchEnd = convertTouchToNodeSpace(pTouch);    checkSelCardEnd();}

<3>截图.


总结:可见牌的滑动是不能单张注册触摸的,其实想一下就应该知道不能这么干,因为你是要拖动出来一个矩形区域,从而根据矩形区域来判断应该选中的牌的.如果单张注册了触摸,那么是得不到这个矩形区域的,况且牌位于GameLayer之上,它会首先处理掉触摸事件.


0 0
原创粉丝点击