cocos2d-x 3.x 血条

来源:互联网 发布:c 界面编程书籍 编辑:程序博客网 时间:2024/04/30 01:06

血条的实现方式有好多种,常见的有用进度条来实现,利用精灵X轴缩放setScaleX,设置精灵矩形框大小等。当前血量和最大血量算出来比例,然后利用比例设置血条显示

我是通过设置精灵X轴缩放,给我的源码

.h

/*------血条------*/
class BloodVolumeWidget
{
public:
BloodVolumeWidget();
~BloodVolumeWidget();


void InitAttribute(Sprite* bgSprite, Sprite* showSprite, Node* parentNode);
void RefreshBlood(float currentValue, float maxVlaue);
private:
CC_SYNTHESIZE(Sprite*, m_pBloodBgSprite, pBloodBgSprite);
CC_SYNTHESIZE(Sprite*, m_pBloodShowSprite, pBloodShowSprite);
};


.cpp

BloodVolumeWidget::BloodVolumeWidget() :
m_pBloodBgSprite(nullptr),
m_pBloodShowSprite(nullptr)
{
}


BloodVolumeWidget::~BloodVolumeWidget()
{
}


void BloodVolumeWidget::InitAttribute(Sprite* bgSprite, Sprite* showSprite, Node* parentNode)
{
m_pBloodBgSprite = bgSprite;
m_pBloodShowSprite = showSprite;
parentNode->addChild(m_pBloodBgSprite);
parentNode->addChild(m_pBloodShowSprite);
m_pBloodBgSprite->setAnchorPoint(Vec2(0.0f, 0.5f));
m_pBloodShowSprite->setAnchorPoint(Vec2(0.0f, 0.5f));
m_pBloodBgSprite->setPosition(-m_pBloodBgSprite->getContentSize().width / 2, parentNode->getContentSize().height / 2 + 100);
m_pBloodShowSprite->setPosition(-m_pBloodShowSprite->getContentSize().width / 2, parentNode->getContentSize().height / 2 + 100);
m_pBloodShowSprite->setScaleX(0.5f);
}


void BloodVolumeWidget::RefreshBlood(float currentValue, float maxVlaue)
{
float scaleValue = currentValue / maxVlaue;
if (scaleValue > 1.0f)
scaleValue = 1.0f;
else if (scaleValue < 0.0f)
scaleValue = 0.0f;
m_pBloodShowSprite->setScaleX(scaleValue);
}



还有一种以进度条来做

.h

/*------血条------*/
class BloodVolumeWidget
{
public:
BloodVolumeWidget();
~BloodVolumeWidget();


void InitAttribute(Sprite* bgSprite, Sprite* showSprite, Node* parentNode);
void RefreshBlood(float currentValue, float maxVlaue);
private:
CC_SYNTHESIZE(Sprite*, m_pBloodBgSprite, pBloodBgSprite);
CC_SYNTHESIZE(ProgressTimer*, m_pBloodShowSprite, pBloodShowSprite);
};

.cpp

BloodVolumeWidget::BloodVolumeWidget() :
m_pBloodBgSprite(nullptr),
m_pBloodShowSprite(nullptr)
{
}


BloodVolumeWidget::~BloodVolumeWidget()
{
}


void BloodVolumeWidget::InitAttribute(Sprite* bgSprite, Sprite* showSprite, Node* parentNode)
{
m_pBloodBgSprite = bgSprite;
m_pBloodShowSprite = ProgressTimer::create(showSprite);
m_pBloodShowSprite->setType(ProgressTimer::Type::BAR);
m_pBloodShowSprite->setBarChangeRate(Vec2(1.0f, 0.0f));
m_pBloodShowSprite->setMidpoint(Vec2(1.0f, 0.0f));
m_pBloodShowSprite->setPercentage(100.0f);


parentNode->addChild(m_pBloodBgSprite);
parentNode->addChild(m_pBloodShowSprite);
m_pBloodBgSprite->setPosition(0, parentNode->getContentSize().height / 2 + 100);
m_pBloodShowSprite->setPosition(0, parentNode->getContentSize().height / 2 + 100);
}


void BloodVolumeWidget::RefreshBlood(float currentValue, float maxVlaue)
{
float percentValue = currentValue / maxVlaue;
if (percentValue > 1.0f)
percentValue = 1.0f;
else if (percentValue < 0.0f)
percentValue = 0.0f;
m_pBloodShowSprite->setPercentage(percentValue * 100.0f);
}

0 0