在玩游戲的過程中,按鈕可算是界面里最不可缺少的元素,可以說UI交互基本上都是各種按鈕對玩家之間的交互,其實開始寫的時候有點猶豫不決,到底是否要將按鈕放在最前面,思量了很久之后才發現,沒這個部分的例子,后面幾乎都不好走下去,一些交互操作全部都可以通過按鈕來完成,省去很多的講解麻煩。
關於按鈕 |
在cocos2d-x引擎中提供了幾個常用按鈕,他們是:
CCMenuItemFont
CCMenuItemLabel
CCMenuItemImage
CCMenuItemSprite
其實還有一個CCMenuItemToggle以后再專門提它。
這些按鈕都是繼承自CCMenuItem,這個類在結構上表現為CCMenu的子項,CCMenu相當於菜單整合組,其實就是一個CCLayer,主要用來管理這些CCMenuItem,所以在實際用的時候,任何的CCMenuItem繼承類單獨添加到其他的CCNode里的時候是沒有作用的,只有在CCMenu里才可以執行邏輯。
按鈕的制作比較容易,在場景中就可以實現,比如說我們將上篇的TestScene代碼改一下:《Cocos2d-x for WindowsPhone:從開始到一個場景再一張圖片》
public class TestScene : CCScene { public TestScene() { InitScene(); } public void InitScene() { CCSprite image = CCSprite.spriteWithFile("HelloWorld"); image.position = new CCPoint(200, 240); this.addChild(image); //圖片按鈕 CCMenuItemImage menu01 = CCMenuItemImage.itemFromNormalImage("Images/startgame01", "Images/startgame01",this,startGame); menu01.position = new CCPoint(50, 0); CCMenu menugroup = CCMenu.menuWithItems(menu01); this.addChild(menugroup); } public void startGame(CCObject sender) {
} }
上面代碼中使用CCMenuItemImage.itemFromNormalImage方法從兩張圖片中構建了一個按鈕項,這兩張照片分別代表為普通狀態(normal)和選定狀態(selected),圖片當然要先准備好添加到Content里。
運行一下看看,在界面中按鈕已經出現。
更多的按鈕 |
為了更好的說明各種按鈕的用法,我們先建立一個新的場景,名字叫MenuShow,這個場景里帶了四種按鈕測試,代碼如下:
public class MenuShow : CCScene { static MenuShow _instance; public static MenuShow getInstance() { if (_instance == null) _instance = new MenuShow(); return _instance; } private MenuShow() { //普通文字按鈕 CCMenuItemFont textmenu = CCMenuItemFont.itemFromString("Text Button", this, OnTextmenu_Click); //普通按鈕,來自CCLabelTTF,其實里面可以套任何的CCNode CCMenuItemLabel labelmenu = CCMenuItemLabel.itemWithLabel(CCLabelTTF.labelWithString("Label Button", "Arial", 24), this, OnLabelmenu_Click); //圖片按鈕 CCMenuItemImage imagemenu01 = CCMenuItemImage.itemFromNormalImage("Images/startgame01", "Images/startgame01", this, OnImagemenu_Click); //精靈按鈕 var mole = new Mole(); CCMenuItemSprite spritemenu01 = CCMenuItemSprite.itemFromNormalSprite(mole, CCSprite.spriteWithFile("Images/marmot_4"), this, OnSpritemenu_Click); CCMenu menu = CCMenu.menuWithItems(textmenu,labelmenu, imagemenu01, spritemenu01); menu.alignItemsVerticallyWithPadding(20); this.addChild(menu); } void OnTextmenu_Click(CCObject sender) { ShowMessageBox("TextMenu被點擊了!"); } void OnLabelmenu_Click(CCObject sender) { ShowMessageBox("Label Button被點擊了!"); } void OnImagemenu_Click(CCObject sender) { ShowMessageBox("Image Button被點擊了!"); } void OnSpritemenu_Click(CCObject sender) { ShowMessageBox("Sprite Button被點擊了!"); } //一個簡單的messagebox方法 public static void ShowMessageBox(string message) { List MBOPTIONS = new List(); MBOPTIONS.Add("OK"); if (!Guide.IsVisible) { //暫停一下 CCDirector.sharedDirector().pause(); Guide.BeginShowMessageBox("Message", message, MBOPTIONS, 0, MessageBoxIcon.Alert, new AsyncCallback(messageCallBack), null); } } private static void messageCallBack(IAsyncResult result) { //回調並重新開始運行 CCDirector.sharedDirector().resume(); } }
其中有一個Mole類精靈,想起來之前的那位可憐小地鼠了嗎?不知道的可以看:《Cocos2d-x for WindowsPhone:開發一個打地鼠游戲(上)》
代碼實現如下:
public class Mole : CCNode { CCSprite body; CCActionInterval showAction; //動畫序列幀 static List frames; public Mole() { //讀取一張鼴鼠身體的圖片並設置為默認的圖像 body = CCSprite.spriteWithFile("Images/marmot_3"); body.anchorPoint = new CCPoint(0, 0); //設置內容的大小,用繼承類時,contentSize不會被刷新,需要自己指定 contentSize = body.contentSize; this.addChild(body); //創建靜態的幀列表,這樣做的目的是防止多次創建無用的CCSpriteFrame if (frames == null) { frames = new List(); for (int i = 1; i < 4; i++) { CCTexture2D texture = CCTextureCache.sharedTextureCache().addImage("Images/marmot_" + i); //這里存在一個引擎的bug,如果不設置的話,就會播放不出來動畫 texture.Name = (uint)i; var frame = CCSpriteFrame.frameWithTexture(texture, new CCRect(0, 0, texture.ContentSizeInPixels.width, texture.ContentSizeInPixels.height)); frames.Add(frame); } } //鑽出動畫 CCAnimation marmotShowanimation = CCAnimation.animationWithFrames(frames, 0.1f); CCAnimate action = CCAnimate.actionWithAnimation(marmotShowanimation, false); showAction = CCRepeatForever.actionWithAction(action); //讓body身體執行鑽出動畫 body.runAction(showAction); } }
好了,現在你可以在CCApplication里直接跳轉場景,但這次我們要測試前面的按鈕,現在打開TestScene,找到void startGame(CCObject sender),寫如下代碼:
public void startGame(CCObject sender) { CCDirector.sharedDirector().pushScene(MenuShow.getInstance()); }
這時在TestScene里的開始按鈕被點擊的時候將會跳轉到MenuShow場景。
運行起來看看效果:
看起來不賴,有點意思了嗎?點擊一下看看效果吧。
源代碼 |