恋舞游戏按键判断 用quick cocos2dxx怎么实现

cocos2dx技能冷却按钮游戏源码_cocos2d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:1,326贴子:
cocos2dx技能冷却按钮游戏源码收藏
技能图标点击时会有按下效果,抬起后开始冷却计时,冷却计时技术后该图标才可以再次进行点击。
1楼 13:04&|
登录百度帐号我的游戏推荐游戏
后查看最近玩过的游戏
内&&容:使用签名档&&
为兴趣而生,贴吧更懂你。或1392人阅读
cocos2d主要面向的是触摸屏幕设备的,在WINDOWS下的定位感觉多多少少就是相当于一个模拟器,因此并没有太多的PC下重要的键盘支持。然而响应键盘消息对于调试来说可以提供不少方便。下边就通过更改cocos2d-x的源码来添加键盘消息响应。
一,打开\cocos2dx\include\CCLayer.h
在CCLayer类的public下添加
virtual&void&processWin32KeyPress(UINT&message,WPARAM&wParam,LPARAM&lParam)
二,打开\cocos2dx\platform\win32\CCEGLView_win32.h
在CCEGLView类的定义上边声明
在CCEGLView类的private下添加变量
*m_pLayWin32K
在public下添加函数
void&SetWin32KeyLayer(CCLayer
&&&&m_pLayWin32Key
三,打开\cocos2dx\platform\win32\CCEGLView_win32.cpp
在文件开始部分添加
&CCLayer.h&
在CCEGLView构造函数中初始化CCLayer(NULL)
在WindowProc函数的开始部分添加
!= m_pLayWin32Key)
&&&&m_pLayWin32Key-&processWin32KeyPress(message,
wParam, lParam);
四,重新生成libcocos2d将新生成的libcocos2d.lib和libcocos2d.dll放到相应位置
这样就可以在自己的程序中捕获win32的消息了。只需要在某个Layer的初始化部分添加
CCDirector::sharedDirector()-&getOpenGLView()-&SetWin32KeyLayer(this);
然后重新继承虚函数processWin32KeyPress,就可以处理消息了。当然在Layer销毁前别忘记调用
CCDirector::sharedDirector()-&getOpenGLView()-&SetWin32KeyLayer(NULL);
另外,前几天想到了一个更加方便的办法
在模拟键盘的源文件中添加以下宏
#if(CC_TARGET_PLATFORM
== CC_PLATFORM_WIN32)
&windows.h&
KEY_DOWN(vk_code) (GetAsyncKeyState(vk_code) & 0x8000 ? 1 : 0)
KEY_UP(vk_code) (GetAsyncKeyState(vk_code) & 0x8000 ? 0 : 1)
然后在UPDATE函数中调用
#if(CC_TARGET_PLATFORM
== CC_PLATFORM_WIN32)&&&
if(KEY_DOWN(VK_DOWN))
这里响应的是下箭头键,需要响应其他键可以参考WinUser.h中其他虚拟键的宏。
要注意的是如何添加字符输入呢:
void HelloWorld:: processWin32KeyPress(UINT message,
WPARAM wParam,
LPARAM lParam)
WPARAM keyChar = 0x20;
switch (message)
case WM_LBUTTONDOWN:{
CCLog(&WM_LBUTTONDOWN&);
case WM_CHAR:{
& & & & & & keyChar = wP
& & & & & & CCLog(&WM_CHAR: %d&, keyChar);//字符输入部分
& & & & &}&
windows sdk 键盘输入:
因为大多数的PC只有一个键盘,所以所有运行中的WINDOWS程序必须共用它。WINDOWS 将负责把击键消息送到具有输入焦点的那个应用程序中去。尽管屏幕上可能同时有几个应用程序窗口,但一个时刻仅有一个窗口有输入焦点。有输入焦点的那个应用程序的标题条总是高亮度显示的。 实际上您可以从两个角度来看键盘消息:一是您可以把它看成是一大堆的按键消息的集合,在这种情况下,当您按下一个键时,WINDOWS就会发送一个WM_KEYDOWN给有输入焦点的那个应用程序,提醒它有一个键被按下。当您释放键时,WINDOWS又会发送一个WM_KYEUP消息,告诉有一个键被释放。您把每一个键当成是一个按钮;另一种情况是:您可以把键盘看成是字符输入设备。当您按下“a”键时,WINDOWS发送一个WM_CHAR消息给有输入焦点的应用程序,告诉它“a”键被按下。实际上WINDOWS
内部发送WM_KEYDOWN和WWM_KEYUP消息给有输入焦点的应用程序,而这些消息将通过调用TranslateMessage翻译成WM_CHAR消息。WINDOWS窗口过程函数将决定是否处理所收到的消息,一般说来您不大会去处理WM_KEYDOWN、WM_KEYUP消息,在消息循环中TranslateMessage函数会把上述消息转换成WM_CHAR消息。在我们的课程中将只处理WM_CHAR。
例子: (见光盘FirstWindow4)
#include &Windows.h&
#include &tchar.h&
HWND hWinM
TCHAR szClassName[] = _T(&MyClass&);
TCHAR szCaptionMain[] = _T(&My First Window!&);
TCHAR FontName[] = _T(&script&);
WNDCLASSEX stdWndC
WPARAM keyChar = 0x20; //0x20是空格的ascii码,保证没有按键的时候程序正常显示。
LRESULT CALLBACK ProcWinMain(&& HWND hWnd,&
&&&&&&&&&&&&&&&&&&&&&& UINT Msg,&
&&&&&&&&&&&&&&&&&&&&&& WPARAM wParam,&
&&&&&&&&&&&&&&&&&&&&&& LPARAM lParam&
&&& PAINTSTRUCT stPs;
&&& HDC hDC;
&&& HFONT hFont,hOldF
&&& switch(Msg)
&&& &&& case WM_PAINT:
&&& &&& &&& hDC = BeginPaint(hWnd,&stPs);
&&& &&& &&& hFont = CreateFont(24,16,0,0,400,0,0,0,OEM_CHARSET,OUT_DEFAULT_PRECIS,
&&& &&& &&& &&& CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SCRIPT,FontName);
&&& &&& &&& hOldFont = (HFONT)SelectObject(hDC,hFont);
&&& &&& &&& SetTextColor(hDC,RGB(200,200,50));
&&& &&& &&& SetBkColor(hDC,RGB(0,0,255));
&&& &&& &&& TextOut(hDC,0,0,(char *)&keyChar,1);
&&& &&& &&& SelectObject(hDC,hOldFont);
&&& &&& &&& EndPaint(hWnd,&stPs);
&&& &&& case WM_CHAR:
&&& &&& &&& {
&&& &&& &&& &&& keyChar = wP
&&& &&& &&& &&& InvalidateRect(hWnd,NULL,TRUE);
&&& &&& &&& }
&&& &&& &&&
&&& &&& case WM_DESTROY:
&&& &&& &&& PostQuitMessage(NULL);
&&& &&& default:
&&& &&& &&& return DefWindowProc(hWnd, Msg, wParam, lParam );&
&&& return 0;
int WINAPI WinMain(&&&& HINSTANCE hInstance,
&&&&&&&&&&&&&&&&&&&&&&& HINSTANCE hPrevInstance,
&&&&&&&&&&&&&&&&&&&&&&& LPSTR lpCmdLine,
&&&&&&&&&&&&&&&&&&&&&&& int nCmdShow
&&& MSG stM
&&& WNDCLASSEX stdWndC
&&& RtlZeroMemory(&stdWndClass, sizeof(stdWndClass));
&&& stdWndClass.hCursor = LoadCursor(0,IDC_ARROW);
&&& stdWndClass.cbSize = sizeof(stdWndClass);
&&& stdWndClass.style = CS_HREDRAW|CS_VREDRAW;
&&& stdWndClass.lpfnWndProc = ProcWinM
&&& stdWndClass.hbrBackground = (HBRUSH)COLOR_WINDOW;
&&& stdWndClass.lpszClassName = szClassN
&&& stdWndClass.hInstance = hI
&&& RegisterClassEx(&stdWndClass);
&&& hWinMain = CreateWindowEx(WS_EX_CLIENTEDGE,szClassName,szCaptionMain,\
&&& && WS_OVERLAPPEDWINDOW,100,100,600,400,NULL,NULL,hInstance,NULL);
&&& if(!hWinMain)
&&& &&& return 0;
&&& ShowWindow(hWinMain,SW_SHOWNORMAL);
&&& UpdateWindow(hWinMain);
&&& while(GetMessage(&stMsg,NULL,0,0))
&&&&&&& TranslateMessage(&stMsg);
&&& &&& DispatchMessage(&stMsg);
&&& return stMsg.wP
WPARAM keyChar = 0x20;&
这个变量将保存从键盘接收到的字符。因为它是在窗口过程中通过WPARAM型变量传送的,所以我们简单地把它定义为WPARAM型。由于我们的窗口在初次刷新时(也即刚被创建的那一次)是没有键盘输入的所以我们把他设成空格符(20h),这样显示时您就什么都看不见。
&&&&&&&&&&&case WM_CHAR:
&& &&&& &&& {
&& &&&& &&& &&&&& keyChar = wP
&& &&&& &&& &&&&& InvalidateRect(hWnd,NULL,TRUE);
&& &&&& &&& }
这一段是用来处理WM_CHAR消息的。它把接收到的字符放入变量keyChar&中,接着调用InvalidateRect,而InvalidateRect使得窗口的客户区无效,这样它会发出WM_PAINT消息,而WM_PAINT消息迫使WINDOWS重新绘制它的客户区。该函数的语法如下:
BOOL InvalidateRect(
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& HWND&,&// handle to window&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CONST RECT*&,&// rectangle coordinates&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& BOOL&&// erase state&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& );
lpRect是指向客户区我们想要其无效的一个正方形结构体的指针。如果该值等于NULL,则整个客户区都无效;布尔值bErase告诉WINDOWS是否擦除背景,如果是TRUE,则WINDOWS在调用BeginPaint函数时把背景擦掉。 所以我们此处的做法是:我们将保存所有有关重绘客户区的数据,然后发送WM_PAINT消息,处理该消息的程序段然后根据相关数据重新绘制客户区。尽管这么做事有点像走了弯路,但WINDOWS要处理那么庞大的消息群,没有一定的规矩可不行。 实际上我们完全可以通过调用GetDC 获得设备上下文句柄,然后绘制字符,然后再调用ReleaseDC释放设备上下文句柄,毫无疑问这样也能在客户区绘制出正确的字符。但是如果这之后接收到WM_PAINT消息要处理时,客户区会重新刷新,而我们这稍前所绘制的字符就会消失掉。所以为了让字符一直正确地显示,就必须把它们放到WM_PAINT的处理过程中处理。而在本消息处理中发送WM_PAINT消息即可。
&&& TextOut(hDC,0,0,(char *)&keyChar,1);
在调用InvalidateRect时,WM_PAINT消息被发送到了WINDOWS窗口处理过程,程序流程转移到处理WM_PAINT消息的程序段,然后调用BeginPaint得到设备上下文的句柄,再调用TextOut在客户区的(0,0)处输出保存的按键字符。这样无论您按什么键都能在客户区的左上角显示,不仅如此,无论您怎么缩放窗口(迫使WINDOWS重新绘制它的客户区),字符都会在正确的地方显示,所以必须把所有重要的绘制动作都放到处理WM_PAINT消息的程序段中去。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:200866次
积分:3817
积分:3817
排名:第2802名
原创:132篇
转载:70篇
译文:21篇
评论:58条
文章:20篇
阅读:19107
(2)(4)(5)(11)(10)(8)(20)(11)(15)(27)(9)(5)(9)(9)(4)(8)(6)(3)(10)(7)(3)(6)(2)(7)(19)(1)(3)shahdza 的BLOG
用户名:shahdza
文章数:91
评论数:37
访问量:48951
注册日期:
阅读量:8800
51CTO推荐博文
【唠叨】&&&&菜单按钮在游戏中是经常被用到的,比如主菜单界面的菜单选项,暂停游戏时的菜单选项等等。cocos2dx引擎同样为我们提供了CCMenu菜单的功能,并包含了一些简单的菜单项CCMenuItem。且菜单项附带触碰按钮时,自动放大的效果。&&&&温馨提示:本节内容比较多,需要大家慢慢分析,不要急于求成。&&&&本节组织结构如下:&&&&&&&&一、介绍CCMenu。&&&&&&&&二、介绍CCMenuItem,及其具体的六个子类。&&&&&&&&三、代码实战。&【Demo下载】&&&&【3.x】&&&&(1)去掉“CC”&&&&(2)其他函数的增加与删除稍微做了变化,可以自己在开发过程中掌握。【菜单CCMenu】& & 菜单CCMenu是专门用来承载菜单按钮的CCLayer图层,图层中的子节点只能够是菜单项CCMenuItem或其子类。通常先创建菜单项CCMenuItem,然后使用一个或多个菜单项生成菜单CCMenu,最后把CCMenu加入当前CCLayer图层。&&&&继承关系如下:650) this.width=650;" src="/wyfs02/M01/46/66/wKiom1PyGeLwiqSkAAC2BHs3kNk112.jpg" title="0.jpg" alt="wKiom1PyGeLwiqSkAAC2BHs3kNk112.jpg" />&&&&如果直接在层中添加CCMenuItem也可以正常显示,但是无法响应回调函数,因为CCMenu是继承至CCLayer,也就继承了触摸的相关事件,而CCMenuItem只是从CCNode继承而来,并不响应触摸,因此无法调用回调函数。&&&&由于CCMenu的父类为CCLayer,所以锚点为(0,0),且无法设置锚点。CCMenu的默认原点坐标为屏幕正中心(winSize.width/2, winSize.height/2)。&&&&而对于CCMenuItem是添加在CCMenu层中的,所以CCMenuItem的位置是相对于CCMenu层的偏移位置。CCMenuItem相对于CCMenu的偏移量默认为(0,0),且菜单项的锚点默认为(0.5,0.5)。&&&&如下图所示:650) this.width=650;" src="/wyfs02/M02/46/66/wKiom1PyGhazezFYAAB0kAJ72QE656.jpg" style="float:" title="default1.png" alt="wKiom1PyGhazezFYAAB0kAJ72QE656.jpg" />650) this.width=650;" src="/wyfs02/M01/46/68/wKioL1PyGy-Ca5WsAACkYHacv9s417.jpg" style="float:" title="setPosition.png" alt="wKioL1PyGy-Ca5WsAACkYHacv9s417.jpg" />&&&&值得注意的是:CCMenu包含了多个子菜单项,每个子菜单项的位置都不一样,如果定义了CCMenu的位置,那它作为父节点会影响到所有的子菜单项的位置,所以一般我们都是吧CCMenu的位置设置在CCPointZero,然后设置CCMenuItem的位置(也就是相对父节点的偏移量)来定位整个菜单。&&&&常用操作如下://
class&CC_DLL&CCMenu&:&public&CCLayerRGBA
创建菜单的三个常用方法
//创建一个空菜单
static&CCMenu*&create();
//CCMenu::create(item1,item2,item3,NULL);
//用CCMenuItem菜单项创建菜单,最后以NULL表示结束.
static&CCMenu*&create(CCMenuItem*&item,&...);
//用一个包含CCMenuItem的CCArray数组来创建菜单
static&CCMenu*&createWithArray(CCArray*&pArrayOfItems);
菜单布局方式
注意:使用以下函数进行菜单布局时,将会把整体菜单项的相对于CCMenu的偏移坐标设置到(0,0)。
所以布局后,应该设置CCMenu菜单的坐标为屏幕正中心(winSize.width/2,&winSize.height/2),效果更加。
alignItemsVertically&,&alignItemsHorizontally&,&
alignItemsInColumns&,&alignItemsInRows
//让menu的所有item竖着布局
void&alignItemsVertically();&//默认间隙:5个像素
void&alignItemsVerticallyWithPadding(float&padding);&//相连两个item间隔为padding
//让menu的所有item横着布局
//item1&&item2 item3
void&alignItemsHorizontally();&//默认间隙:5个像素
void&alignItemsHorizontallyWithPadding(float&padding);&//相连两个item间隔为padding
//将items进行分组,然后按列(columns)进行排列
//每一组在同一行,参数columns表示每一组的菜单项个数,并以NULL表示结束。
//alignItemsInColumns(3,2,1,NULL);
//item1&item2&item3
// item4&item5
void&alignItemsInColumns(unsigned&int&columns,&...);
//将items进行分组,然后按行(rows)进行排列。与上述类似。
//alignItemsInRows(3,2,1,NULL);
void&alignItemsInRows(unsigned&int&rows,&...);
添加、删除item菜单项
addChild&,&removeChild
virtual&void&addChild(CCNode&*&child);
virtual&void&addChild(CCNode&*&child,&int&zOrder);
virtual&void&addChild(CCNode&*&child,&int&zOrder,&int&tag);
virtual&void&removeChild(CCNode*&child,&bool&cleanup);
设置菜单是否可用
setEnabled
virtual&void&setEnabled(bool&value)&{&m_bEnabled&=&&};
virtual&bool&isEnabled()&{&return&m_bE&}
//【菜单项CCMenuItem】&&&&CCMenuItem继承自CCNode,所以它的子类菜单项都可以使用CCNode的相关操作。&&&&CCMenuItem是所有菜单项的父类,建议不要直接使用该类,因为它并不包含具体显示的功能。&&&&作为其它菜单项的父类,主要提供了一下三个功能:&&&&&&&&(1)提供了基本按钮的状态:正常、选中、禁用。&&&&&&&&(2)为按钮实现了基本的回调函数机制。当玩家点积按钮后,就会调用执行相应的回调函数。&&&&&&&&(3)触碰菜单项,附有自动放大效果。&&&&菜单项的子类可以分成三类,总共六个:&&&&&&&&(1)文字菜单项:CCMenuItemLabel、CCMenuItemAtlasFont、CCMenuItemFont;&&&&&&&&(2)图片菜单项:CCMenuItemSprite、CCMenuItemImage;&&&&&&&&(3)切换菜单项:CCMenuItemToggle。&&&&继承关系如下图所示:650) this.width=650;" src="/wyfs02/M01/46/66/wKiom1PyGrqSBYhnAADa1NhKMVg002.jpg" title="1.jpg" alt="wKiom1PyGrqSBYhnAADa1NhKMVg002.jpg" />1、CCMenuItemLabel&&&&CCMenuItemLabel是一个包含了文字标签的菜单项按钮,CCLabel的三个标签CCLabelBMFont ,CCLabelAtlas,CCLabelTTF对象,都可以放置在该按钮对象中。&&&&常用操作如下://
class&CC_DLL&CCMenuItemLabel&:&public&CCMenuItem
创建CCMenuItemLabel
支持字体标签类:CCLabelBMFont&,&CCLabelAtlas&,&CCLabelTTF&
//用label字体标签创建,不设置回调响应事件。
//label可以是CCLabelBMFont&,&CCLabelAtlas&,&CCLabelTTF三种文字标签。
static&CCMenuItemLabel*&create(CCNode&*label);
//用label字体标签创建,并设置回调响应事件。
target:执行当前按钮的对象,一般为this。表示由CCLayer图层执行回调响应事件。
selector:使用菜单回调函数menu_selector。一般在当前CCLayer图层中定义。
//create(&label,&this&,&menu_selector(&HelloWorld::func1&)&);
static&CCMenuItemLabel&*&create(CCNode*label,&CCObject*&target,&SEL_MenuHandler&selector);
setString&,&setEnabled&,&setDisabledColor&,&setLabel
//设置内部字体标签(CCLabel)的显示文字内容
void&setString(const&char&*&label);
//设置该CCMenuItemLabel对象是否可用
virtual&void&setEnabled(bool&enabled);
virtual&bool&isSelected();
//禁用时的颜色
virtual&void&setDisabledColor(ccColor3B&);
virtual&const&ccColor3B&&getDisabledColor();
//被渲染的字体,可以是CCLabelBMFont&,&CCLabelAtlas&,&CCLabelTTF。
virtual&void&setLabel(CCNode*);
virtual&CCNode*&getLabel();
//2、CCMenuItemAtlasFont&&&&CCMenuItemAtlasFont的父类为CCMenuItemLabel。&&&&和父类的区别在于:该类在创建时,只要设置显示内容、使用的字体资源.png即可。它默认使用CCLabelAtlas来创建文字标签的菜单项按钮。而省去了父类创建label的步骤。&&&&该类和父类相比,并未做其他属性或函数的扩展。&&&&常用操作如下://
class&CC_DLL&CCMenuItemFont&:&public&CCMenuItemLabel
创建CCMenuItemFont
//创建基于CCLabelAtlas字体标签的CCMenuItemAtlasFont,不带回调响应事件。
//create(""&,&"digit.png"&,&20&,&20&,&'0'&);
//create(""&,&"digit.png"&,&20&,&20&,&'0'&,&this&,&menu_selector(&HelloWorld::func2&)&);
static&CCMenuItemAtlasFont*&create(const&char&*value,&const&char&*charMapFile,&int&itemWidth,&int&itemHeight,&char&startCharMap);
static&CCMenuItemAtlasFont*&create(const&char&*value,&const&char&*charMapFile,&int&itemWidth,&int&itemHeight,&char&startCharMap,&CCObject*&target,&SEL_MenuHandler&selector);
//3、CCMenuItemFont&&&&CCMenuItemAtlasFont的父类为CCMenuItemLabel。&&&&和父类的区别在于:该类在创建时,只要设置显示内容即可。它默认使用CCLabelTTF来创建文字标签的菜单项按钮。而省去了父类创建label的步骤。&&&&和父类相比,可以设置字体大小。&&&&常用操作如下://
class&CC_DLL&CCMenuItemFont&:&public&CCMenuItemLabel
创建CCMenuItemFont
//create(要显示的字符串)
//create(要显示的字符串,执行当前按钮的对象,回调函数)
target:执行当前按钮的对象,一般为this。表示由CCLayer图层执行回调响应事件。
selector:使用菜单回调函数menu_selector。一般在当前CCLayer图层中定义。
//create(&"hello"&,&this&,&menu_selector(&HelloWorld::func3&)&);
static&CCMenuItemFont&*&create(const&char&*value);
static&CCMenuItemFont&*&create(const&char&*value,&CCObject*&target,&SEL_MenuHandler&selector);
//这是一个全局静态方法,用来设置新创建CCMenuItemFont时的默认字体大小的
//在不进行设置时,创建的CCMenuItemFont,默认大小为32。
//CCMenuItemFont::setFontSize(32);
static&void&setFontSize(unsigned&int&s);
static&unsigned&int&fontSize();
//这是一个全局静态方法,用来设置新创建CCMenuItemFont时的默认字体资源.fnt的
//在不进行设置时,创建的CCMenuItemFont,默认字体为"Marker&Felt"。
//CCMenuItemFont::setFontName("Arial");
static&void&setFontName(const&char&*name);
static&const&char&*fontName();
//设置该对象的字体大小及使用的字体资源名.fnt
void&setFontSizeObj(unsigned&int&s);
unsigned&int&fontSizeObj();
void&setFontNameObj(const&char*&name);
const&char*&fontNameObj();
//4、CCMenuItemSprite&&&&CCMenuItemSprite是一个由精灵对象组成的菜单按钮。&&&&此类的内部属性提供了三个精灵对象,分别表示按钮的三个状态:正常、选中、禁用。每种状态都分别对应了一个精灵图片。&&&&精灵是引擎中最为丰富和自由的元素,因此类CCMenuItemSprite算得上是将精灵和按钮功能的结合体。&&&&常用操作如下://
class&CC_DLL&CCMenuItemSprite&:&public&CCMenuItem
创建CCMenuItemSprite
normalSprite:&&正常时的默认精灵normalSprite
selectedSprite:被选中时的精灵selectedSprite
disabledSprite:禁用时的精灵disabledSprite
target:执行当前按钮的对象,一般为this。表示由CCLayer图层执行回调响应事件。
selector:使用菜单回调函数menu_selector。一般在当前CCLayer图层中定义。
//CCSprite*&normalSprite&=&CCSprite::create("sp1.png");
//CCSprite*&selectedSprite&=&CCSprite::create("sp2.png");
//CCSprite*&disabledSprite&=&CCSprite::create("sp3.png");
//create(normalSprite,&selectedSprite,&disabledSprite,&this,&menu_selector(HelloWorld::func4)&);
static&CCMenuItemSprite&*&create(CCNode*&normalSprite,&CCNode*&selectedSprite,&CCNode*&disabledSprite&=&NULL);
static&CCMenuItemSprite&*&create(CCNode*&normalSprite,&CCNode*&selectedSprite,&CCObject*&target,&SEL_MenuHandler&selector);
static&CCMenuItemSprite&*&create(CCNode*&normalSprite,&CCNode*&selectedSprite,&CCNode*&disabledSprite,&CCObject*&target,&SEL_MenuHandler&selector);
设置三种状态的精灵CCSprite
//正常时的默认图片normalSprite
//被选中时的图片selectedSprite
//禁用时的图片disabledSprite
virtual&void&setNormalImage(CCNode*&normalSprite);
virtual&CCNode*&getNormalImage();
virtual&void&setSelectedImage(CCNode*&selectedSprite);
virtual&CCNode*&getSelectedImage();
virtual&void&setDisabledImage(CCNode*&disabledSprite);
virtual&CCNode*&getDisabledImage();
设置选中、禁用
virtual&void&selected();&//选中
virtual&void&unselected();&//取消选中
virtual&void&setEnabled(bool&bEnabled);&//是否启用。false禁用。
//5、CCMenuItemImage&&&&CCMenuItemImage继承自CCMenuItemSprite,并没有太大的变化。只是提供了更为简捷的方式,将原本按钮中的精灵对象换为了三张纹理图片。无需创建精灵对象,就可以直接创建一个精灵按钮对象。&&&&与父类相比,省去了创建CCSprite精灵对象的过程。实际上在create创建的过程中,已经帮你做了创建CCSprite的过程了。&&&&常用操作如下://
class&CC_DLL&CCMenuItemImage&:&public&CCMenuItemSprite
创建CCMenuItemImage
//与CCMenuItemSprite创建方式差不多。就是参数变成了图片资源(如*.png)
//create("sp1.png",&"sp2.png",&"sp3.png",&this,&menu_selector(HelloWorld::func5)&);
static&CCMenuItemImage*&create(const&char&*normalImage,&const&char&*selectedImage);
static&CCMenuItemImage*&create(const&char&*normalImage,&const&char&*selectedImage,&const&char&*disabledImage);
static&CCMenuItemImage*&create(const&char&*normalImage,&const&char&*selectedImage,&CCObject*&target,&SEL_MenuHandler&selector);
static&CCMenuItemImage*&create(const&char&*normalImage,&const&char&*selectedImage,&const&char&*disabledImage,&CCObject*&target,&SEL_MenuHandler&selector);
//用CCSpriteFrame精灵帧,设置正常时的精灵帧Normal
void&setNormalSpriteFrame(CCSpriteFrame*&frame);
//用CCSpriteFrame精灵帧,设置选中时的精灵帧Selected
void&setSelectedSpriteFrame(CCSpriteFrame*&frame);
//用CCSpriteFrame精灵帧,设置禁用时的精灵帧Disabled
void&setDisabledSpriteFrame(CCSpriteFrame*&frame);
//6、CCMenuItemToggle&&&&CCMenuItemToggle是比较特殊的。它在内部拥有一个CCMenuItem菜单项数组,用来负责展示不同的菜单项按钮状态。因为使用了一个菜单按钮的数组,所以此类的对象可以实现状态的切换。此类是一个菜单项按钮对象的集合,能够包含很多的菜单项按钮状态,方便开发者进行切换。&&&&例如,CCMenuItemToggle可以用来做开关按钮。&&&&常用操作如下://
class&CC_DLL&CCMenuItemToggle&:&public&CCMenuItem
创建CCMenuItemToggle
create&或&createWithTarget
//使用一个菜单项创建CCMenuItemToggle对象
//CCMenuItemFont*&item&=&CCMenuItemFont::create("hello");
//CCMenuItemToggle::create(item);
static&CCMenuItemToggle*&create(CCMenuItem&*item);
//使用菜单项参数列表创建,以NULL结束列表
//item1&=&CCMenuItemFont::create("hello");
//item2&=&CCSprite::create("sp1.png"):
//createWithTarget(this,&menu_selector(HelloWorld::func6),&item1,&item2,&NULL);
static&CCMenuItemToggle*&createWithTarget(CCObject*&target,&SEL_MenuHandler&selector,&CCMenuItem*&item,&...);&&
//使用包含菜单项的数组创建
//createWithTarget(this,&menu_selector(HelloWorld::func6),&pArray);
static&CCMenuItemToggle&*&createWithTarget(CCObject*&target,&SEL_MenuHandler&selector,&CCArray*&menuItems);
菜单项数组集合相关
setSelectedIndex&,&selectedItem&,
setSubItems&,&addSubItem
//设置当前选中的CCMenuItem的索引值(即数组下标)
virtual&void&setSelectedIndex(unsigned&int&);
virtual&unsigned&int&getSelectedIndex();
//返回当前选中的菜单项
CCMenuItem*&selectedItem();&
//设置CCMenuItem菜单项数组集合
virtual&void&setSubItems(CCArray*&);
virtual&CCArray*&getSubItems();
//添加新的子菜单项
void&addSubItem(CCMenuItem&*item);&
//【代码实战】&&&&首先,在实战的过程中会遇到有关回调函数的概念,这里就简单来说一下什么事回调函数。&&&&回调函数其实就是:当按钮被触碰时,会执行相应的函数。类似于鼠标点击绑定的click响应事件处理函数。1、在HelloWorldScene.h中添加如下两个回调函数//
//添加回调响应函数
void&menuItemFont2Func(CCObject*&sender);&//更改标签内容
void&menuItemToggleFunc(CCObject*&sender);&//更改状态:正常,选中,禁用
//&&&&2、编写测试代码//
bool&HelloWorld::init()
if&(&!CCLayer::init()&)
//获取可视区域尺寸大小
CCSize&mysize&=&CCDirector::sharedDirector()-&getVisibleSize();
//获取可视区域的原点位置
CCPoint&origin&=&CCDirector::sharedDirector()-&getVisibleOrigin();
//屏幕正中心位置
CCPoint&midPos&=&ccp(mysize.width/2,&mysize.height/2);
&* 创建CCMenuItemLabel
使用CCLabelTTF创建
CCLabelTTF*&lb1&=&CCLabelTTF::create("aaaaaa",&"Arial",&32);
CCMenuItemLabel*&menuItemLabel&=&CCMenuItemLabel::create(lb1);
//设置位置
menuItemLabel-&setPosition(&ccp(120,&mysize.height-50)&);&
&* 创建CCMenuItemAtlasFont
创建方式与CCLabelAtlas类似
CCMenuItemAtlasFont*&menuItemAtlas&=&CCMenuItemAtlasFont::create("",&"fonts/digit.png",&20,&20,&'0');
menuItemAtlas-&setPosition(&ccp(120,&mysize.height-120)&);
&* 创建CCMenuItemFont
创建了两个,有无附带回调响应函数
//设置CCMenuItemFont创建时的默认字体大小
CCMenuItemFont::setFontSize(50);
//不带回调响应函数,tag编号为1
CCMenuItemFont*&menuItemFont1&=&CCMenuItemFont::create("11111");
menuItemFont1-&setTag(1);
//触碰后,执行回调函数menuItemFont2Func。更改menuItemFont1的内容
CCMenuItemFont*&menuItemFont2&=&CCMenuItemFont::create("Change1",&this,&menu_selector(HelloWorld::menuItemFont2Func)&);&//回调
menuItemFont2-&setFontSizeObj(32);&//设置字体大小
menuItemFont1-&setPosition(&ccp(120,&mysize.height-190)&);&//设置位置
menuItemFont2-&setPosition(&ccp(120,&mysize.height-260)&);&//设置位置
&* 创建CCMenu,tag编号为100
菜单项menuItemLabel,&menuItemAtlas,&menuItemFont1,&menuItemFont2
CCMenu*&menu&=&CCMenu::create(menuItemLabel,&menuItemAtlas,&menuItemFont1,&menuItemFont2,&NULL);
//设置位置为(0,0),与HelloWorld层重合
menu-&setPosition(CCPointZero);&
//将CCMenu菜单添加到CCLayer中,&tag编号为100
this-&addChild(menu,&0,&100);&
&* 创建CCMenuItemSprite
参数为CCSprite精灵
CCSprite*&sp1&=&CCSprite::create("sp1.png");
CCSprite*&sp2&=&CCSprite::create("sp2.png");
CCSprite*&sp3&=&CCSprite::create("sp3.png");
CCMenuItemSprite*&menuItemSprite&=&CCMenuItemSprite::create(sp1,&sp2,&sp3&);
menuItemSprite-&setPosition(&ccp(mysize.width/2&+&50,&mysize.height/2&+&50)&);
menu-&addChild(menuItemSprite);&//添加到菜单层中
menuItemSprite-&setTag(2);&//tag编号为2
&* 创建CCMenuItemImage
参数变成纹理图片png
//使用CCMenuItemImage创建一个关闭程序的菜单项按钮
CCMenuItemImage*&menuItemImage&=&CCMenuItemImage::create("CloseNormal.png",&"CloseSelected.png",&this,&menu_selector(HelloWorld::menuCloseCallback)&);&//回调
menuItemImage-&setPosition(&ccp(mysize.width&-&40,&mysize.height&-&40)&);
menu-&addChild(menuItemImage);&//添加到菜单层中
&* 创建CCMenuItemToggle
参数为CCMenuItem子类
CCMenuItemFont::setFontSize(20);
CCMenuItemFont*&menuItemFont3&=&CCMenuItemFont::create("Toggle_Normal");
CCMenuItemFont*&menuItemFont4&=&CCMenuItemFont::create("Toggle_Selected");
CCMenuItemImage*&menuItemImage2&=&CCMenuItemImage::create("sp3.png",&"sp1.png");
//创建CCMenuItemToggle,回调函数:更改menuItemSprite的状态。
CCMenuItemToggle*&menuItemToggle&=&CCMenuItemToggle::createWithTarget(this,&menu_selector(HelloWorld::menuItemToggleFunc),&
menuItemFont3,&menuItemFont4,&NULL&);&//菜单项参数列表
menuItemToggle-&setPosition(&ccp(mysize.width/2&+&50,&mysize.height/2&-&50)&);&//设置位置
//将menuItemImage2添加到menuItemToggle中
menuItemToggle-&addSubItem(menuItemImage2);
menu-&addChild(menuItemToggle);&//添加到菜单层中
//&&&&3、编写回调响应函数的代码//
回调函数menuItemFont2Func
//变化menuItemFont1的内容
void&HelloWorld::menuItemFont2Func(CCObject*&sender)
//获取menuItemFont2
CCMenuItemFont*&menuItemFont2&=&(CCMenuItemFont*)
//从CCLayer中获取CCMenu菜单
CCMenu*&menu&=&(CCMenu*)this-&getChildByTag(100);
//获取menuItemFont1,其tag为1
//!!!注意!!!
tag是相对父节点而言的:this的子节点中没有tag为1,而menuItemFont1是menu中tag为1的子节点。
CCMenuItemFont*&menuItemFont1&=&(CCMenuItemFont*)menu-&getChildByTag(1);
//更改menuItemFont1的内容
//获取menuItemFont2显示的标签内容
CCLabelTTF*&lb&=&(CCLabelTTF*)menuItemFont2-&getLabel();
//strcmp判断是否等于Change1
if(&strcmp(&lb-&getString()&,&"Change1")&==&0&)&{&
lb-&setString("Change2");
menuItemFont1-&setString("22222");
lb-&setString("Change1");
menuItemFont1-&setString("11111");
回调函数menuItemToggleFunc
//更改状态:正常,选中,禁用
void&HelloWorld::menuItemToggleFunc(CCObject*&sender)
//获取menuItemToggle
CCMenuItemToggle*&menuItemToggle&=&(CCMenuItemToggle*)
//从CCLayer中获取CCMenu菜单
CCMenu*&menu&=&(CCMenu*)this-&getChildByTag(100);
//获取menuItemSprite
CCMenuItemSprite*&menuItemSprite&=&(CCMenuItemSprite*)menu-&getChildByTag(2);
//根据menuItemToggle当前被选中的是哪一项,来设置menuItemSprite的状态
switch(&menuItemToggle-&getSelectedIndex()&)&{
case&0:&//正常
menuItemSprite-&setEnabled(true);
case&1:&//选中
menuItemSprite-&selected();
case&2:&//禁用
menuItemSprite-&setEnabled(false);
//4、运行结果截图650) this.width=650;" src="/wyfs02/M02/46/69/wKioL1PyIOjQRL_uAAC3xFJM1q4920.jpg" style="float:" title="11.jpg" alt="wKioL1PyIOjQRL_uAAC3xFJM1q4920.jpg" />&&&&&&&&点击Change1按钮,执行回调函数menuItemFont2Func。“11111”变成“22222”。650) this.width=650;" src="/wyfs02/M00/46/69/wKioL1PyIOiSLRafAADGXTBUqr8759.jpg" style="float:" title="22.jpg" alt="wKioL1PyIOiSLRafAADGXTBUqr8759.jpg" />&&&&&&&&点击“Toggle_Normal”按钮,精灵图片变成选中时的图片。650) this.width=650;" src="/wyfs02/M02/46/67/wKiom1PyH9Ci0KtfAADLWYTwHss211.jpg" style="float:" title="33.jpg" alt="wKiom1PyH9Ci0KtfAADLWYTwHss211.jpg" />&&&&&&&&再次点击“Toggle_Selected”按钮,精灵图片变成禁用时的图片。650) this.width=650;" src="/wyfs02/M01/46/69/wKioL1PyIOjxRGCbAAC71TTXhvw219.jpg" style="float:" title="44.jpg" alt="wKioL1PyIOjxRGCbAAC71TTXhvw219.jpg" />本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
15:34:39 22:40:08

我要回帖

更多关于 cocos2dx 教程 的文章

 

随机推荐