Cocos2d-x之MenuItem,cocos2d-xmenuitem
***************************************轉載請註明出處:http://blog.csdn.net/lttree********************************************
心情:唉,這幾天做一個安卓APP介面有點頭痛,糾結ING,第一次做啊,有點無從下手ING。。
本文:
上回說了Scene和Layer,這次來耍耍MenuItem,進行一下情境的切換。
還記得Scene的那張圖片嗎?
Scene一部分Layer另外一部分就是Menu了。
Menu就是菜單嘛,一個圖層一個菜單,多符合我們觀點啊,這個引擎還是挺人性化di~
Menu其實是一個容器,它裝載著一些菜單,Menu不能作為菜單的一個按鈕,
類似於:Menu就像一個籃子,裡面可以裝各種水果,但它本身不是水果。
對於,Menu,API上也有一個類繼承圖:
可以看到,其實Menu是Layer的一個子類。
也就是說,Menu也可以接受觸屏事件,它的優先順序為-128,優先順序相當高!(值越小,優先順序越高)
所以,一般它的觸屏時間會優於一般Layer。
恩,接下來說 cocos2d-x的button,也就是MenuItem:
恩,MenuItem是Node類的子類,它有三個子類,分別是:
MenuItemLabel 字元標籤菜單
MenuItemSprite 圖片菜單
MenuItemToggle 開關菜單
恩,再來分別說一下。
①.MenuItemLabel 使用文字菜單建立的功能表項目
API中解釋:
一個"label"形式的標籤功能表項目項目的抽象類別,任何支援LabelProtocol協議的節點都可以添加進來。
要注意一下,LabelProtocol有四個分支,其中第一個分支Label是cocos2d-x 3.0 新加進來的,
在2.x的系列中,有三種文本,分別是LabelTTF,LabelBMFont和LabelAtlas。其中3.0尤其提倡使用Lable代替LabelTTF和LabelBMFont,因為Label在渲染速度上較其快。
接下來,看看這四種:
1.Label::createWithTTF ---- 這是需要使用ttf格式字型檔的建立方式
來測試一下吧:
//擷取螢幕的長寬Size visibleSize = Director::getInstance()->getVisibleSize(); Point origin = Director::getInstance()->getVisibleOrigin();TTFConfig config("fonts/HelloKitty.ttf", 50); auto label1 = Label::createWithTTF(config, "Hello Cocos2d-x");label1->setPosition(Point(visibleSize.width/2, visibleSize.height*0.8));this->addChild(label1);
TTFConfig 將字型類型匯入,第一個參數表示存放位置,就是字型的ttf檔案,我上網下載了一個HelloKitty版本的 = =~(粉粉噠~),第二個參數是大小。
然後下面建立Label,用自己做的config來展現我們所需要輸出的內容。
接下來,兩步,老樣子,設定位置,然後加入到本層中,看一看我們做出來的吧~
這個字型....果真是HelloKitty啊 O(∩_∩)O~
2.Label::createWithSystemFont ----- 這是使用系統內建的字型進行建立,和原來2.x中的TTF類似
調用系統內建的字型,代碼是:
auto label2=Label::createWithSystemFont("Hello Cocos2d-x","Impact 常規",25);label2->setPosition(Point(visibleSize.width/2,visibleSize.height*0.7));this->addChild(label2);
當然,前面visibleSize 這個擷取螢幕大小的不要忘了喲,這裡就不重複寫了。
這個方法就是可以調用系統內建的字型,三個必備參數,第一個 輸出內容,第二個 調用字型的名稱,第三個 輸出字型的大小。
如果不知道自己系統有什麼字型:
Windows使用者,可以在 C盤Windows檔案夾下Fonts檔案夾中查看。
另外,如我的範例,字型名稱中包含中文是沒有問題的
3.Label::createWithBMFont ---- 通過靜態字型檔建立文本的方式,產生fnt檔案和對應的png圖片
這個就是用自己建立的字型,.fnt和.png圖片,.png是各個能輸出字元的圖片,.fnt存的是某個字元在Png中存放的位置,
具體關於製作fnt可以看這個 -> http://blog.csdn.net/qiurisuixiang/article/details/8984288
代碼大概是這樣的:
auto label3 = Label::createWithBMFont("fonts/myfont.fnt","Hello Cocos2d-x");label3->setPosition(Point(visibleSize.width/2,visibleSize.height*0.4));this->addChild(label3);
第一個參數是檔案存放的位置(.fnt 和 .png),第二個參數就是要輸出的內容。
4.Label::createWithCharMap ---- 這個是和2.x中Atlas形式建立對應的。不過這種有兩種形式匹配圖片中的文字,一種是直接設定每一塊字型的寬高數值擷取,另一種是通過fnt檔案的方式,但原理都是一樣的。
這種建立,需要有plist檔案或者plist檔案裡面的值ItemHeight(每一個文字的高度)itemWidth(每個文字的寬度),startCharMap(文字起始ascii碼)
一般這種的圖只會用來裝飾數字和字母。
所以,這種建立方式關鍵就是獲得每個文字的高度,寬度,無論存於.png還是.plist就無所謂了。
這個範例就沒有弄了。。。
大概代碼形式是這樣子的:
// .plistauto label4 = Label::createWithCharMap(".plist檔案存放位置");label4->setPosition(Point(visibleSize.width / 2, visibleSize.height*0.2));addChild(label4);label4->setString("Cocos2d-x");// .pngauto label4 = Label::createWithCharMap("png存放位置", 每個字高度, 每個字寬度,起始的ASCII 碼);label4->setPosition(Point(visibleSize.width / 2, visibleSize.height*0.2));addChild(label4);label4->setString("Cocos2d-x");
每個的最後一行就是要顯示的內容了。
恩,這次就到這裡了,講了下MenuItem的一些東東。
***************************************轉載請註明出處:http://blog.csdn.net/lttree********************************************
cocos2d-x中的CCMenuItemToggle::itemWithTarget被廢棄了
我在2.14版本中是用這個createWithTarget函數替代了,
CCMenuItemToggle *toggle=CCMenuItemToggle::createWithTarget(this,//回呼函數所在的類
menu_selector(HelloWorld::hello),//回呼函數
可以正確運行
cocos2d-x 怎判斷單擊與長按?
在ccTouchesBegan和ccTouchesEnded中記錄觸摸點的時間
在ccTouchesEnded判斷時間間隔 如2秒以上為長按,以下為單擊