Cocos2d-x for WindowsPhone:一個按鈕走天下


在玩游戲的過程中,按鈕可算是界面里最不可缺少的元素,可以說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里。QQ截圖20120617235306

運行一下看看,在界面中按鈕已經出現。

QQ截圖20120617234936

  更多的按鈕

為了更好的說明各種按鈕的用法,我們先建立一個新的場景,名字叫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場景。

運行起來看看效果:

QQ截圖20120617234944

看起來不賴,有點意思了嗎?點擊一下看看效果吧。

  源代碼

點擊這里下載源代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM