CCTouchDispatcher,ccTouchBegan

1.在CCLayer中注册CCTouchDispatcher来让Layer处理Touch事件。

1).在init中self.isTouchEnabled=YES;

2).重写 CCLayer的 registerWithTouchDispatcher方法,代码如下:
 -(void) registerWithTouchDispatcher

{
   
CCTouchDispatcher* dispatch = [CCTouchDispatcher sharedDispatcher];
[dispatch addTargetedDelegate:self priority:INT32_MIN+1 swallowsTouches:YES];

}

查看CCLayer中对registerWithTouchDispatcher的相关调用,可以看到在CCLayer中的OnEnter中调用了registerWithTouchDispatcher,而在OnExit也实现了对self在 CCTouchDispatcher中的移除。

也可以直接只在init最后调用[[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];

2.ccTouchBegan
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{   
    CGPoint touchLocation = [self convertTouchToNodeSpace:touch];     
    return YES;   
}

ccTouchBegan返回YES,表示用户界面层处理了当前的触摸事件,此事件不应该再被其它拥有低优先级的目标触摸代理的层进行处理。

在ccTouchBegan中,调用CCNode的一个辅助函数convertTouchToNodeSpace,把touch坐标点从屏幕坐标系转换成了节点坐标系。
这个方法做了以下三件事:
- (CGPoint)convertTouchToNodeSpace:(UITouch *)touch
{
//1.计算touch视图(也就是屏幕)的touch点位置(使用locaitonInView方法)
CGPoint point = [touch locationInView: [touch view]];
//2.转换touch坐标点为OpenGL坐标点(使用convertToGL方法)
point = [[CCDirector sharedDirector] convertToGL: point];
//3.转换OpenGL坐标系为指定节点的坐标系(使用convertToNodeSpace方法)
//注意它convertToNodeSpace和convertTouchToNodeSpace名称的区别
point=[self convertToNodeSpace:point];
        return point;
}


3.ccTouchMoved
//移动精灵
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{      
//oldTouchLocation
    CGPoint oldTouchLocation = [touch previousLocationInView:touch.view];
    oldTouchLocation = [[CCDirector sharedDirector] convertToGL:oldTouchLocation];
    oldTouchLocation = [self convertToNodeSpace:oldTouchLocation];

//new touchLocation
    CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
   
   
//计算点差
    CGPoint offset = ccpSub(touchLocation, oldTouchLocation);   

//移动精灵
     sprite.position = ccpAdd(sprite.position, offset);
}

20.
标准触碰协议
目标触碰协议

只要保证只有一个层响应触摸,然后做selector事件分发。




你可能感兴趣的:(dispatcher)