• 为精灵添加触摸事件


      这可能是游戏中最普通的场景了:点击某个精灵,触发此精灵的一系列动作。比如:精灵是一块石头,触摸石头后,让石头从A点移动到B点。

      由于精灵(CCSprite)类没有点击、触摸事件,所以要用其他的方法为精灵添加触摸事件。

      首先在场景的头文件中声明触摸所需的方法,主要包括ccTouchEnded、ccTouchBegan、registerWithTouchDispatcher。

    如代码:

     virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
     virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); 
     void registerWithTouchDispatcher();
    

      然后在CPP文件中实现这3个方法:

    //声明全局石头精灵类
    CCSprite* stone;
    
    ///注册触摸代理支持
    ///其中第二个参数为触摸的响应等级 值越小 响应等级越高
    void HelloWorld::registerWithTouchDispatcher()
    {
    	CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-120,true);
    }
    
    //判断是否点击的范围为精灵 如果是则执行动作
    void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
    {
    	CCPoint touchPoint = convertTouchToNodeSpace(pTouch);
    	if(stone->boundingBox().containsPoint(touchPoint))
    	{
    		CCMessageBox("点击了我","提示信息");
    	}
    }
    
    //返回true表示支持触摸 返回false表示忽略 
    //也可在此方法中判断是否要为某些其它元素适时忽略触摸事件
    bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
    {
    	return true;
    }
    

      最后在HelloWorld::init()方法中加上如下代码:this->setTouchEnabled(true);

      到此为止,可以实现精灵的触摸(点击)事件了,但是,我们如果在场景中存在其他的比如菜单、按钮之类的元素,会发现这些元素触摸(点击)无响应了。没错,我们只判断了当触摸范围在指定精灵上时,才触发动作。

      这个时候的解决办法:

      我们上边有这句代码:CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-120,true);

      其中第二个参数为响应等级,数越小,等级越高,所以我们只要为其它的元素指定比-120小的整数,其它元素就会优先响应自身的触摸事件。

      例如:如下代码为cocos2d-x默认的退出按钮,这里设置了按钮的TouchPriority为-127,所以此按钮的响应等级高于精灵的-120的响应等级。

    CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
    			"CloseNormal.png",
    			"CloseSelected.png",
    			this,
    			menu_selector(CatchBirdScene::menuCloseCallback));
    CC_BREAK_IF(! pCloseItem);
    CCSize size = CCDirector::sharedDirector()->getWinSize();
    // Place the menu item bottom-right conner.
    pCloseItem->setPosition(ccp(size.width - 20, 20));
    
    // Create a menu with the "close" menu item, it's an auto release object.
    CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
    pMenu->setTouchPriority(-127);
    pMenu->setPosition(CCPointZero);
    CC_BREAK_IF(! pMenu);
    
    // Add the menu to HelloWorld layer as a child layer.
    this->addChild(pMenu, 1);
    

      

      到这里,基本可以实现一个场景的触摸响应了。

      

  • 相关阅读:
    如何在.netcore 上实现 Rbac 权限管理
    socket编程之TCP开发中的PEEK_MSG的使用与见解
    简述单例模式的一些优缺点及其评价
    排查线上内存泄漏,RingBufferLogEvent类内存占用过高,skyWalking内存占用过高
    Centos7安装docker(报错:container-selinux >= 2:2.74)
    JSP3.4
    Java SM2加密、解密、签名、验签
    获取properties文件中的
    五种生成唯一id方式的对比
    SpringBoot 改造成 https访问
  • 原文地址:https://www.cnblogs.com/fengzheng/p/3116183.html
Copyright © 2020-2023  润新知