• Cocos2dx 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

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

      源代码

    点击这里下载源代码

  • 相关阅读:
    阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_5_InvalidClassException异常_原理
    阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_4_transient关键字_瞬态关键字
    阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_3_对象的反序列化流_ObjectInputStream
    阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_2_对象的序列化流_ObjectOutputStream
    阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_5_InputStreamReader介绍&代码实现
    Linux启动流程
    静态库和动态库的区别
    uboot各种目录下的文件作用
    编译选项含义
    C++转换构造函数与类型转换构造函数
  • 原文地址:https://www.cnblogs.com/nowpaper/p/2553026.html
Copyright © 2020-2023  润新知