保卫萝卜~上一篇说了使用CocoStudio制作主界面,这里来完善主界面动画及后续界面(主题界面ThemeUI、场景选择界面SelectMapUI),主要涉及的控件PageView。
  学习要写笔记,记录自己的步骤(练手作)。

一、主界面动画

     上一篇的主界面是静态的,这样很不好看。如果有玩过保卫萝卜就知道它的主界面是动的,云啊、叶子啊都在动,OK加几行代码来实现。
先看效果图:
  加入如下代码:
bool MenuScene :: init()
{
if ( !Layer :: init() )
{
return false ;
} cocos2d ::ui :: Widget* layout = cocostudio ::GUIReader :: getInstance()-> widgetFromJsonFile ("MainUi.json" );
this ->addChild ( layout);
Button * btnAdventure = ( Button*) layout ->getChildByName ( "btnAdventure");
Button * btnBossHome = ( Button*) layout ->getChildByName ( "btnBossHome");
Button * btnBoss = ( Button*) layout ->getChildByName ( "btnBoss");
btnAdventure ->addTouchEventListener ( this, toucheventselector (MenuScene :: btnClick));
btnBossHome ->addTouchEventListener ( this, toucheventselector (MenuScene :: btnClick));
btnBoss ->addTouchEventListener ( this, toucheventselector (MenuScene :: btnClick)); ImageView * cloud1 = ( ImageView*) layout ->getChildByName ( "cloud1");
ImageView * cloud2 = ( ImageView*) layout ->getChildByName ( "cloud2");
Vec2 size = Director ::getInstance ()-> getVisibleSize();
cloud1 ->runAction ( RepeatForever:: create (Sequence :: create( MoveBy ::create ( ,
Vec2 (size . x+ cloud1 ->getCustomSize (). width, )),Place :: create( Vec2 ( , cloud1-> getPositionY ())),nullptr )));
cloud2 ->runAction ( RepeatForever:: create (Sequence :: create( MoveBy ::create ( ,
Vec2 (size . x+ cloud2 ->getCustomSize (). width, )),Place :: create( Vec2 ( , cloud2-> getPositionY ())),nullptr )));
ImageView * bird = ( ImageView*) layout ->getChildByName ( "bird");
bird ->runAction ( RepeatForever:: create (
Sequence ::create (
MoveBy ::create ( , Vec2 ( , )),
MoveBy ::create ( , Vec2 ( ,- )), nullptr ))); ImageView * leaf2 = ( ImageView*) layout ->getChildByName ( "leaf2");
ImageView * leaf3 = ( ImageView*) layout ->getChildByName ( "leaf3");
RotateTo * rotateTo = RotateTo:: create (0.1f , );
RotateTo * rotateTo2 = RotateTo:: create (0.1f , );
leaf2 ->runAction ( RepeatForever:: create (
Sequence ::create (
Repeat ::create ( Sequence:: create (rotateTo , rotateTo2, nullptr ), ),
DelayTime ::create ( ), nullptr )));
leaf3 ->runAction ( RepeatForever:: create (
Sequence ::create (
DelayTime ::create ( ),
Repeat ::create ( Sequence:: create (rotateTo , rotateTo2, nullptr ), ),
DelayTime ::create ( ), nullptr ))); return true ;
}
  OK,加入动作表现之后界面利马生动起来。
 
二、主题选择
 
  1、场景UI制作
     菜单部分使用PageView控件,这个控件是翻页效果,先看效果:
 
     在CocoStudio中创建ThemeUI并使用PageView控件如:
 
 
  2、加入舞台
  这里有五个页面,分别是
  天际主题、森林主题、沙漠主题、海底主题、未开放的极地,
  每个页面下面的sign标签是通关数和总关卡数,这里是需要变动的。
  PageView控件可以使用手指滑动,也要有按钮的互动,因此有两个左右按钮,点击左上角的home会返回主界面。
  首先,把导出的json文件加至舞台,添加事件以及默认页:
cocos2d::ui::Widget* layout = cocostudio::GUIReader::getInstance()->widgetFromJsonFile("ThemeUI/ThemeUI.json");
this->addChild(layout); Button* btnMenu = (Button*)layout->getChildByName("btnMenu");
_btnLeft = (Button*)layout->getChildByName("btnLeft");
_btnRight = (Button*)layout->getChildByName("btnRight");
btnMenu->addTouchEventListener(this,toucheventselector(ThemeScene::btnClickMenu));
_btnLeft->addTouchEventListener(this,toucheventselector(ThemeScene::btnClickLeft));
_btnRight->addTouchEventListener(this,toucheventselector(ThemeScene::btnClickRight)); _pageView = (PageView*)layout->getChildByName("pageView");
_pageView->addEventListenerPageView(this,pagevieweventselector(ThemeScene::pageEvent));
int index = _pageView->getPages().size();
while (index-->)
{
Layout* pageIndex = (Layout*)_pageView->getPage(index);
pageIndex->setUserData((int*)index);
pageIndex->addTouchEventListener(this,toucheventselector(ThemeScene::layputEvent));
}
changePage( );
  这里有两个事件  1、PageView的翻动事件。2、点击PageView子页的事件
  这里有两个注意点
  1、翻动PageView要与按钮对应,首页左向按钮消失,尾页右向按钮消失
  2、点击按钮翻动PageView
void ThemeScene::btnClickLeft(Button* btn, TouchEventType eventType)
{
if( eventType == TOUCH_EVENT_ENDED )
{
auto nextPage = _pageView->getCurPageIndex() - ;
changePage( nextPage );
}
} void ThemeScene::btnClickRight(Button* btn, TouchEventType eventType)
{
if( eventType == TOUCH_EVENT_ENDED )
{
auto nextPage = _pageView->getCurPageIndex() + ;
changePage( nextPage );
}
} void ThemeScene::changePage( int index )
{
auto totalPage = _pageView->getPages().size();
_btnLeft->setVisible( index != );
_btnRight->setVisible( index != ( totalPage- ) ); if( index == _pageView->getCurPageIndex() ) return; if( index >= && index <= totalPage- )
{
_pageView->scrollToPage( index );
}
} void ThemeScene::pageEvent(Ref* page,PageViewEventType type)
{
log("EventType");
changePage( _pageView->getCurPageIndex() );
}
  这样不管是按钮还是触摸都可以正确的显示按钮状态。
 
  3、场景选择处理
  在初始化PageView子页的时候加入了标记数据UserData,这个数据表示选择的场景类型
enum MapType
{
Sky_Type,
Forest_Type,
Desert_Type,
Seabed_Type,
Max_Type
};
  这里的场景类型在后面的逻辑中是非常重要的数据,因此要找个地方去存储。
  选择主题事件触发
void ThemeScene::layputEvent(Layout* layout, TouchEventType eventType)
{
if( eventType == TOUCH_EVENT_ENDED )
{
int sign = (int)layout->getUserData();
log("layputEvent %d",(int)layout->getUserData());
if( sign >= && sign < MapType::Max_Type )
{
auto type = MapType((int)layout->getUserData());
SelectMapModel::getInstance()->setmapType(type);
Director::getInstance()->replaceScene(SelectMapUI::createScene());
}
else
{
log("not open");
}
}
}
  Ok这样就没有任何问题了。目前关于数据记录的方法还没有完全想好,所以子页的sign显示就是默认的。
三、地图选择
 
     1、场景UI制作

  场景类型MapType对应【1、2、3、6】
 
  这里也有一个PageView,这里面只做了一个pageItem,所有的地图子页都是一样的,可以用代码clone一下。当然每个场景的资源名字都是一样的,根据地图类型进行了区分。
  OK,看下效果吧:
 
 
   2、初始化地图
     首先,Json文件加入舞台,然后加入事件,初始化PageView。先拿到一个PageView子页,然后去初始化子页再clone添加至PageView
_pageView = (PageView*)layout->getChildByName("panelSky")->getChildByName("pageView");
Layout* item = (Layout*)_pageView->getChildByName("pageItem");
item->removeFromParent();
_pageView->removeAllPages();
int count = SelectMapModel::getInstance()->getMapCount(SelectMapModel::getInstance()->getmapType());
for (int idx = ; idx <= count; idx++)
{
createOnlyPage(_pageView,item,idx);
} void SelectMapUI::createOnlyPage(PageView* page,Layout* item, int idx)
{
std::string url = SelectMapModel::getInstance()->getMapResPath(SelectMapModel::getInstance()->getmapType());
ImageView* mapImg = (ImageView*)item->getChildByName("mapImg");
ImageView* towers = (ImageView*)item->getChildByName("towers"); mapImg->loadTexture(url+StringUtil::combination("ss_map%02d.png",idx));
towers->loadTexture(url+StringUtil::combination("ss_towers_%02d.png",idx)); page->addPage((Layout*)item->clone());
}
  其中自写StringUtil::combination是字符组合类,图片的路径都是通过MapType类决定的,根据选择不同的主题来决定地图数及图片路径。
  ”开始“按钮,根据选择的地图来决定战斗场景的初始化。
void SelectMapUI::btnClick(Button* btn, TouchEventType eventType)
{
if( eventType == TOUCH_EVENT_ENDED )
{
log("click btn is %s",btn->getName().c_str());
int sceneID = _pageView->getCurPageIndex() + ;
SceneMgr::getInstance()->replaceScene(sceneID);
}
}
四、最新进度
 
     目前,数据库、场景都已构架完毕,可以看下效果了。(地图太多了……时间不充裕目前只做了一个场景)

Cocos2d-x 3.2 学习笔记(十四)保卫萝卜之界面UI的更多相关文章

  1. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  2. (C/C++学习笔记) 十四. 动态分配

    十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...

  3. SharpGL学习笔记(十四) 材质:十二个材质球

    材质颜色 OpenGL用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...

  4. 【转】angular学习笔记(十四)-$watch(1)

    本篇主要介绍$watch的基本概念: $watch是所有控制器的$scope中内置的方法: $scope.$watch(watchObj,watchCallback,ifDeep) watchObj: ...

  5. angular学习笔记(十四)-$watch(1)

    本篇主要介绍$watch的基本概念: $watch是所有控制器的$scope中内置的方法: $scope.$watch(watchObj,watchCallback,ifDeep) watchObj: ...

  6. Java学习笔记十四:如何定义Java中的类以及使用对象的属性

    如何定义Java中的类以及使用对象的属性 一:类的重要性: 所有Java程序都以类class为组织单元: 二:什么是类: 类是模子,确定对象将会拥有的特征(属性)和行为(方法): 三:类的组成: 属性 ...

  7. MYSQL进阶学习笔记十四:MySQL 应用程序优化!(视频序号:进阶_32)

    知识点十五:MySQL 的应用程序优化(32) 一.访问数据库采用连接池 把连接当做对象或设备,统一放在‘连接池’里.凡是需要访问数据库的地方都从连接池里取连接 二.采用缓存减少对于MySQL的访问: ...

  8. Swift学习笔记十四:构造(Initialization)

         类和结构体在实例创建时,必须为全部存储型属性设置合适的初始值. 存储型属性的值不能处于一个未知的状态.     你能够在构造器中为存储型属性赋初值,也能够在定义属性时为其设置默认值.下面章节 ...

  9. JavaScript权威设计--Window对象之Iframe(简要学习笔记十四)

    1.Window对象属性的文档元素(id) 如果在HTML文档中用id属性来为元素命名,并且如果Window对象没有此名字的属性,Window对象会赋予一个属性,它的名字是id属性的值,而他们的值指向 ...

  10. Oracle学习笔记十四 内置程序包

    扩展数据库的功能 为 PL/SQL 提供对 SQL 功能的访问 用户 SYS 拥有所有程序包 是公有同义词 可以由任何用户访问 一些内置程序包 程序包名称 说明 STANDARD和DBMS_STAND ...

随机推荐

  1. 用sql取出来的list需要处理成map的两种情况

    1. 原生sql: select a.id,a.name from a SQLQuery sqlQuery=this.getSession().createSQLQuery(sb.toString() ...

  2. cs程序添加初始化加载

    this.Name = "mysirst"; this.Text = "车辆窗体程序"; this.Load += new System.EventHandle ...

  3. Mac OS 系统工具使用

    1. 截屏的处理 Command + Shift + 4

  4. SQLite无法使用drop column删除表字段解决办法

    由于项目需求变更,我需要在sqlite数据库的表中删除一个字段,通用的sql操作语句如下: alter table record drop column name; 结果数据库提示如下错误: 搜索得知 ...

  5. DLL和LIB的一些知识点(网上搜集)

    关于lib和dll的区别如下:(1)lib是编译时用到的,dll是运行时用到的.如果要完成源代码的编译,只需要lib:如果要使动态链接的程序运行起来,只需要dll.(2)如果有dll文件,那么lib一 ...

  6. (转)Windows下的Memcached安装与使用

    WHAT Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memc ...

  7. c语言到汇编的学习

    [内存结构] C程序通过编译-汇编-连接,最后到可执行文件.载入内存有这几个部分: text:正文段,存放的是可执行的机器码段 data:存放初始化之后的全局变量和静态变量 bbs:存放未初始化的静态 ...

  8. LiveCD DSET日志收集

      DELL的LiveCD是一张PE光盘,最新版本7.1是基于CentOS 6.2系统的. 工具下载地址: http://downloads.dell.com/FOLDER01960516M/1/SL ...

  9. 开始VS 2012中LightSwitch系列的第3部分:我该选择哪一个屏幕模板

    [原文发表地址]  Beginning LightSwitch in VS 2012 Part 3: Screen Templates, Which One Do I Choose? [原文发表时间] ...

  10. JDBC学习2:为什么要写Class.forName("XXX")?

    Class.forName(String name) 接上一篇JDBC.本来这个内容是放在前面的一篇里面的一起的,后来发现越写越多,想想看就算了,还是单独开一篇文章好了,这样也能写得更加详细点. 上一 ...