Nowpaper 十五英寸的世界

Rich Games Developer

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在玩游戏的过程中,按钮可算是界面里最不可缺少的元素,可以说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

看起来不赖,有点意思了吗?点击一下看看效果吧。

  源代码

点击这里下载源代码

posted on 2012-06-18 00:10  nowpaper  阅读(4516)  评论(0编辑  收藏  举报