[CloudBox] 基于跨平台框架的愤怒鸟滑动按钮范例
2012-04-09 23:15
260 查看
决定把CloudBox开源了!
分享给大家,CloudBox是iOS/Android的跨平台框架。
这个范例显示了愤怒鸟中,那种可滑动收纳按钮的元件
请用xcode或eclipse编译程式代码
由于CloudBox是一个基于opengles的绘图引擎,因此在设计时,暂时是基于UI元件皆是使用图片载入为主
至于这个CBSlideBar的设计概念
首先是基于分析,按下之后有两个动画,一个是按钮会旋转,另一个是收纳的bar会拉伸
已元件设计的观念来分析,目前至少就需要二个图形元件,二个动画控制
我将整个元件设为状态机,只有隐藏跟显示两种状态
来判断是否要显示收纳的按钮,收纳的按钮就用addButton加入即可
http://download.csdn.net/detail/cloudhsu/4212237
如何设定Eclipse Builder设定透过Eclipse建制项目
分享给大家,CloudBox是iOS/Android的跨平台框架。
这个范例显示了愤怒鸟中,那种可滑动收纳按钮的元件
请用xcode或eclipse编译程式代码
/* * CBSlideBar.h * CloudBox Cross-Platform Framework Project * * Created by Cloud on 2012/4/8. * Copyright 2012 Orz. All rights reserved. * */ #include "CBView.h" #include "CBAction.h" #ifdef __CBIOS__ #define OPTION_NAME "button_options.png" #define OPTION_BG_NAME "options_bg.png" #define OPTION_MUSIC_ON_NAME "button_music_on.png" #define OPTION_MUSIC_OFF_NAME "button_music_off.png" #define OPTION_INFO_NAME "button_info.png" #define OPTION_HELP_NAME "button_help.png" #define OPTION_CLOSE_NAME "button_close.png" #else #define OPTION_NAME "system/button_options.png" #define OPTION_BG_NAME "system/options_bg.png" #define OPTION_MUSIC_ON_NAME "system/button_music_on.png" #define OPTION_MUSIC_OFF_NAME "system/button_music_off.png" #define OPTION_CLOSE_NAME "system/button_close.png" #define OPTION_INFO_NAME "system/button_info.png" #define OPTION_HELP_NAME "system/button_help.png" #define OPTION_CLOSE_NAME "system/button_close.png" #endif enum SlideBarStatus { SlideBarHide = 0, SlideBarShow = 1 }; enum DefaultSlideBar { DefaultSlideBar1 = 1 }; class CBSlideBar : public CBView { private: SlideBarStatus m_status; CBView* m_optionButton; CBView* m_optionBar; CBDelegate<void(int)>* m_click; vector<CBView* > m_options; CBAction* m_optionButtonShowClick; CBAction* m_optionButtonHideClick; CBAction* m_optionBarShow; CBAction* m_optionBarHide; void onClickOption(); void onBarAnimationScrolling(CBView* target); void onBarAnimationFinish(CBView* target); void setDefaultBar1(); protected: void draw(); public: CBSlideBar(); CBSlideBar(DefaultSlideBar defaultType); ~CBSlideBar(); inline void setShowButtonAction(CBAction* action) { m_optionButtonShowClick = action; } inline void setHideButtonAction(CBAction* action) { m_optionButtonHideClick = action; } inline void setShowBarAction(CBAction* action) { m_optionBarShow = action; } inline void setHideBarAction(CBAction* action) { m_optionBarHide = action; } void onClick(float x,float y); void setOptionButton(const string& imageName); void setOptionBar(const string& imageName); void addButton(const string& imageName); void addSwitchButton(const string& imageName1,const string& imageName2); };
/* * CBSlideBar.cpp * CloudBox Cross-Platform Framework Project * * Created by Cloud on 2012/4/8. * Copyright 2012 Orz. All rights reserved. * */ #include "CBSlideBar.h" #include "CBImage.h" #include "CBRotateAction.h" #include "CBPropertyAction.h" CBSlideBar::CBSlideBar() : m_optionButton(NULL), m_optionBar(NULL), m_status(SlideBarHide), m_optionButtonShowClick(NULL), m_optionButtonHideClick(NULL), m_optionBarShow(NULL), m_optionBarHide(NULL) { registerClickEvent(); } CBSlideBar::CBSlideBar(DefaultSlideBar defaultType) : m_optionButton(NULL), m_optionBar(NULL), m_status(SlideBarHide), m_optionButtonShowClick(NULL), m_optionButtonHideClick(NULL), m_optionBarShow(NULL), m_optionBarHide(NULL) { registerClickEvent(); setDefaultBar1(); } CBSlideBar::~CBSlideBar() { DELETE(m_optionButton); DELETE(m_optionBar); for(int i = 0 ; i < m_options.size() ; i++) { DELETE(m_options[i]); } m_options.clear(); } void CBSlideBar::setDefaultBar1() { // template in CloudBox setOptionButton(OPTION_NAME); setOptionBar(OPTION_BG_NAME); m_optionButtonShowClick = new CBPropertyAction(Property(ActionPropertyAngle,0,360,10, PropertyFromCurrent), 0.015, ActionManualRelease); m_optionButtonHideClick = new CBPropertyAction(Property(ActionPropertyAngle,360,0,10, PropertyFromCurrent), 0.015, ActionManualRelease); m_optionBarShow = new CBPropertyAction( Property(ActionPropertyWidth,m_optionButton->getWidth(),m_optionBar->getWidth(),10, PropertyFromCurrent), 0.025, ActionManualRelease); m_optionBarShow->addTriggerEvent(this,&CBSlideBar::onBarAnimationScrolling); m_optionBarHide = new CBPropertyAction( Property(ActionPropertyWidth,m_optionBar->getWidth(),m_optionButton->getWidth(),-10, PropertyFromCurrent), 0.025, ActionManualRelease); m_optionBarHide->addTriggerEvent(this,&CBSlideBar::onBarAnimationScrolling); m_optionBarHide->addFinishEvent(this,&CBSlideBar::onBarAnimationFinish); m_optionBar->setWidth(m_optionButton->getWidth()); addButton(OPTION_INFO_NAME); addButton(OPTION_HELP_NAME); addButton(OPTION_CLOSE_NAME); } void CBSlideBar::onBarAnimationScrolling(CBView* target) { int x = target->getX() + target->getWidth(); for(int i = 0 ; i < m_options.size() ; i++) { if(m_status == SlideBarShow) { if((m_options[i]->getX() + m_options[i]->getWidth()) < x) { m_options[i]->show(); } } else if(m_status == SlideBarHide) { if((m_options[i]->getX() + m_options[i]->getWidth()) > x) { m_options[i]->hide(); } } } } void CBSlideBar::onBarAnimationFinish(CBView* target) { if(m_status == SlideBarHide) { target->hide(); } } void CBSlideBar::setOptionButton(const string& imageName) { DELETE(m_optionButton); m_optionButton = new CBImage(imageName); } void CBSlideBar::setOptionBar(const string& imageName) { DELETE(m_optionBar); m_optionBar = new CBImage(imageName); m_optionBar->hide(); } void CBSlideBar::addButton(const string& imageName) { CBImage* image = new CBImage(imageName); image->hide(); m_options.push_back(image); } void CBSlideBar::addSwitchButton(const string& imageName1,const string& imageName2) { } void CBSlideBar::onClickOption() { if(m_status == SlideBarShow) { m_status = SlideBarHide; m_optionButtonHideClick->stop(); m_optionBarShow->stop(); m_optionButtonHideClick->commit(m_optionButton); m_optionBarHide->commit(m_optionBar); } else { m_status = SlideBarShow; m_optionButtonHideClick->stop(); m_optionBarHide->stop(); m_optionButtonShowClick->commit(m_optionButton); m_optionBarShow->commit(m_optionBar); m_optionBar->show(); } } void CBSlideBar::onClick(float x,float y) { if(m_optionButton->isTrigger(x, y)) { onClickOption(); } if(m_status == SlideBarShow) { } } void CBSlideBar::draw() { m_optionBar->moveToAbsolute(m_x, m_y); m_optionBar->visit(); m_optionButton->moveToAbsolute(m_x, m_y); m_optionButton->visit(); int width = 0; for(int i = 0 ; i < m_options.size() ; i++) { m_options[i]->moveToAbsolute(m_x + m_optionButton->getWidth() + width, m_y); m_options[i]->visit(); width += m_options[i]->getWidth(); } }
由于CloudBox是一个基于opengles的绘图引擎,因此在设计时,暂时是基于UI元件皆是使用图片载入为主
至于这个CBSlideBar的设计概念
首先是基于分析,按下之后有两个动画,一个是按钮会旋转,另一个是收纳的bar会拉伸
已元件设计的观念来分析,目前至少就需要二个图形元件,二个动画控制
我将整个元件设为状态机,只有隐藏跟显示两种状态
来判断是否要显示收纳的按钮,收纳的按钮就用addButton加入即可
http://download.csdn.net/detail/cloudhsu/4212237
如何设定Eclipse Builder设定透过Eclipse建制项目
相关文章推荐
- Xamarin 2.0:基于Mono跨平台开发框架
- 11月2日云栖精选夜读:BNN - 基于low-bits量化压缩的跨平台深度学习框架
- 基于ROR框架开发的一套跨平台项目管理系统
- jQuery实现基于鼠标滑动改变按钮背景图片、文字
- BNN - 基于low-bits量化压缩的跨平台深度学习框架
- 基于JS实现移动端向左滑动出现删除按钮功能
- 基于mootools 1.3框架下的图片滑动效果代码
- 一:网络请求框架封装范例-基于volley
- 5个基于css3超炫的鼠标滑动按钮动画
- 基于css3的鼠标滑动按钮动画之CSS--续
- Android左右滑动菜单(基于第三方Fragment框架设计)
- 基于css3的鼠标滑动按钮动画
- 基于mootools 1.3框架下的图片滑动效果代码
- 基于Mono跨平台移动应用开发框架发布Xamarin 3.0
- 基于微信的weui框架编写单选按钮组件
- 基于MVC和Bootstrap的权限框架解决方案 二.添加增删改查按钮
- ISE(Iris Server Engine)是一个基于现代C++的跨平台(Linux和Windows)框架
- Redmine是用Ruby开发的基于web的项目管理软件,是用ROR框架开发的一套跨平台项目管理系统
- 基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(六)基于CrossApp跨平台框架的MQTT客户端控制应用PC版
- Xamarin 2.0:基于Mono跨平台开发框架