[CloudBox] 基于跨平台框架的愤怒鸟滑动按钮范例
来源:互联网 发布:阿里云 ecs 带宽 编辑:程序博客网 时间:2024/06/05 03:28
决定把CloudBox开源了!
分享给大家,CloudBox是iOS/Android的跨平台框架。
这个范例显示了愤怒鸟中,那种可滑动收纳按钮的元件
由于CloudBox是一个基于opengles的绘图引擎,因此在设计时,暂时是基于UI元件皆是使用图片载入为主
至于这个CBSlideBar的设计概念
首先是基于分析,按下之后有两个动画,一个是按钮会旋转,另一个是收纳的bar会拉伸
已元件设计的观念来分析,目前至少就需要二个图形元件,二个动画控制
我将整个元件设为状态机,只有隐藏跟显示两种状态
来判断是否要显示收纳的按钮,收纳的按钮就用addButton加入即可
分享给大家,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"#endifenum 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建制项目
- [CloudBox] 基于跨平台框架的愤怒鸟滑动按钮范例
- CloudBox范例代码:CloudLED
- 跨平台2D游戏引擎CloudBox
- CloudBox开发的心路历程
- 基于自定义的Excel解析框架的使用范例
- 让人愤怒的google协作平台
- 基于Nokia平台的游戏通用框架
- 基于JAVA平台的框架分析总结
- 基于.net平台的web框架搭建
- 基于.NET平台常用的框架整理
- 基于移动平台的多媒体框架-系列
- 基于.NET平台常用的框架整理
- 基于 platform 平台的驱动框架
- 基于.NET平台常用的框架整理
- 基于.NET平台常用的框架整理
- 基于.NET平台常用的框架整理
- 基于.NET平台常用的框架整理
- 基于.NET平台常用的框架整理
- SAP Pa studay,Material master
- U盘引导的基于64位DVD版的fedora 16安装
- QT:三态按钮
- mydql DATE, DATETIME, TIMESTAMP 日期和时间函数
- Linux奥秘 ——读书笔记(1)BIOS
- [CloudBox] 基于跨平台框架的愤怒鸟滑动按钮范例
- 动态库与静态库
- 第⑨周实验报告④
- core调试
- Android中View绘制流程以及invalidate()等相关方法分析
- 关于Regex例子
- android开发新浪微博客户端 完整攻略 [新手必读]
- CMake with Eclipse:UNIX Makefile Generator
- 2012年4月9日