轉載時請務必以超連結形式标明文章,原始出處 。
資源為網上尋找的,僅研究學習用,若是侵犯版權請通知本人整改。
上一篇: Cocos3.4 橫版遊戲制作-《KillBear》-添加敵人+簡單AI實作
上篇在遊戲層加入了敵人,并實作了簡單的AI
本篇将在前面的基礎上使攻擊有效,建立攻擊判定, 當Hero攻擊敵人時會出現傷害值顯示
開發環境
win64 : vs2010
Cocos2d-x v3.4Final
TexturePackerGUI
MapEdit
代碼
Role
Hero
我們直接在.cpp和.h中加入傳回判定,
- .h
void Hero::attackCallBackAction(Node* pSender);//普通攻擊回調
void Hero::FontsCallBackAction(Node* pSender);//數字淡出回調
void Hero::damageDisplay(int number,Vec2 point);//産生傷害數字動畫
- .cpp
void Hero::attackCallBackAction(Node* pSender)
{//普通攻擊回調
__Array* pEnemies = global->enemies ;
Ref *enemyObj = NULL;
//周遊所有怪物
CCARRAY_FOREACH(pEnemies, enemyObj)
{
Enemy *pEnemy = (Enemy*)enemyObj;
if(fabsf(this->getPosition().y - pEnemy->getPosition().y) < )
{
Rect attackReck = m_hitBox.actual;//英雄攻擊區域
Rect hurtReck = pEnemy->getBodyBox().actual;;//怪物受傷區域
if(attackReck.intersectsRect(hurtReck))
{
pEnemy->setAllowMove(false);
pEnemy->runHurtAction();
int damage = random(this->getDamageStrenth()*,this->getDamageStrenth()*);
pEnemy->setCurtLifeValue(pEnemy->getCurtLifeValue() - damage);
if(pEnemy->getCurtLifeValue() <= )
{
pEnemy->runDeadAction();
pEnemy->setBodyBox(createBoundingBox(Vec2::ZERO, Size::ZERO));
}
}
}
}
//this->runIdleAction();
}
然後不要忘了在上方攻擊序列建立的時候加入判定
//普通攻擊A,分出招和收招,期間夾雜攻擊判定.自己可以通過調節fps控制出招速度之類的
Animation *attackAnima1 = this->createAttackAnimation("boy_attack_00_%02d.png", , , );
Animation *attackAnima2 = this->createAttackAnimation("boy_attack_00_%02d.png", , , );
this->setNomalAttackA(Sequence::create(
Animate::create(attackAnima1),
CallFuncN::create(CC_CALLBACK_1(Hero::attackCallBackAction,this)),
Animate::create(attackAnima2),
Role::createIdleCallbackFunc(),
NULL));
效果
Enemy
同樣在敵人加入攻擊判定.
就不貼.h了,同樣注意在動作建立的時候加入攻擊判定
void Enemy::attackCallBackAction(Node* pSender)
{
Hero* t_hero = global->hero;
Rect attackReck = m_hitBox.actual;//怪物攻擊區域
Rect hurtReck = t_hero->getBodyBox().actual;//英雄受傷區域
if(attackReck.intersectsRect(hurtReck))
{
t_hero->setAllowMove(false);
int damage = this->getDamageStrenth();
t_hero->runHurtAction();
t_hero->setCurtLifeValue(t_hero->getCurtLifeValue() - damage);
}
if(t_hero->getCurtLifeValue() <= )
{
t_hero->runDeadAction();
t_hero->setBodyBox(createBoundingBox(Vec2::ZERO, Size::ZERO));
}
}
效果
我們在Hero攻擊回調一個傷害顯示函數,顯示傷害值,過會兒自己消失掉
void Hero::FontsCallBackAction(Node* pSender)
{
//數字淡出回調
global->gameLayer->removeChild(pSender);
}
void Hero::damageDisplay(int number,Vec2 point)
{
//産生數字動畫
auto atLabel = Label::create();
//char ch[100]={0};
//sprintf(ch,"-%d",number);
atLabel->setString(__String::createWithFormat("-%d",number)->getCString());
atLabel->setSystemFontSize();
atLabel->setColor(Color3B(,,));
atLabel->setPosition(point);
global->gameLayer->addChild(atLabel,);
FiniteTimeAction * callFuncN = CallFuncN::create(atLabel, callfuncN_selector(Hero::FontsCallBackAction));
FiniteTimeAction *sequence = Sequence::create(
//FadeIn::create(1.5f),
ScaleTo::create(f,f),
MoveBy::create(f,Vec2(,)),
FadeOut::create(f),
callFuncN,
NULL);
atLabel->runAction(sequence);
}
被忘了在上面的attackCallBackAction中加入
效果
結語
攻擊判定框在前面在剛建立的時候已經設定了
對于此類遊戲來說,最複雜也是最困難的就是各種判定了.
本Demo隻是一個示範效果,是以全部的攻擊判定隻用了一個判定框
最好的方式是,單獨給每一種動作,建立受擊和攻擊判定.是一個相當繁瑣的工作.
對于攻擊動作來說,在動作進行當中添加判定比剛開始或者是結束後添加更加的真實.
每一個動作也可以放多個攻擊判定實作多段攻擊,效果如擊飛(據攻擊方向相反出移動一定距離),上挑(Y軸移動一定距離)
下一篇,将添加一個有冷卻的按鈕實作Hero技能攻擊