zl程序教程

您现在的位置是:首页 >  其它

当前栏目

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

实现 自己 定义 菜单 cocos2d
2023-09-27 14:25:17 时间

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

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

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

/*
	1)注冊定时器函数,在定时器处理函数中,调用m_pSelectItem->active()
*/
class MyMenu : public CCMenu
{
public:
	CREATE_FUNC(MyMenu);
    
    //当手按下的时候
	bool ccTouchBegan(CCTouch* touch, CCEvent* ev)
	{
                bool bRet = CCMenu::ccTouchBegan(touch, ev);
		
                if (bRet)
		{
			// 注冊定时器函数
			scheduleUpdate();

			return true;
		}

		return false;
	}

	void ccTouchEnded(CCTouch* touch, CCEvent* ev)
	{
                //定时器停止计时
		unscheduleAllSelectors();
	}

	//每次帧循环都会被调用
        //dt上一次帧循环到这次帧循环所花的时间
	void update(float dt)
	{
		if (this->m_pSelectedItem && m_eState == kCCMenuStateTrackingTouch)
		{
			this->m_pSelectedItem->activate();
		}
	}
};


在Menu.h中加入以下的代码(代码中包括了自己定义的MyMenu类)

#ifndef __Menu_H__
#define __Menu_H__

#include "cocos2d.h"
USING_NS_CC;

class Menu : public CCLayer
{
public:
    virtual bool init();  

    static CCScene* scene();
    
    //响应菜单事件
    void menuHandler(CCObject*);
    
    CREATE_FUNC(Menu);
};


/*
	1)注冊定时器函数,在定时器处理函数中,调用m_pSelectItem->active()
*/
class MyMenu : public CCMenu
{
public:
	CREATE_FUNC(MyMenu);
    
    //当手按下的时候
	bool ccTouchBegan(CCTouch* touch, CCEvent* ev)
	{
                bool bRet = CCMenu::ccTouchBegan(touch, ev);
		
                if (bRet)
		{
			// 注冊定时器函数
			scheduleUpdate();

			return true;
		}

		return false;
	}

	void ccTouchEnded(CCTouch* touch, CCEvent* ev)
	{
                //定时器停止计时
		unscheduleAllSelectors();
	}

	//每次帧循环都会被调用
        //dt上一次帧循环到这次帧循环所花的时间
	void update(float dt)
	{
		if (this->m_pSelectedItem && m_eState == kCCMenuStateTrackingTouch)
		{
			this->m_pSelectedItem->activate();
		}
	}
};

#endif // Menu

在Menu.cpp中加入以下的代码

#include "Menu.h"

CCScene* Menu::scene()
{
    CCScene *scene = CCScene::create();
    
    Menu *layer = Menu::create();

    scene->addChild(layer);

    return scene;
}

bool Menu::init()
{
    //初始化父类层
    CCLayer::init();

    //得到窗体的尺寸
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();

    //创建菜单项
    CCMenuItem* item = CCMenuItemFont::create("Click Me", 
			this, menu_selector(Menu::menuHandler));
    
    //使用自己定义的MyMenu创建菜单
    MyMenu* menu = MyMenu::create();

    //加入菜单
    addChild(menu);
    
    //加入菜单项
    menu->addChild(item);
    
    return true;
}


//响应菜单事件
void Menu::menuHandler(CCObject*)
{
    CCLog("I am Clicked");
}


运行结果:


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