运行效果图:
资源图片:
血条前景图:
血条背景图:
在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; }
#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 object CCScene *scene = CCScene::create(); // 'layer' is an autorelease object HelloWorld *layer = HelloWorld::create(); // add layer as a child to scene scene->addChild(layer); // return the scene return scene; } // on "init" you need to initialize your instance bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !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 object CCMenuItemImage *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 object CCMenu* 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 label CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", TITLE_FONT_SIZE); // position the label on the center of the screen pLabel->setPosition(ccp(origin.x + visibleSize.width/2, origin.y + visibleSize.height - pLabel->getContentSize().height)); // add the label as a child to this layer this->addChild(pLabel, 1); // add "HelloWorld" splash screen" CCSprite* pSprite = CCSprite::create("HelloWorld.png"); // position the sprite on the center of the screen pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); // add the sprite as a child to this layer this->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()); }