• Cocos2D:继承于CCLayout或者使用CCTouchDispatcher监听、派发事件


    1.单一监听,所谓单一监听其实是跟cocos2d引擎框架有关,因为在cocos2d中每个游戏界面都可以使用一个CCLayout完成,那么当一个CCLayout在屏幕显示出来后,想要监听用户的按键事件,一般都会使用以下形式来进行监听:(注意:这里是CCLayout类进行监听的方式)

    首先开启监听:

     

    1. self.isTouchEnabled=YES;  

    然后重写监听函数即可:

     

    1. //监听首次触发事件   
    2. - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event   
    3. {   
    4. }   
    5. //触摸事件 - 当手指在屏幕上进行移动   
    6. - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event   
    7. {   
    8.        
    9. }   
    10. //触摸事件 - 当手指从屏幕抬起时调用的方法   
    11. -(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event   
    12. {   
    13.            
    14. }   

    此种监听狠eazy,但是要注意这里是对CCLayout类进行的监听方式;

     


    2.监听分发; 刚才说了,游戏的每个界面可能都是一个CCLayout,但是如果我想让一个CCSprite精灵主角单独进行监听,或者说在CCLayout有很多个精灵我想单独监听其中的一种的时候,这时候就需要使用监听分发的形式了;

    假设我们自定义了一个类XX继承CCSprite,还有一个YY类也继承CCSprite,而且XX类型与YY类的实例都存在于一个Layout上,那么我想对XX与YY类型分别单独监听的话;首先我们先让当前继承的CCSprite类的XX于YY类都使用 <CCTargetedTouchDelegate>协议;

    (CCSprite中没有 self.isTouchEnabled=YES; 这个函数,别直接写这个哦~)

    代码如下:

     

     

    1. @interface XX : CCSprite <CCTargetedTouchDelegate>{   
    2.    
    3. }   

    然后在当前实现类中重写一个函数如下:

     

    1. -(void) registerWithTouchDispatcher   
    2. {   
    3.     [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];   
    4. }   

    (此函数是注册监听,如果里面什么都不写,则当前不会相应任何触屏事件;)

     

    重写触摸的各事件函数,如下:

     

    1. //监听首次触发事件   
    2. - (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event   
    3. {    
    4.     return NO;   
    5. }   
    6. //监听移动事件   
    7. - (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event   
    8. {      
    9. }   
    10. //监听离开事件   
    11. - (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event   
    12. {   
    13.        
    14. }  

     

    大家可以看到,此种监听方式除了各种监听函数与第一种类似之外,在 ccTouchBegan的函数有个返回类型-布尔值;那么其作用下面详细介绍;如果XX与YY类都实现了第二种监听方式的话,那么当用户触屏后,(当前用户触发的是XX与YY类实例所在的CCLayout)首先会进入XX或者YY的其中的ccTouchBegan函数中,这里假设首先进入了XX类中,那么XX类中的ccTouchBegan将会被响应,如果return true;表示不再将用户触屏的消息传递给YY类中进行响应,也就是说不再响应YY类中的ccTouchBegan函数,那么如果 return false;则会将当前触屏信息传递给其他注册过的类型中;

    一句话概括:return 的值,如果是真则表明用户触摸事件已经被处理,其他不会再去进行监听;如果为假,则会继续交给其他注册过的类型中进行处理;

     

    那么第二种监听的方式比较常用,这样便于处理,那么至于注册,一般都是放在 onEnter函数中;onEnter函数是每个CCScene之间切换会被响应的函数,相当于是CCScene的生命周期函数,具体调用顺序如下: 

     


    • //使用[CCDirector replaceScene:XX],替换场景时,会调用以下3个方法  
       
    • //调用顺序依次为:   
    • //1.othterScene的+(id)Scene——>   
    • //2.otherScene的init——>   
    • //3.otherScene的onEnter——>   
    • //4.运行过渡效果   
    • //5.当前Scene的onExit函数——>   
    • //6.otherLayout的onEnterTransitionDidFinish()   
    • //7.当前Scene的dealoc函数   
    • -(void) onEnter{   
    •     //调用其他Scene的init方法以后会调用此方法   
    •     //如果使用了CCTransitionScene,本方法将在过渡效果开始后调用   
    •     //(如果不调用super onEnter新场景可能对触摸和加速计无发应)   
    •     [super onEnter];   
    • }   
    • -(void) onEnterTransitionDidFinish{   
    •     //调用onEnter后会调用此函数   
    •     //如果使用了CCTransitionScene,将会在过渡效果完成时调用此方法   
    •     [super onEnterTransitionDidFinish];   
    • }   
    • -(void)onExit{    
    •     //在调用dealloc之前会调用此函数;   
    •     //如果使用了CCTransitionScene,将会在过渡效果结束以后调用此方法   
    •     //(如果不调用super onExit,当前场景可能不会从内存中释放)   
    •     [super onExit];   
    • }   

    转自http://xiaominghimi.blog.51cto.com/2614927/632984

  • 相关阅读:
    软件工程第1次阅读作业
    centOS 7设置静态IP,使用Xshell远程连接
    jmeter响应结果乱码问题
    Jmeter环境搭建详细介绍
    redis常用操作命令集合
    cocoapod 快速更新,加载
    获取验证码倒计时
    支持向量机SVM(Support Vector Machine)
    Ensemble Learning: Bootstrap aggregating (Bagging) & Boosting & Stacked generalization (Stacking)
    Eureka安全下线服务
  • 原文地址:https://www.cnblogs.com/optimus/p/2565391.html
Copyright © 2020-2023  润新知