[Cocos2d塔防游戏开发]Cocos2dx-3.X完成塔防游戏《王国保卫战》--子弹类(一)

news/2025/2/13 19:55:51/

该章节主要介绍防御塔的子弹

有了防御塔没有子弹类是不能攻击敌人的,所以接着来讨论子弹,新建一个子弹基类Bullet.h

class Bullet : public Sprite
{
public:Bullet();~Bullet();virtual bool init();CREATE_FUNC(Bullet);protected:CC_SYNTHESIZE(int, maxForce, MaxForce);//攻击力CC_SYNTHESIZE(int, bulletScope, BulletScope);//塔的子弹攻击范围CC_SYNTHESIZE(int, bulletType, BulletType);//子弹类型CC_SYNTHESIZE(Spawn*, bulletAction, BulletAction);//子弹飞行动画Sprite* sprite;//子弹精灵-贴图virtual void shoot(){};//攻击virtual void removeBullet(){};//攻击完毕后移除
};

在基类中我们定义了一些共有的方法和属性,然后根据不同的子弹来重写它

例如上一篇提到的初级箭塔的弓箭,我们需要重写init()来给精灵贴上弓箭这张图片(arrow.png在plist里,实现加载过该plist,具体加载过程见开始动画章节)

bool Arrow::init()
{if (!Sprite::init()){return false;}sprite = Sprite::createWithSpriteFrameName("arrow.png");addChild(sprite);		return true;
}
然后重写shoot(),弓箭的攻击动作最简单,新建一个动画序列,先执行箭塔根据自身位置和敌人位置生成的弧线和弓箭自身旋转的动画,然后执行removeBullet

void Arrow::shoot()
{SoundManager::playArrowRelease();//播放音效runAction(Sequence::create(bulletAction,CallFuncN::create(CC_CALLBACK_0(Arrow::removeBullet, this)),NULL));
}
其中弓箭在执行完上述动画后,若此时弓箭所在位置与敌人位置重叠即击中敌人,则根据攻击力减少敌人血量,弓箭所在的区域如下:

auto bulletRect = Rect(

                                this->getPositionX() +this->getParent()->getPositionX() - this->getContentSize().width /2,

                                this->getPositionY() +this->getParent()->getPositionY() - this->getContentSize().height/2,

this->sprite->getContentSize().width,

                                this->sprite->getContentSize().height );

因为弓箭是由防御塔创建并且添加在防御塔建造点那个精灵上上,所以需要通过this->getParent()->getPositionX() 先来获取防御塔X轴所在的位置,this->getPositionX() 即子弹相对于防御塔的X轴位置,两者相加即子弹在地图所在的位置,Y轴同理,根据宽高计算相应的区域。

然后我们遍历保存在单例中的敌人,若区域重叠,则判断集中,进行更新敌人血量、执行喷血(血腥~)动画等动作。

具体思路来自于cocos2dx官网《贼来了》这款教程,但不同的是他将子弹的动画与击中敌人等动作由地图类完成,通过每一帧来判断是否集中敌人,这样方案在2D平面中可行,因为这款游戏是2.5D的,弓箭有一个飞到最高点并下落的过程,所以必须由其自身执行,并在其动画结束在判断。、

若为集中敌人,有一个弓箭插在地上并且等待若干时间后消失的动画

void Arrow::removeBullet()
{bool isMissed = true;//判断是否击中,默认未击中auto instance = GameManager::getInstance();auto bulletRect = Rect(this->getPositionX() +this->getParent()->getPositionX() - this->getContentSize().width /2,this->getPositionY() +this->getParent()->getPositionY() - this->getContentSize().height/2,this->sprite->getContentSize().width,this->sprite->getContentSize().height );auto monsterVector = instance->monsterVector;//遍历for (int j = 0; j < monsterVector.size(); j++){auto monster = monsterVector.at(j);auto monsterRect = monster->baseSprite->getBoundingBox();//判断是否重叠并且可以被士兵击中,即不在地下(有种地下的敌人无法被射中)	if (monsterRect.intersectsRect(bulletRect) && monster->getAttackBySoldier()){auto currHp = monster->getCurrHp();currHp =  currHp - this->getMaxForce() + monster->getArmor();//if(currHp <= 0){currHp = 0;}monster->setCurrHp( currHp );monster->getHpBar()->setPercentage((currHp/monster->getMaxHp())*100);//更新血条monster->getHurt();isMissed = false;  //设为击中  if(currHp == 0){monster->death();}break;}}if(isMissed){//若未击中sprite->setSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("decal_arrow.png"));sprite->runAction(Sequence::create(FadeOut::create(1.0f),CallFuncN::create(CC_CALLBACK_0(Bullet::removeFromParent, this)), NULL));}else{this->removeFromParent();}
}

这就是最简单的子弹类---弓箭,还有其他子弹例如炮弹、导弹甚至震荡波,巫毒图腾等~也是这个思路,只不过动画复杂的鞋


有了地图,防御塔,子弹,相信初学者已经可以独立完成这款游戏了,下面将介绍基本怪物类



http://www.ppmy.cn/news/624531.html

相关文章

好玩的Java塔防游戏,比较火的塔防手游!塔防游戏排行榜推荐

十年之前&#xff0c;我在同学的诺基亚上玩过一款非常好玩的JAVA塔防手游&#xff0c;具体的名字虽然忘了&#xff0c;但当时连续通宵好几个晚上对其喜爱的热情至今也无法忘记。回到现在&#xff0c;手游也从之前的单机到现在的多人联网&#xff0c;玩法上更是增加了许多&#…

[Cocos2d塔防游戏开发]Cocos2dx-3.X完成塔防游戏《王国保卫战》--其他

最后一章&#xff0c;讲一下其他零碎的地方。 防御塔方面&#xff0c;还有炮塔的两个高级塔&#xff0c;例如地震塔&#xff0c;机器人塔。地震塔就是周围敌人全部减少血量&#xff0c;机器人塔就是一个士兵类&#xff0c;炮塔升级成士兵类&#xff0c;实现方式和士兵类似。 法…

打外星生物的塔防java_塔防游戏有很多,这一款防外星人的游戏,你玩过没

拥有各自风格特色的多种防御塔&#xff0c;游戏包括精美界面设置。玩的时候他音效有种搞怪的感觉。好多种防御塔捍卫萝卜&#xff0c;不同防御塔有不同的威力和功能&#xff0c;可以收集道具&#xff0c;还可以以养外星人达到更多的成果。就我而言&#xff0c;这个游戏就给我带…

04 塔防底板布局 (和儿子一起编游戏-塔防系列 )

4.1 基本概念 从简单的来讲&#xff0c;塔防的底板由供坏蛋行走的路线&#xff0c;供安放炮塔的底座&#xff0c;起始点和终止点组成&#xff0c;成品的效果是这样的&#xff1a; 要做成上面说的底板&#xff0c;就要涉及到Unity3D Prefab&#xff0c;这是一个预制件概念&…

《王国之泪》掉帧严重怎么破?超频Switch教程来了,稳定30帧运行

萧箫 发自 凹非寺量子位 | 公众号 QbitAI 《塞尔达传说王国之泪》简直爆火&#xff0c;相比之下Switch有点“带不动”它了。 这不&#xff0c;就在游戏发售后&#xff0c;不少玩家发现它最大的问题是掉帧严重&#xff0c;尤其是使用“究极手”在海拉鲁搞事时&#xff0c;能直接…

[Cocos2d塔防游戏开发]Cocos2dx-3.X完成塔防游戏《王国保卫战》--游戏开始界面

修改AppDelegate中内容&#xff0c;将setDesignResolutionSize中改为 <span style"font-size:14px;">(960, 640, ResolutionPolicy::FIXED_HEIGHT)</span> 保持传入的设计分辨率高度不变&#xff0c;根据屏幕分辨率修正设计分辨率的宽度 通过&#xff1a…

塔防类游戏关卡分析

转自&#xff1a;http://blog.csdn.net/u014779452/article/details/48471669 隐约还记得最开始接触的塔防游戏是在《魔兽争霸3》里的一个塔防地图&#xff0c;一个田字型的地图&#xff0c;四周一波一波的来怪物&#xff0c;而玩家需要在路边建塔消灭进攻的怪物&#xff0c;阻…

[Cocos2d塔防游戏开发]Cocos2dx-3.X完成塔防游戏《王国保卫战》--简介+代码+资源

学校实训项目需要用cocos2dx做一款塔防游戏&#xff0c;因为时间与制图技术、创意原因无法进行原创&#xff0c;碰巧找到了皇家守卫军这款游戏的图片资源&#xff0c;决定用cocos2dx来重现这款经典塔防游戏。 本项目已完成3分之1&#xff0c;初学cocos2dx1个月&#xff0c;时间…