推荐几个可以自己制定路线(种防御塔然后形成路)的梦塔防司马懿任务路线游戏!

Cocos2d-x 3.x开发塔防游戏《王国保卫战》04:防御塔
招聘信息:
上篇讲到地图,本文就直接从塔防游戏的最根本的”塔“来讲起吧!首先我们定义一个防御塔的基类BaseTower&class&BaseTower:&public&Sprite我们要先确定一个塔所具备的属性,这些可以根据自己所设计的游戏需要来自行定义,例如:CC_SYNTHESIZE(TowerType,&towerType,&TowerType);&//类型&&
CC_SYNTHESIZE(Terrain*,&myTerrain,&MyTerrain);&&//建造点&&
CC_SYNTHESIZE(std::string,&towerName,&TowerName);&//名称&&
CC_SYNTHESIZE(int,&level,&Level);//等级&&
CC_SYNTHESIZE(float,&scope,&Scope);//范围&&
CC_SYNTHESIZE(float,&nextScope,&NextScope);//升级后范围&&
CC_SYNTHESIZE(float,&rate,&Rate);//攻击速度&&
CC_SYNTHESIZE(int,&force,&Force);//攻击力&&
CC_SYNTHESIZE(int,&updateMoney,&UpdateMoney);//升级所需金钱&&
CC_SYNTHESIZE(int,&buildMoney,&BuildMoney);//售出时返还金钱然后定义一些可能出现的公共方法,在不同的防御塔子类中实现:public:&&
&&virtual&void&updateTower(){};//升级防御塔(基础升级)&&
&&virtual&void&sellTower();//售卖防御塔&&
&&virtual&void&removeTower();//移除防御塔&&
&&virtual&bool&init();//初始化防御塔&&
&&virtual&void&showTowerInfo();//显示防御塔信息&&
&&virtual&void&update1(){};//两种升级方向&&
&&virtual&void&update2(){};&&
&&virtual&void&setRallyPoint(Point&point){};//兵营塔的设置集结点&&
protected:&&&
&&virtual&void&checkNearestMonster();//检测附近敌人&&
&&BaseMonster*&nearestM&&//附近的敌人&&
&&bool&onTouchBegan(Touch&*touch,&Event&*event);&&
&&void&onTouchEnded(Touch*&touch,&Event*&event);&&
&&virtual&void&showUpdateMenu(){};//显示升级选项&&
&&virtual&void&hideUpdateMenu();//隐藏&&
&&Sprite*&//该塔的建造点&&
&&void&setListener();//设置某些监听事件每个防御塔会有自己的shoot(float dt)之类的方法(根据防御塔类型不同而不同),通过schedule(schedule_selector(BaseTower::shoot), 0.5f);定时调用,此时的0.5f就和防御塔的攻击速率有关,越短,攻击速度越快。防御塔攻击敌人的思路参考了《》这篇文章,感谢作者。每次防御塔执行自己的shoot方法时,首先执行CheckNearestMonster来检测附近是否存在可以攻击的敌人void&BaseTower::checkNearestMonster()&&
&&&&auto&instance&=&GameManager::getInstance();&&
&&&&auto&monsterVector&=&instance->monsterV//全局Vector变量,用来存储当前关卡的敌人&&
&&&&auto&currMinDistant&=&this->&&&
&&&&nearestMonster&=&NULL;&&
&&&&for(int&i&=&0;&i&getParent()->getPosition().getDistance(monster->baseSprite->getPosition());//算坐标距离&&
&&&&if&(distance&getAttackByTower())&{&//当在塔的范围内,且怪物可以被攻击(某些地下怪物只有钻出地面可以被攻击)&&
&&&&&&&&currMinDistant&=&//设置最小距离,找到最近的怪物&&&&
&&&&&&&&nearestMonster&=&
}&}}其中计算距离的时候有个getParent()是因为每个防御塔是建造在一个Terrain精灵类上面,这样的好处是1原版游戏在建造点建造防御塔时,可以看到建造点扔在防御塔下面,2即使防御塔被卖掉,建造点扔在,不用重新去生成,方便管理(我是这么设计的...)然后就是关键的shoot方法了,炮塔,弓箭塔,法师塔的原理基本一样,只是攻击的动画和轨迹计算不同而已,只有兵营塔略微不同,这些都将在下一章讲解。。。通过setLinstener()给防御塔设置触摸时间:void&BaseTower::setListener()&&
&&auto&listener&=&EventListenerTouchOneByOne::create();&&
&&listener->onTouchBegan&=&CC_CALLBACK_2(BaseTower::onTouchBegan,&this);&&
&&listener->onTouchEnded&=&CC_CALLBACK_2(BaseTower::onTouchEnded,&this);&&
&&_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,terrain);&&
}对触摸事件进行相应处理:不拦截Touchbool&BaseTower::onTouchBegan(Touch&*touch,&Event&*event)&&
&&&&return&&&
void&BaseTower::onTouchEnded(Touch*&touch,&Event*&event)&&
&&&&auto&target&=&static_cast(event->getCurrentTarget());&&
&&&&Point&locationInNode&=&target->convertTouchToNodeSpace(touch);&&
&&&&Size&size&=&target->getContentSize();&&
&&&&Rect&rect&=&Rect(0,&0,&size.width,&size.height);&&
&&&&if&(rect.containsPoint(locationInNode))//当触摸点在防御塔内(即点击防御塔,目前只能通过此方法来判断是否点击防御塔)&&
&&&&{&&&&&
&&&&&&static_cast(this->getParent()->getParent())->playerState->showTowerInfo(getTowerType());//调用父父布局(BaseMap)的PlayState层,显示防御塔信息&&
&&&&&&if(isUpdateMenuShown)//如果防御塔升级界面已经显示,则隐藏,某种显示&&
&&&&&&&&hideUpdateMenu();&&
&&&&&&}else{&&
&&&&&&&&showUpdateMenu();&&
&&&&}else{//触摸点在外面则隐藏防御塔升级界面&&
&&&&&&hideUpdateMenu();&&
}首先我们先观察下这个游戏的箭塔:这个游戏的箭塔都是拥有两个弓箭手。以初级塔为例,左右两边分别有两个弓箭手,可以攻击不同的目标,并且同时只有一个弓箭手在攻击。根据这个特性我们写一个BaseArrowTower:class&BaseArrowTower:&public&BaseTower&&
&&&&public:&&
&&&&protected:&&
&&&&Sprite*&shooter_1;//弓箭手1号&&
&&&&Sprite*&shooter_2;//弓箭手2号&&
&&&&Sprite*&towerB//塔&&
&&&&int&shootT//弓箭手标记&&
&&&&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()-shootV&&
&&&&&&&&float&angleRadians=atan(pVectr.y/pVectr.x);&&
&&&&&&&&float&angleDegrees&=&CC_RADIANS_TO_DEGREES(angleRadians);&&
&&&&&&&&&&
&&&&if(shootVector.x&-&currBullet->getPosition().xsetPosition(Point(0,30));//子弹设置在弓箭手所在位置&&&&
&&&&&&&&shooter_1->setFlippedX(true);//X轴翻转,即面向左边&&
&&&&&&&&if(shootVector.y&-&currBullet->getPosition().yrunAction(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().yrunAction(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().yrunAction(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().yrunAction(Animate::create(AnimationCache::getInstance()->getAnimation(temp1)));&&
&&&&&&&&&&&&}else{&&
&&&&&&&&&&&&&&&&shooter_2->runAction(Animate::create(AnimationCache::getInstance()->getAnimation(temp2)));&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&shootTag&=&1;&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&&&&&//贝叶斯弧线&&
&&&&&&&&ccBezierConfig&&&
&&&&&&&&if(shootTag&==&1)//播放射箭音效&&
&&&&&&&&&&&&SoundManager::playArrowShoot1();&&
&&&&&&&&else&&
&&&&&&&&&&&&SoundManager::playArrowShoot2();&&
&&&&&&&&//计算贝叶斯曲线的两个控制点&&
&&&&&&&&bezier.controlPoint_1&=&Point(currBullet->getPosition().x,currBullet->getPosition().y+200);&&&
&&&&&&&&bezier.controlPoint_2&=&Point(shootVector.x,shootVector.y+200);;&&&
&&&&&&&&bezier.endPosition&=&shootV&&
&&&&&&&&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,攻击动画完成。推荐阅读:
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量6196点击量4498点击量3643点击量3608点击量3282点击量2862点击量2792点击量2729点击量2643
&2016 Chukong Technologies,Inc.
京公网安备89总共 300 款应用
很多塔防游戏需要不断的升级防御塔来抵御敌人的入侵,可能看起来很简单,但实际游戏中对玩家的布阵要求比较高,如何能够再后面关卡获胜是玩家需要思考的问题,当然实际游戏中耐心也是非常重要的因素。
总共 31 款应用
炮战游戏也是很多军事迷玩家喜欢的类型,迫击炮游戏,加农炮游戏,高射炮游戏等,火炮作为一种高杀伤性的武器,在近代战争中发挥了巨大的威力,各国相继使用了大量的各种火炮武器。炮战类单机游戏多为而战题材和海盗
总共 12 款应用
塔防游戏即指一类通过在地图上建造炮塔或类似建筑物,以阻止游戏中敌人进攻的策略型游戏,而好玩的塔防游戏正是此类游戏中的精品。策略性与趣味性是好玩的塔防游戏最重要的是要素,此类游戏数目众多,在手机等多个平
游戏已经替换为中文版
炮塔防御 (自己设计敌方行走路线的塔防游戏)
下载周排行
下载总排行
◎ 我们收集了众多网友经常出现的问题,点击浏览:如果下载的时候提示 &Service Unavailable& ?请务必使用
下载本站游戏!
◎ 游戏1号群:336883(满),游戏2号群:,欢迎加入。
◎ 提供 炮塔防御
中文破解版,保证完全无毒病,请大家放心下载.
◎ 本站仅创建用户沟通交流的平台,所展示的游戏资源内容均来自于用户上传分享,版权问题均与我站无关。资源仅作为用户间分享讨论之用,如该游戏触犯了您的权利,请发送至邮箱:,我们第一时间给予删除。}

我要回帖

更多关于 可以自己摆路线的塔防 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信