[Cocos2d塔防游戏开发]Cocos2dx-3.X完成塔防游戏《王国保卫战》--防御塔(二)之初级箭塔

news/2024/3/4 9:18:46

该章节主要介绍如何制作初级箭塔

首先我们先观察下这个游戏的箭塔

 

这个游戏的箭塔都是拥有两个弓箭手。以初级塔为例,左右两边分别有两个弓箭手,可以攻击不同的目标,并且同时只有一个弓箭手在攻击。根据这个特性我们写一个BaseArrowTower

class BaseArrowTower: public BaseTower
{
public:protected:Sprite* shooter_1;//弓箭手1号Sprite* shooter_2;//弓箭手2号Sprite* towerBase;//塔int shootTag;//弓箭手标记void initTower(int level);//初始化弓箭塔void addTerrain();//添加塔坯子(就是那个都是塔下面那个都是弓箭的地面,不同地图有不同的坯子~)virtual Bullet* ArrowTowerBullet();//生成弓箭virtual void shoot(float dt);//射!
};


现在让我们看下防御塔建造过程:

1.选择建造类型

2.执行建造动画(进度条,冒烟等)

3.去除动画精灵,添加防御塔

4.开始攻击

同样用1级箭塔举例

class SimpleArrowTowerlvl1: public BaseArrowTower
{
public:bool init();//初始化CREATE_FUNC(SimpleArrowTowerlvl1);void updateTower();//升级void showUpdateMenu();//显示升级菜单Bullet* ArrowTowerBullet();//生成弓箭
private:void buildingAnimation();//开始建造动画void buildingSmokeAnimation(float dt);
};

其中init()函数会由BaseArrowTower中的CREATE_FUNC宏自动执行,在init()中依次初始化各个参数,并且执行建造动画buildingAnimation

其中建造动画就是添加进度条、建造动画精灵等动作

void SimpleArrowTowerlvl1::buildingAnimation()
{auto building = Sprite::create();auto constructing = Sprite::createWithSpriteFrameName("tower_constructing_0004.png");auto hpBgSprite = Sprite::createWithSpriteFrameName("buildbar_bg.png");hpBgSprite->setPosition(Point(constructing->getContentSize().width / 2, constructing->getContentSize().height /2+10));auto hpBar = ProgressTimer::create(Sprite::createWithSpriteFrameName("buildbar.png"));hpBar->setType(ProgressTimer::Type::BAR);hpBar->setMidpoint(Point(0, 0.5f));hpBar->setBarChangeRate(Point(1, 0));hpBar->setPercentage(0);hpBar->setPosition(Point(hpBgSprite->getContentSize().width / 2, hpBgSprite->getContentSize().height / 2 ));hpBgSprite->addChild(hpBar);constructing->addChild(hpBgSprite);building->addChild(constructing);addChild(building);hpBar->runAction(Sequence::create(ProgressTo::create(0.5f, 100), CallFuncN::create(CC_CALLBACK_0(Sprite::removeFromParent, building)), NULL));scheduleOnce(schedule_selector(SimpleArrowTowerlvl1::buildingSmokeAnimation),0.5f);
}
hpBar->runAction(Sequence::create(ProgressTo::create(0.5f, 100), CallFuncN::create(CC_CALLBACK_0(Sprite::removeFromParent, building)), NULL));是执行一个动画序列,首先是执行进度条的动画,时间0.5秒,从0-100,再执行removeFromParent将建造动画精灵移除。

再延迟0.5S执行scheduleOnce(schedule_selector(SimpleArrowTowerlvl1::buildingSmokeAnimation),0.5f);执行一个冒烟动画然后将塔添加进去(当然这里也可以写到上面的动画序列当中)

void SimpleArrowTowerlvl1::buildingSmokeAnimation(float dt)
{auto smoke = Sprite::createWithSpriteFrameName("effect_buildSmoke_0001.png");addChild(smoke,99);smoke->runAction(Sequence::create(Animate::create(AnimationCache::getInstance()->getAnimation("build_smoke")),CallFuncN::create(CC_CALLBACK_0(Sprite::removeFromParent, smoke)),NULL));SoundManager::playArcherReady();initTower(1);setListener();schedule(schedule_selector(SimpleArrowTowerlvl1::shoot), 1.0f);
}
并在1S后开始执行shoot攻击敌人
void BaseArrowTower::shoot(float dt)
{auto instance = GameManager::getInstance();checkNearestMonster();char temp1[20]; sprintf(temp1, "level%d_shoot_down", level); char temp2[20]; sprintf(temp2, "level%d_shoot_top", level);//根据等级生成图片名,保存临时变量if(nearestMonster!=NULL && nearestMonster->getCurrHp() > 0 ){auto currBullet = ArrowTowerBullet();Point shootVector = nearestMonster->baseSprite->getPosition() - this->getParent()->getPosition();//怪物精灵是在地图上添加的,而塔的父精灵才是在地图上添加的,所以要统一标准计算//计算防御塔与敌人之间的角度float startAngle = currBullet->getRotation();float endAngle = 0;auto pVectr = currBullet->getPosition()-shootVector;float angleRadians=atan(pVectr.y/pVectr.x);float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians);if(shootVector.x - currBullet->getPosition().x<=0)//敌人在坐标,需要向左攻击{startAngle = startAngle + abs(angleDegrees);//初始弓箭角度endAngle = -90;//弓箭结束角度,向下,即插入地面if(shootTag == 1)//轮到1号弓箭手{currBullet->setPosition(Point(0,30));//子弹设置在弓箭手所在位置	shooter_1->setFlippedX(true);//X轴翻转,即面向左边if(shootVector.y - currBullet->getPosition().y<=0){//执行攻击动画,AnimationCache是自定义的动画类,会根据传入图片名生成帧动画shooter_1->runAction(Animate::create(AnimationCache::getInstance()->getAnimation(temp1)));}else{shooter_1->runAction(Animate::create(AnimationCache::getInstance()->getAnimation(temp2)));}shootTag = 2;}else//轮到2号弓箭手{currBullet->setPosition(Point(10,30));		shooter_2->setFlippedX(true);if(shootVector.y - currBullet->getPosition().y<=0){shooter_2->runAction(Animate::create(AnimationCache::getInstance()->getAnimation(temp1)));}else{shooter_2->runAction(Animate::create(AnimationCache::getInstance()->getAnimation(temp2)));}shootTag = 1;}}else//敌人在右边,其他同上{startAngle = startAngle - abs(angleDegrees);endAngle = 270;if(shootTag == 1){currBullet->setPosition(Point(0,30));		shooter_1->setFlippedX(false);if(shootVector.y - currBullet->getPosition().y<=0){shooter_1->runAction(Animate::create(AnimationCache::getInstance()->getAnimation(temp1)));}else{shooter_1->runAction(Animate::create(AnimationCache::getInstance()->getAnimation(temp2)));}shootTag = 2;}else{currBullet->setPosition(Point(10,30));		shooter_2->setFlippedX(false);if(shootVector.y - currBullet->getPosition().y<=0){shooter_2->runAction(Animate::create(AnimationCache::getInstance()->getAnimation(temp1)));}else{shooter_2->runAction(Animate::create(AnimationCache::getInstance()->getAnimation(temp2)));}shootTag = 1;}}//贝叶斯弧线ccBezierConfig bezier;if(shootTag == 1)//播放射箭音效SoundManager::playArrowShoot1();elseSoundManager::playArrowShoot2();//计算贝叶斯曲线的两个控制点bezier.controlPoint_1 = Point(currBullet->getPosition().x,currBullet->getPosition().y+200); bezier.controlPoint_2 = Point(shootVector.x,shootVector.y+200);; bezier.endPosition = shootVector;auto action = Spawn::create(BezierTo::create(0.5f, bezier),RotateTo::create(0.5f,endAngle),NULL);//攻击动画传递弓箭currBullet->setBulletAction(action);currBullet->shoot();currBullet = NULL;}
}
根据角度使用ccBezierConfig类来生成BezierTo移动动画,是一个弧线,具体内容百度的到

然后用Spwan将BezierTo与弓箭旋转动画合成为一个action,将action传递给子弹类,由子弹类具体执行,为何不在塔类中执行,将在子弹章节中讲解。

执行子弹类的shoot,攻击动画完成




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

相关文章

基地保留节目--塔防游戏

版权声明:本文由神州数码云基地团队整理撰写&#xff0c;若转载请注明出处。 7月的某一天晚上9点&#xff0c;2021年刚毕业的尹煊博在公司里紧锁着眉梢&#xff0c;一边敲击着键盘一边自言自语的囔囔着&#xff1a;“为啥我的兵就出不来呢&#xff1f;”这天应该是他入职还没满…

[Cocos2d塔防游戏开发]Cocos2dx-3.X完成塔防游戏《王国保卫战》--地图(二)

接上文&#xff0c;添加地图&#xff0c;在地图层直接添加即可&#xff0c;我是将AnchorPoint设置在&#xff08;0,0)&#xff0c;方便计算坐标 mapSprite Sprite::createWithSpriteFrameName(String::createWithFormat("Stage_%d.png",level1)->getCString()); …

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

该章节主要介绍防御塔的子弹 有了防御塔没有子弹类是不能攻击敌人的&#xff0c;所以接着来讨论子弹&#xff0c;新建一个子弹基类Bullet.h class Bullet : public Sprite { public:Bullet();~Bullet();virtual bool init();CREATE_FUNC(Bullet);protected:CC_SYNTHESIZE(int,…

好玩的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;时间…

详解P431 塔防

题目 说明 gsy 最近在玩一个塔防游戏&#xff0c;但是这次她控制的是迷宫中的怪兽而非防御塔建造者 游戏的地图是一个 n * m 的矩阵&#xff0c;起点在 (1,1) &#xff0c;终点在 (n,m) &#xff0c;gsy 每次可以选择上下左右四个方向移动 1 步 这个地图上有很多的防御塔&#…

塔防(cover)

塔防&#xff08;cover&#xff09;Atcoder/CF的某道题 题目背景 在某个塔防游戏中&#xff0c;有一种防御塔&#xff0c;可以攻击到上下左右四个方向以及自身位置的敌人。 题目描述 塔防游戏的一个关卡地图可以看作一个 R C R\times C RC的矩阵&#xff0c;也就是 R R R行&am…

宝石塔防的贴吧地址:

宝石争霸吧 http://tieba.baidu.com/f?kw%B1%A6%CA%AF%D5%F9%B0%D4

宝石塔防:如果还有人过不去1337,俺来发个详细点儿的攻略吧

游戏版本建议1.17,贴吧里有破解版,因为这个版本有个让所有怪一次性出完的快捷键很好用 前期,100级以内,这个升级没什么难度,随便找一关,选无尽模式,不论你怎么造,尽量坚持,几十或100来波左右死就死掉了,然后经验一涨一大截,总结下来就是无尽模式巨型怪,你也可以把巨怪血弄高一…

宝石塔防攻略

宝石塔防小游戏攻略 (Gem Craft Game Guide) 作者&#xff1a;神马游戏原创 类型&#xff1a;策略 专题&#xff1a;经典 宝石 塔防 2011-04-18 宝石塔防小游戏攻略1&#xff1a; 五、最后一关BOSS攻略。必须打两轮。关键点&#xff1a;&#xff08;1&#xff09;后期…

宝石塔防3心得

心得   把重要的技能学满级后 多的技能点升级魔法上限 这样扩充魔法池的效果更好 更快   参考楼下的陷阱流 在出怪口放一个陷进 宝石用多重和吸魔双色合成宝石 周围尽可能的放满辅助塔 也放多重和吸魔的双色合成宝石&#xff08;初始魔法不多 辅助塔里宝石放小点的也行 主…

探索Python条件语句的奇妙世界:解密逻辑与控制流

文章目录 前言if 语句if ... else ...多重判断&#xff08;if ... elif ... else...&#xff09;if 嵌套猜数字游戏三目运算符 前言 Python的条件语句用来根据特定的条件决定程序的执行流程。它允许程序根据条件的真假执行不同的代码块&#xff0c;从而实现不同情况下的不同操…

I/O复用的高级应用三——同时处理TCP和UDP服务

截至目前学习&#xff0c;我们讨论过的服务器程序都只监听一个端口。但在实际应用中&#xff0c;有不少服务器程序能同时监听多个端口&#xff0c;比如超级服务inetd和android的调试服务adbd。 从bind系统调用的参数看&#xff0c;一个socket只能与一个socket地址绑定&#xff…

windows下优化笔记本性能——降低CPU使用率

最近发现待机时CPU使用率30%多&#xff0c;觉得有点高&#xff0c;于是打开资源管理器发现有个叫COM Surrogate的进程啥几把用没有还占了30%&#xff0c;于是就想办法把他杀掉。方法如下&#xff1a; 杀掉之后CPU使用率只有10%左右了.
最新文章