Cocos2d-x--自定义血条

来源:互联网 发布:江苏省普通发票软件 编辑:程序博客网 时间:2024/05/16 11:32

运行效果图:



资源图片:

血条前景图:

血条背景图:


在HelloCpp项目中添加以下代码:


Progress.h:

#ifndef __PROGRESSVIEW_H__#define __PROGRESSVIEW_H__#include "cocos2d.h"using namespace cocos2d;class ProgressView : public CCNode{public:    ProgressView();public:    void setBackgroundTexture(const char *pName);    void setForegroundTexture(const char *pName);    void setTotalProgress(float total);    void setCurrentProgress(float progress);    float getCurrentProgress() const;    float getTotalProgress() const;private:    void setForegroundTextureRect(const CCRect &rect);private:    CCSprite *m_progressBackground;    CCSprite *m_progressForeground;    float m_totalProgress;    float m_currentProgress;    float m_scale;};#endif


Progress.cpp:

#include "ProgressView.h"void ProgressView::setBackgroundTexture( const char *pName ){    m_progressBackground = CCSprite::create(pName);    this->addChild(m_progressBackground);}void ProgressView::setForegroundTexture( const char *pName ){    m_progressForeground = CCSprite::create(pName);    m_progressForeground->setAnchorPoint(ccp(0.0f, 0.5f));    m_progressForeground->setPosition(ccp(-m_progressForeground->getContentSize().width * 0.5f, 0));    this->addChild(m_progressForeground);}void ProgressView::setTotalProgress( float total ){    if (m_progressForeground == NULL) {return;}    m_scale = m_progressForeground->getContentSize().width / total;    m_totalProgress = total;}void ProgressView::setCurrentProgress( float progress ){    if (m_progressForeground == NULL) {return;}    if (progress < 0.0f) {progress = 0.0f;}    if (progress > m_totalProgress) {progress = m_totalProgress;}    m_currentProgress = progress;    float rectWidth = progress * m_scale;    const CCPoint from = m_progressForeground->getTextureRect().origin;    const CCRect rect = CCRectMake(from.x, from.y, rectWidth, m_progressForeground->getContentSize().height);    setForegroundTextureRect(rect);}void ProgressView::setForegroundTextureRect( const CCRect &rect ){    m_progressForeground->setTextureRect(rect);}ProgressView::ProgressView()    : m_progressBackground(NULL)    , m_progressForeground(NULL)    , m_totalProgress(0.0f)    , m_currentProgress(0.0f)    , m_scale(1.0f){}float ProgressView::getCurrentProgress() const{    return m_currentProgress;}float ProgressView::getTotalProgress() const{    return m_totalProgress;}

HelloScene.h:

#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"#include "ProgressView.h"class HelloWorld : public cocos2d::CCLayer{public:    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone    virtual bool init();      // there's no 'id' in cpp, so we recommend returning the class instance pointer    static cocos2d::CCScene* scene();        // a selector callback    void menuCloseCallback(CCObject* pSender);        // implement the "static node()" method manually    CREATE_FUNC(HelloWorld);private:    ProgressView *m_pProgressView;};#endif // __HELLOWORLD_SCENE_H__


HelloScene.cpp:

#include "HelloWorldScene.h"#include "AppMacros.h"USING_NS_CC;CCScene* HelloWorld::scene(){// 'scene' is an autorelease objectCCScene *scene = CCScene::create();// 'layer' is an autorelease objectHelloWorld *layer = HelloWorld::create();// add layer as a child to scenescene->addChild(layer);// return the scenereturn scene;}// on "init" you need to initialize your instancebool HelloWorld::init(){//////////////////////////////// 1. super init firstif ( !CCLayer::init() ){return false;}CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();/////////////////////////////// 2. add a menu item with "X" image, which is clicked to quit the program//    you may modify it.// add a "close" icon to exit the progress. it's an autorelease objectCCMenuItemImage *pCloseItem = CCMenuItemImage::create("CloseNormal.png","CloseSelected.png",this,menu_selector(HelloWorld::menuCloseCallback));pCloseItem->setPosition(ccp(origin.x + visibleSize.width - pCloseItem->getContentSize().width/2 ,origin.y + pCloseItem->getContentSize().height/2));// create menu, it's an autorelease objectCCMenu* pMenu = CCMenu::create(pCloseItem, NULL);pMenu->setPosition(CCPointZero);this->addChild(pMenu, 1);/////////////////////////////// 3. add your codes below...// add a label shows "Hello World"// create and initialize a labelCCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", TITLE_FONT_SIZE);// position the label on the center of the screenpLabel->setPosition(ccp(origin.x + visibleSize.width/2,origin.y + visibleSize.height - pLabel->getContentSize().height));// add the label as a child to this layerthis->addChild(pLabel, 1);// add "HelloWorld" splash screen"CCSprite* pSprite = CCSprite::create("HelloWorld.png");// position the sprite on the center of the screenpSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));// add the sprite as a child to this layerthis->addChild(pSprite, 0);    //初始化ProgressView    m_pProgressView = new ProgressView;    m_pProgressView->setPosition(ccp(100, 100));    m_pProgressView->setScale(2.2f);    m_pProgressView->setBackgroundTexture("background.png");    m_pProgressView->setForegroundTexture("foreground.png");    m_pProgressView->setTotalProgress(120.0f);    m_pProgressView->setCurrentProgress(22.0f);    this->addChild(m_pProgressView, 2);return true;}void HelloWorld::menuCloseCallback(CCObject* pSender){    float progress = m_pProgressView->getCurrentProgress() + 12.0f;    m_pProgressView->setCurrentProgress(progress);    CCLOG("%f", m_pProgressView->getTotalProgress());    CCLOG("%f", m_pProgressView->getCurrentProgress());}





0 0
原创粉丝点击