Cocos2d-X中实现自定义菜单处理事件

前端之家收集整理的这篇文章主要介绍了Cocos2d-X中实现自定义菜单处理事件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

用户点击再松开后才会响应菜单事件,而在游戏中有些游戏需要玩家点击后就处理事件,如玩坦克大战的时候,玩家是点击一下就发射子弹,并是点击松手后发射子弹,在Cocos2d-X中没有这种消息,下面就通过自定义的方式实现当用户点击后就调用处理函数

程序:当用户点击后处理消息松开手后处理结束

首先自定义一个MyMenu类用于处理点击事件

  1. /*
  2. 1)注册定时器函数,在定时器处理函数中,调用m_pSelectItem->active()
  3. */
  4. class MyMenu : public CCMenu
  5. {
  6. public:
  7. CREATE_FUNC(MyMenu);
  8. //当手按下的时候
  9. bool ccTouchBegan(CCTouch* touch,CCEvent* ev)
  10. {
  11. bool bRet = CCMenu::ccTouchBegan(touch,ev);
  12. if (bRet)
  13. {
  14. // 注册定时器函数
  15. scheduleUpdate();
  16.  
  17. return true;
  18. }
  19.  
  20. return false;
  21. }
  22.  
  23. void ccTouchEnded(CCTouch* touch,CCEvent* ev)
  24. {
  25. //定时器停止计时
  26. unscheduleAllSelectors();
  27. }
  28.  
  29. //每次帧循环都会被调用
  30. //dt上一次帧循环到这次帧循环所花的时间
  31. void update(float dt)
  32. {
  33. if (this->m_pSelectedItem && m_eState == kCCMenuStateTrackingTouch)
  34. {
  35. this->m_pSelectedItem->activate();
  36. }
  37. }
  38. };


在Menu.h中添加下面的代码(代码中包含了自定义的MyMenu类)

  1. #ifndef __Menu_H__
  2. #define __Menu_H__
  3.  
  4. #include "cocos2d.h"
  5. USING_NS_CC;
  6.  
  7. class Menu : public CCLayer
  8. {
  9. public:
  10. virtual bool init();
  11.  
  12. static CCScene* scene();
  13. //响应菜单事件
  14. void menuHandler(CCObject*);
  15. CREATE_FUNC(Menu);
  16. };
  17.  
  18.  
  19. /*
  20. 1)注册定时器函数,在定时器处理函数中,调用m_pSelectItem->active()
  21. */
  22. class MyMenu : public CCMenu
  23. {
  24. public:
  25. CREATE_FUNC(MyMenu);
  26. //当手按下的时候
  27. bool ccTouchBegan(CCTouch* touch,CCEvent* ev)
  28. {
  29. //定时器停止计时
  30. unscheduleAllSelectors();
  31. }
  32.  
  33. //每次帧循环都会被调用
  34. //dt上一次帧循环到这次帧循环所花的时间
  35. void update(float dt)
  36. {
  37. if (this->m_pSelectedItem && m_eState == kCCMenuStateTrackingTouch)
  38. {
  39. this->m_pSelectedItem->activate();
  40. }
  41. }
  42. };
  43.  
  44. #endif // Menu

在Menu.cpp中添加下面的代码

  1. #include "Menu.h"
  2.  
  3. CCScene* Menu::scene()
  4. {
  5. CCScene *scene = CCScene::create();
  6. Menu *layer = Menu::create();
  7.  
  8. scene->addChild(layer);
  9.  
  10. return scene;
  11. }
  12.  
  13. bool Menu::init()
  14. {
  15. //初始化父类
  16. CCLayer::init();
  17.  
  18. //得到窗口的尺寸
  19. CCSize winSize = CCDirector::sharedDirector()->getWinSize();
  20.  
  21. //创建菜单
  22. CCMenuItem* item = CCMenuItemFont::create("Click Me",this,menu_selector(Menu::menuHandler));
  23. //使用自定义的MyMenu创建菜单
  24. MyMenu* menu = MyMenu::create();
  25.  
  26. //添加菜单
  27. addChild(menu);
  28. //添加菜单
  29. menu->addChild(item);
  30. return true;
  31. }
  32.  
  33.  
  34. //响应菜单事件
  35. void Menu::menuHandler(CCObject*)
  36. {
  37. CCLog("I am Clicked");
  38. }


执行结果:


当点中“Click Me”不松手,会一直打印“ Iam Clicked”直到松手




猜你在找的Cocos2d-x相关文章