cocos2dx简单实现TabBarView功能

吐槽:现在在做一个不是游戏的游戏...选用cocos2dx 来做真心累啊,除了很多问题找不到解决方式之外,就是很多控件没得用!只能靠自己实现...

效果图:

实现方法其实很简单:

下面菜单是一个Menu,然后选用MenuItemSprite来填充,(MenuItemSprite有个selected()unselected()函数,可以方便地切换状态)

然后上面是一个LayerMultiplex,就是一个存放Layer 的Vector,可以很方便地切换显示哪个Layer。

实现代码如下:

HelloWorldScene.h

        #ifndef __HELLOWORLD_SCENE_H__
        #define __HELLOWORLD_SCENE_H__

        #include "cocos2d.h"

        USING_NS_CC;

        class HelloWorld : public cocos2d::Layer
        {
        public:
            // there‘s no ‘id‘ in cpp, so we recommend returning the class instance pointer
            static cocos2d::Scene* createScene();

            // Here‘s a difference. Method ‘init‘ in cocos2d-x returns bool, instead of returning ‘id‘ in cocos2d-iphone
            virtual bool init();

            // a selector callback
            void menuCloseCallback(cocos2d::Ref* pSender);

            // implement the "static create()" method manually
            CREATE_FUNC(HelloWorld);
        private:
            LayerMultiplex *layers;
            Menu *tabBarItems;
            Sprite *tabBarBg;

            void tapBarMenuPressed(Ref *pSender);

            virtual void onEnter();
        };

        #endif // __HELLOWORLD_SCENE_H__

HelloWorldScene.cpp

    #include "HelloWorldScene.h"

    USING_NS_CC;
    #define TOOLBARTAG 10086

    Scene* HelloWorld::createScene()
    {
        // ‘scene‘ is an autorelease object
        auto scene = Scene::create();

        // ‘layer‘ is an autorelease object
        auto layer = HelloWorld::create();

        // add layer as a child to scene
        scene->addChild(layer);

        // return the scene
        return scene;
    }

    // on "init" you need to initialize your instance
    bool HelloWorld::init()
    {
        //////////////////////////////
        // 1. super init first
        if ( !Layer::init() )
        {
            return false;
        }

        auto layer1 = LayerColor::create(Color4B(180, 180, 0, 180));

        auto layer2 = LayerColor::create(Color4B(255, 255, 255, 180));

        auto layer3 = LayerColor::create(Color4B(0, 180, 180,  180));

        auto layer4 = LayerColor::create(Color4B(255, 255, 0, 180));

        layers = LayerMultiplex::create(layer1, layer2, layer3, layer4);

        this -> addChild(layers);

        //Menu背景图
        tabBarBg = Sprite::create("tarbarBg.png");
        tabBarBg -> setPosition(Director::getInstance() ->  getVisibleSize().width * 0.5, 0);
        tabBarBg -> setAnchorPoint(Point(0.5, 0));

        this -> addChild(tabBarBg, 1000);
        auto toolbar1 = MenuItemSprite::create(Sprite::create("toolbar1.png"), Sprite::create("toolbar1_p.png"), CC_CALLBACK_1(HelloWorld::tapBarMenuPressed, this));
        toolbar1 -> setTag(TOOLBARTAG + 0);

        auto toolbar2 = MenuItemSprite::create(Sprite::create("toolbar2.png"), Sprite::create("toolbar2_p.png"), CC_CALLBACK_1(HelloWorld::tapBarMenuPressed, this));
        toolbar2 -> setTag(TOOLBARTAG + 1);

        auto toolbar3 = MenuItemSprite::create(Sprite::create("toolbar3.png"), Sprite::create("toolbar3_p.png"), CC_CALLBACK_1(HelloWorld::tapBarMenuPressed, this));
        toolbar3 -> setTag(TOOLBARTAG + 2);

        auto toolbar4 = MenuItemSprite::create(Sprite::create("toolbar4.png"), Sprite::create("toolbar4_p.png"), CC_CALLBACK_1(HelloWorld::tapBarMenuPressed, this));
        toolbar4 -> setTag(TOOLBARTAG + 3);

        tabBarItems = Menu::create(toolbar1, toolbar2, toolbar3, toolbar4, NULL);
        tabBarItems -> alignItemsHorizontallyWithPadding(30);
        tabBarItems -> setPositionY(tabBarBg -> getContentSize().height * 0.5f);

        tabBarBg -> addChild(tabBarItems);

        return true;
    }

    void HelloWorld::onEnter()
    {
        Layer::onEnter();
        layers -> switchTo(0);
        static_cast<MenuItemSprite *>(tabBarItems -> getChildByTag(TOOLBARTAG + 0)) -> selected();
    }

    void HelloWorld::tapBarMenuPressed(Ref *pSender)
    {
        auto toolbar = (MenuItemSprite *)pSender;
        toolbar -> selected();
        layers -> switchTo(toolbar -> getTag() - TOOLBARTAG);

        for (int i = 0; i < tabBarItems -> getChildren().size(); i++) {
            auto tmpbar = dynamic_cast<MenuItemSprite *>(tabBarItems -> getChildren().at(i));
            if (tmpbar != NULL && tmpbar -> getTag() != toolbar -> getTag()) {
                tmpbar -> unselected();
            }
        }
    }

代码+图片资源点击这里下载

欢迎访问我在github搭建的博客:helkyle.tk

时间: 2025-02-01 19:54:19

cocos2dx简单实现TabBarView功能的相关文章

简单实现下载功能--jsp,servlet

刚到公司,前天给我的第一个小任务,虽然只是做个简单的下载功能. 但一开始还是花了不少时间去理解导师的意思,而且还要用到一些公司的库类,花了一个下午才做好. 大概有三种方法 1.直接用a标签跳转到指定位置的目标文件.  <a href="doc/help.txt" /></a>(文件是位于doc文件夹下help.txt)(不推荐这种方法,而且这跳转会直接打开文件) 2.jsp跳转然后直接在jsp里面写下载功能 <a href="download.j

简单标签库功能

1 package cn.itcast.web.tag; 2 3 import java.io.IOException; 4 import java.io.StringWriter; 5 6 import javax.servlet.jsp.JspException; 7 import javax.servlet.jsp.tagext.JspFragment; 8 import javax.servlet.jsp.tagext.SimpleTagSupport; 9 10 //控制标签体内容为大

PHP实现一个简单url路由功能

如果一个页面的内容呈现,需要根据url上传递的参数来进行渲染.很多时候可能是这样子写:xxx.com/xx?c=x&m=x& t=..,而我们看到的url往往是这样子的(以新浪微游戏的咖啡恋人为例) game.weibo.com/ilovecoffee….这种URL设计看上去比前一种更好一点:) 如果我们访问一下不存在的游戏应用,例如game.weibo.com/ilovecoffee222,则会输出如下的错误提示: game.weibo.com后面匹配到的项,指向了某个php页面,然后根

jQuery实现一个简单的购物车功能

最近由于工作需要的原因,开始系统学习jQuery的知识,然后跟着一个视频教程做了一个购物车的功能,现总结如下. 第一步:准备HTML页面,代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.

Unity UGUI 实现简单拖拽功能

说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还有一种就是 UI 在Canvas内的坐标(暂时叫做ugui坐标),这两个坐标是不一样的,所以拖拽就需要转换. 因为鼠标的移动是屏幕坐标,而 UI 的移动是ugui坐标.转换的方法: RectTransformUtility.ScreenPointToLocalPointInRectangle ( - ); 这个方法可以把屏幕坐标转换成 ugui 坐标.这里我们只需要知道 UI 的坐标和鼠标的坐标是不一样的,他

js+html+css实现简单页面交互功能(2015知乎前端笔试题)http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html?from=y1.7-1.2

js+html+css实现简单页面交互功能(2015知乎前端笔试题) http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html?from=y1.7-1.2 密码:hellozhihu

AngularJS实现简单的分页功能

本篇文章由:http://xinpure.com/angularjs-simple-paging-functionality/ 初学 AngularJS, 尝试着写一些小功能 代码逻辑写得略粗糙,仅仅只是实现了简单的分页功能,使用 AngularJS 尝尝鲜. AngularJS Code (Users.js) var Users = angular.module('Users', []); Users.controller('UserList', function($scope, $http)

.net请求Webservice简单实现天气预报功能

很久没有接触Webservice的知识,今天稍微复习了一下关于webservice,简单做了一个天气预报的功能,虽然界面丑的厉害,但功能算是实现了,以下是效果展示. 这东西没什么难点,只是天气预报的功能在网站类的开发中会经常用到,所以就简单写下,以便以后查阅. 1.新建一个网站或者web应用程序,添加一个aspx页面,用于展示天气数据.(这个应该不用细讲吧) 2.在网上找一个免费的天气预报的接口,我用的是Webxml网站的,地址如下: http://webservice.webxml.com.c

使用JS完成一个简单的计算器功能

使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElementById("id").value = 1: 取值:var = document.getElementById("id").value: 任务 第一步: 创建构建运算函数count(). 第二步: 获取两个输入框中的值和获取选择框的值. 提示:document.getElement