cocos2d-x中Touch事件使用

/*
 * Brick.cpp
 *
 *  Created on: 2013-7-20
 *      Author: freshman
 */

#include "Brick.h"

Brick::Brick() {
    _isTouchBegined = false;
}

Brick::~Brick() {
}

/**获取砖块所处的位置*/
CCRect Brick::getRect() {
    CCSize size = getContentSize();
    return CCRectMake( -size.width / 2, -size.height / 2, size.width, size.height);
}

Brick* Brick::createBrick(CCTexture2D *texture2D) {
    Brick* brick = new Brick();
    brick->initWithTexture(texture2D);
    brick->autorelease();

    return brick;
}

void Brick::onEnter() {
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(
            this, 0, true);
    CCSprite::onEnter();
}

void Brick::onExit() {
    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
    CCSprite::onExit();
}

bool Brick::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) {
    if (_isTouchBegined) {
        return false;
    }

    CCRect rect = getRect();
    CCLog("getRect");
    if (!rect.containsPoint(this->convertTouchToNodeSpaceAR(pTouch))) {
        return false;
    }
    CCLog("ccTouchBegined");
    return _isTouchBegined = true;
}

void Brick::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {
    if (_isTouchBegined) {
        CCSize size = CCDirector::sharedDirector()->getVisibleSize();
        CCPoint point = CCDirector::sharedDirector()->getVisibleOrigin();

        CCRect rect = CCRectMake(point.x, point.y, size.width, size.height);
        point = pTouch->getLocation();
        if (rect.containsPoint(point)) {
            setPosition(point);
        }
    }
}

void Brick::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) {
    _isTouchBegined = false;
}

void Brick::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) {
    if (!_isTouchBegined) {
        return;
    }
    CCLog("ccTouchEnded");
    _isTouchBegined = false;
}
 1 /*
 2  * Brick.h
 3  *
 4  *  Created on: 2013-7-20
 5  *      Author: freshman
 6  */
 7 
 8 #ifndef BRICK_H_
 9 #define BRICK_H_
10 
11 #include "cocos2d.h"
12 USING_NS_CC;
13 
14 class Brick: public CCSprite, public CCTargetedTouchDelegate {
15 private:
16     bool _isTouchBegined;
17 public:
18     Brick();
19     virtual ~Brick();
20 
21     static Brick* createBrick(CCTexture2D *texture2d);
22     /**获取显示对象的矩形范围*/
23     CCRect getRect();
24 
25     virtual void onEnter();
26     virtual void onExit();
27     virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
28     virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
29     virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
30     virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
31 };
32 
33 #endif /* BRICK_H_ */

实现四个ccTouchxx的方法就是可以使用touch时间机制了。

另外还要介绍一下onEnter和onExit两个方法,这两个方法在是什么时候会被调用呢?看下面源码

 1 /* "add" logic MUST only be on this method
 2 * If a class want's to extend the 'addChild' behavior it only needs
 3 * to override this method
 4 */
 5 void CCNode::addChild(CCNode *child, int zOrder, int tag)
 6 {    
 7     CCAssert( child != NULL, "Argument must be non-nil");
 8     CCAssert( child->m_pParent == NULL, "child already added. It can't be added again");
 9 
10     if( ! m_pChildren )
11     {
12         this->childrenAlloc();
13     }
14 
15     this->insertChild(child, zOrder);
16 
17     child->m_nTag = tag;
18 
19     child->setParent(this);
20     child->setOrderOfArrival(s_globalOrderOfArrival++);
21 
22     if( m_bRunning )
23     {
      /**没错就是在这个地方被调用*/
24 child->onEnter(); 25 child->onEnterTransitionDidFinish(); 26 } 27 }
 1 void CCNode::detachChild(CCNode *child, bool doCleanup)
 2 {
 3     // IMPORTANT:
 4     //  -1st do onExit
 5     //  -2nd cleanup
 6     if (m_bRunning)
 7     {
 8        //没错就是这个时候调用了
 9         child->onExitTransitionDidStart();
10         child->onExit();
11     }
12 
13     // If you don't do cleanup, the child's actions will not get removed and the
14     // its scheduledSelectors_ dict will not get released!
15     if (doCleanup)
16     {
17         child->cleanup();
18     }
19 
20     // set parent nil at the end
21     child->setParent(NULL);
22 
23     m_pChildren->removeObject(child);
24 }

由此可见onEnter是在对象被添加到父节点的时候调用,而onExit是在该节点被移除出父节点时调用的,所以,我们一切初始化操作可以在onEnter中完成,而一些销毁的操作可以在onExit中完成。

posted @ 2013-07-21 00:31  walkabc  阅读(302)  评论(0编辑  收藏  举报