制作横版游戏KillBear第8课:技能及CD实现
发布日期:2021-05-10 00:54:01 浏览次数:17 分类:精选文章

本文共 5985 字,大约阅读时间需要 19 分钟。

���������������������������������������������������������������������������������������������������������������������(������)������������������������������������������������������������������������������������������������������������

1. ������������

  • Win64 : vs2010
  • Cocos2d-x v3.4Final
  • TexturePackerGUI
  • MapEdit

2. ������������

������������������ SkillButton ��������������������������������������������� SkillButton ���������������������

#ifndef _SKILL_BUTTON_H_
#define _SKILL_BUTTON_H_
#include "cocos2d.h"
using namespace cocos2d;
#include "Global.h"
class SkillButton : public Node {
public:
SkillButton();
~SkillButton();
static SkillButton* create(const char* Nomal, const char* Click, const char* Mask, float CDTime = 1.0f);
static SkillButton* create(const char* Nomal, const char* Mask, float CDTime);
static SkillButton* create(const char* Nomal, float CDTime);
static SkillButton* create(const char* Nomal);
CC_SYNTHESIZE(float, _cdtime, CDTime);
void ClickCallBack(Ref* obj);
void CoolDownCallBack(Node* node);
private:
bool init(const char* Nomal, const char* Click, const char* Mask, float CDTime);
MenuItemImage* _ItemSkill;
Sprite* _Mask;
ProgressTimer* _ProgressTimer;
Label* _atLabel;
float CdTime;
void CoolDownReduce(float dt);
};
#endif
#include "SkillButton.h"
using namespace cocos2d;
SkillButton::SkillButton() :
_ItemSkill(NULL),
_Mask(NULL),
_cdtime(1.0f),
_ProgressTimer(NULL) {
}
SkillButton::~SkillButton() {
}
SkillButton* SkillButton::create(const char* Normal, const char* Click, const char* Mask, float CDTime) {
SkillButton* skillButton = new SkillButton();
if (skillButton && skillButton->init(Normal, Click, Mask, CDTime)) {
skillButton->autorelease();
return skillButton;
}
CC_SAFE_DELETE(skillButton);
return nullptr;
}
SkillButton* SkillButton::create(const char* Normal, const char* Mask, float CDTime) {
return SkillButton::create(Normal, Normal, Mask, CDTime);
}
SkillButton* SkillButton::create(const char* Normal, float CDTime) {
return SkillButton::create(Normal, Normal, Normal, CDTime);
}
SkillButton* SkillButton::create(const char* Normal) {
return SkillButton::create(Normal, Normal, Normal, 1.0f);
}
bool SkillButton::init(const char* Normal, const char* Click, const char* Mask, float CDTime) {
bool ret = false;
do {
if (!Node::init()) break;
CCAssert(Mask, "SkillButton::init Mask != NULL");
CCAssert(Normal, "SkillButton::init Normal != NULL");
CCAssert(Click, "SkillButton::init Click != NULL");
_ItemSkill = MenuItemImage::create(Normal, Click, CC_CALLBACK_1(SkillButton::ClickCallBack, this));
_ItemSkill->setPosition(Vec2::ZERO);
auto MenuSkill = Menu::create(_ItemSkill, NULL);
MenuSkill->setPosition(Vec2::ZERO);
addChild(MenuSkill, -100);
if (Normal == Mask) {
_Mask = Sprite::create();
_Mask->setTexture(Normal);
_Mask->setColor(Color3B(0,0,0));
_Mask->setOpacity(100);
} else {
_Mask = Sprite::create(Mask);
}
_Mask->setPosition(Vec2::ZERO);
_Mask->setVisible(false);
addChild(_Mask, 0);
_ProgressTimer = ProgressTimer::create(Sprite::create(Normal));
_ProgressTimer->setType(ProgressTimer::Type::RADIAL);
_ProgressTimer->setPosition(Vec2::ZERO);
_ProgressTimer->setVisible(false);
addChild(_ProgressTimer, 100);
this->setCDTime(CDTime);
CdTime = CDTime;
_atLabel = Label::create();
_atLabel->setSystemFontSize(_Mask->getContentSize().width / 3);
_atLabel->setColor(Color3B(0,0,0));
_atLabel->setPosition(Vec2::ZERO);
addChild(_atLabel, 200);
_atLabel->setVisible(false);
ret = true;
} while (0);
return ret;
}
void SkillButton::ClickCallBack(Ref* obj) {
_ItemSkill->setEnabled(false);
_Mask->setVisible(true);
_ProgressTimer->setVisible(true);
_atLabel->setVisible(true);
this->schedule(schedule_selector(SkillButton::CoolDownReduce), 0.1f);
global->hero->runChangeAttack();
ActionInterval* action_progress_to = Sequence::create(
ProgressTo::create(this->getCDTime(), 100),
NULL
);
CallFunc* action_callback = CallFuncN::create(CC_CALLBACK_1(SkillButton::CoolDownCallBack, this));
_ProgressTimer->runAction(Sequence::create(action_progress_to, action_callback, NULL));
}
void SkillButton::CoolDownReduce(float dt) {
_atLabel->setString(__String::createWithFormat("%.1f", CdTime - 0.1f)->getCString());
}
void SkillButton::CoolDownCallBack(Node* node) {
_ItemSkill->setEnabled(true);
_Mask->setVisible(false);
_ProgressTimer->setVisible(false);
_ProgressTimer->setPercentage(0);
_atLabel->setVisible(false);
CdTime = this->getCDTime();
this->unschedule(schedule_selector(SkillButton::CoolDownReduce));
}

3. ������������

������������ create ���������������������������������������������������������������������������������������������������������������������

auto skillA = SkillButton::create("SkillButton.png", 3.0f);
skillA->setPosition(attackItem->getPosition() - Vec2(50, 0));
this->addChild(skillA);

4. ������������

  • ���������������������������������������������������������������������������������������
  • ���������������������������������������������������������������������
  • ������������������������������������������������������������������������������������������
  • ���������������������������������������������������������������������

5. ������tip

  • ���������������������������������������������������������������������������
  • ���������������������������������������������������������������������������������������������������������������������

������

������������ SkillButton ������������������������������������������������������������������������������������������������������������������������

上一篇:制作横版游戏KillBear第7课:攻击判定 伤害飘血
下一篇:制作横版游戏KillBear第9课:暂停层+屏蔽下层监听

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年04月02日 15时45分36秒