[CloudBox] 基于跨平台框架的愤怒鸟滑动按钮范例

来源:互联网 发布:阿里云 ecs 带宽 编辑:程序博客网 时间:2024/06/05 03:28
决定把CloudBox开源了!
分享给大家,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建制项目



原创粉丝点击