Cocos3.4 横版游戏制作-《KillBear》-攻击判定+伤害飘血
转载时请务必以超链接形式标明文章,原始出处 。 上一篇: Cocos3.4 横版游戏制作-《KillBear》-添加敌人+简单AI实现 开发环境win64 : vs2010 代码RoleHero我们直接在.cpp和.h中加入返回判定,
void Hero::attackCallBackAction(Node* pSender);//普通攻击回调
void Hero::FontsCallBackAction(Node* pSender);//数字淡出回调
void Hero::damageDisplay(int number,Vec2 point);//产生伤害数字动画
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) < 20)
{
Rect attackReck = m_hitBox.actual;//英雄攻击区域
Rect hurtReck = pEnemy->getBodyBox().actual;;//怪物受伤区域
if(attackReck.intersectsRect(hurtReck))
{
pEnemy->setAllowMove(false);
pEnemy->runHurtAction();
int damage = random(this->getDamageStrenth()*0.7,this->getDamageStrenth()*1.3);
pEnemy->setCurtLifeValue(pEnemy->getCurtLifeValue() - damage);
if(pEnemy->getCurtLifeValue() <= 0)
{
pEnemy->runDeadAction();
pEnemy->setBodyBox(createBoundingBox(Vec2::ZERO,Size::ZERO));
}
}
}
}
//this->runIdleAction();
}
然后不要忘了在上方攻击序列创建的时候加入判定 //普通攻击A,分出招和收招,期间夹杂攻击判定.自己可以通过调节fps控制出招速度之类的
Animation *attackAnima1 = this->createAttackAnimation("boy_attack_00_%02d.png",0,4,10);
Animation *attackAnima2 = this->createAttackAnimation("boy_attack_00_%02d.png",8,15);
this->setNomalAttackA(Sequence::create(
Animate::create(attackAnima1),CallFuncN::create(CC_CALLBACK_1(Hero::attackCallBackAction,this)),Animate::create(attackAnima2),Role::createIdleCallbackFunc(),NULL));
效果 Enemy同样在敌人加入攻击判定. 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() <= 0)
{
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(18);
atLabel->setColor(Color3B(0,128));
atLabel->setPosition(point);
global->gameLayer->addChild(atLabel,200);
FiniteTimeAction * callFuncN = CallFuncN::create(atLabel,callfuncN_selector(Hero::FontsCallBackAction));
FiniteTimeAction *sequence = Sequence::create(
//FadeIn::create(1.5f),
ScaleTo::create(0.2f,1.3f),MoveBy::create(0.2f,Vec2(0,20)),FadeOut::create(0.5f),callFuncN,NULL);
atLabel->runAction(sequence);
}
被忘了在上面的attackCallBackAction中加入 damageDisplay(damage,pEnemy->getBodyBox().actual.origin);
效果结语攻击判定框在前面在刚创建的时候已经设定了 本Demo只是一个演示效果,所以全部的攻击判定只用了一个判定框 下一篇,将添加一个有冷却的按钮实现Hero技能攻击 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |