`
wangweike
  • 浏览: 67000 次
  • 性别: Icon_minigender_1
  • 来自: Mars
社区版块
存档分类
最新评论

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事件分发。




分享到:
评论

相关推荐

    cocos2d-x 触摸事件 讲解

    在`registerWithTouchDispatcher`方法中,开发者通过`addTargetedDelegate`或`addStandardDelegate`方法将自定义的`CCTouchDelegate`实例添加到`CCTouchDispatcher`的分发列表中。 3. **创建CCTouchHandler对象** ...

    iOS游戏应用源代码——jotaeme1212-Ejemplos-en-Cocos2D.zip

    在这些示例中,你将学习到如何使用` CCTouchDispatcher`来分发触摸事件,以及如何在`CCNode`的子类中重写`ccTouchBegan`、`ccTouchMoved`和`ccTouchEnded`方法来实现具体的触摸交互。 物理引擎也是Cocos2D的一大...

    Cocos2d-x 3.3 API离线文档

    Cocos2d-x提供了一系列的触摸事件处理函数,如ccTouchBegan、ccTouchMoved、ccTouchEnded,使开发者能够轻松实现交互式游戏元素。 6. **音频管理**:Cocos2d-x支持音频播放,包括背景音乐和音效。如...

    cocos2d事件响应总结

    cocos2d使用`CCTouchDispatcher`类来分发从iOS获取的触摸事件。该类支持两种不同的触摸事件分发方式: 1. **标准触摸委托** (`CCStandardTouchDelegate`) - 这种方式将所有的触摸信息直接传递给实现了该协议的对象...

    cocos2d入门cocos2d入门

    当用户触摸屏幕时,`-(void)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event;`方法会被调用。 2. **Targeted Touch**:导入`CCTouchDispatcher.h`,注册针对性的触摸代理。`addTargetedDelegate`方法用于...

    iOS开发中使用cocos2d添加触摸事件的方法

    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:kCCMenuTouchPriority swallowsTouches:YES]; } ``` 这里的`priority`参数定义了事件处理的优先级,而`swallowsTouches`设置为`YES`...

Global site tag (gtag.js) - Google Analytics