zoukankan      html  css  js  c++  java
  • 为精灵添加触摸事件

      这可能是游戏中最普通的场景了:点击某个精灵,触发此精灵的一系列动作。比如:精灵是一块石头,触摸石头后,让石头从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);
    

      

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

      

  • 相关阅读:
    POJ 1141 括号匹配 DP
    881. Boats to Save People
    870. Advantage Shuffle
    874. Walking Robot Simulation
    文件操作
    861. Score After Flipping Matrix
    860. Lemonade Change
    842. Split Array into Fibonacci Sequence
    765. Couples Holding Hands
    763. Partition Labels
  • 原文地址:https://www.cnblogs.com/fengzheng/p/3116183.html
Copyright © 2011-2022 走看看