原创作品,转载请标明http://blog.csdn.net/jackystudio/article/details/11890969

发现CSDN上传的gif图不能动。。。有招没?

飞机可以控制飞行,并且发射子弹,那没有敌机怎么行?

敌机共有3种类型,分别为Enemy1,Enemy2和Enemy3,按大小排列,从程序角度看来,它们的本质都是一样的。因此可以从同一个实体中继承出来,不同点在于:

A.图像不一样

B.生命值不一样

C.移动速度和出现频率不一样

D.第三种敌机也就是最大的敌机,在飞行的过程中带有动画效果。

这里以最小的敌机(Enemy1)为例。

1.有生命的敌机

自定义的敌机类是少不了的,但是要从CCNode继承还是CCSprite继承,那就要看实际需要了,从CCNode继承灵活度会高一点,但是也麻烦一点,从CCSprite继承就会相对简单一点,但是灵活度就低了。建议还是从CCNode继承,这里选择从CCNode继承。Enemy相当于一个容器,可以绑定一个精灵。

#include "Enemy.h"
Enemy::Enemy(void)
{m_sprite=NULL;//m_sprite是CCSprite指针,用来绑定敌机m_life=0;//生命值
}Enemy::~Enemy(void)
{
}Enemy* Enemy::create()
{Enemy* pRet=new Enemy;pRet->autorelease();return pRet;
}void Enemy::bindSprite(CCSprite* sprite,int life)//绑定敌机,并传入生命值
{m_sprite=sprite;m_life=life;this->addChild(m_sprite);
}CCSprite* Enemy::getSprite()
{return m_sprite;
}int Enemy::getLife()//获取生命
{return m_life;
}void Enemy::loseLife()//生命值-1
{m_life--;
}CCRect Enemy::getBoundingBox()//获取敌机大小
{CCRect rect=m_sprite->boundingBox();CCPoint pos=this->convertToWorldSpace(rect.origin);CCRect enemyRect(pos.x,pos.y,rect.size.width,rect.size.height);return enemyRect;
}

2.敌机的随机初始位置和速度

在EnemyLayer中添加3种敌机,敌机出现的位置和飞行速度是随机值,从我们设定的范围中得出,敌机的回收机制同子弹层的处理是一样的,采用CCArray管理,这里不再赘诉。

void EnemyLayer::addEnemy1(float dt)
{//调用绑定敌机1Enemy* enemy1=Enemy::create();enemy1->bindSprite(CCSprite::create(enemy1SpriteFrame),ENEMY1_MAXLIFE);//随机初始位置CCSize enemy1Size=enemy1->getSprite()->getContentSize();CCSize winSize=CCDirector::sharedDirector()->getWinSize();int minX=enemy1Size.width/2;int maxX=winSize.width-enemy1Size.width/2;int rangeX=maxX-minX;int actualX=(rand()%rangeX)+minX;enemy1->setPosition(ccp(actualX,winSize.height+enemy1Size.height/2));this->addChild(enemy1);this->m_pAllEnemy1->addObject(enemy1);//随机飞行速度float minDuration,maxDuration;//根据游戏难度给minDuration,maxDuration赋值int rangeDuration=maxDuration-minDuration;int actualDuration=(rand()%rangeDuration)+minDuration;CCFiniteTimeAction* actionMove=CCMoveTo::create(actualDuration,ccp(actualX,0-enemy1->getSprite()->getContentSize().height/2));CCFiniteTimeAction* actionDone=CCCallFuncN::create(this,callfuncN_selector(EnemyLayer::enemy1MoveFinished));CCSequence* sequence=CCSequence::create(actionMove,actionDone);enemy1->runAction(sequence);
}

3.敌机爆炸

敌机在与子弹碰撞后,会产生爆炸效果,也就是一串帧动画,动画结束后,敌机消失,同时进行回收处理。这里的animate如果能加入动画缓冲池,效率会更高。

//敌机爆炸
void EnemyLayer::enemy1Blowup(Enemy* enemy1)
{CCAnimation* animation=CCAnimationCache::sharedAnimationCache()->animationByName("Enemy1Blowup");//动画事先加入动画池CCAnimate* animate=CCAnimate::create(animation);CCCallFuncND* removeEnemy1=CCCallFuncND::create(this,callfuncND_selector(EnemyLayer::removeEnemy1),(void*)enemy1);CCSequence* sequence=CCSequence::create(animate,removeEnemy1);enemy1->getSprite()->runAction(sequence);//运行爆炸动画并回收
}

4.EnemyLayer敌机层的其他接口

//移除单架敌机1
void EnemyLayer::removeEnemy1(CCNode* pTarget, void* data)
{Enemy* enemy1=(Enemy*)data;if (enemy1!=NULL){m_pAllEnemy1->removeObject(enemy1);this->removeChild(enemy1,true);}
}//移除所有敌机,干嘛用?还记得有个ufo炸弹全屏秒么。。。
void EnemyLayer::removeAllEnemy1()
{CCObject* obj;CCARRAY_FOREACH(m_pAllEnemy1,obj){Enemy* enemy1=(Enemy*)obj;if (enemy1->getLife()>0){enemy1Blowup(enemy1);}}
}
void EnemyLayer::removeAllEnemy()
{removeAllEnemy1();removeAllEnemy2();removeAllEnemy3();
}

5.超大型敌机的飞行动画

这里简单采用帧动画,单独执行,也可以使用CCSpawn类来实现同时动画效果

enemy3SpriteFrame_1=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("enemy3_n1.png");
enemy3SpriteFrame_2=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("enemy3_n2.png");
CCAnimation* animation=CCAnimation::create();//创建帧动画
animation->setDelayPerUnit(0.2f);
animation->addSpriteFrame(enemy3SpriteFrame_1);
animation->addSpriteFrame(enemy3SpriteFrame_2);
CCAnimate* animate=CCAnimate::create(animation);
enemy3->getSprite()->runAction(CCRepeatForever::create(animate));//采用CCRepeaterForever不断重复动画

好了,把EnemyLayer也添加进GameLayer,运行一下,敌机满天飞了,控制你的手指头移动主角飞机进行射击,我了个去,死不了是闹哪样。。。。

这不废话!最最重要的碰撞检测还没加入呢!

效果图


【cocos2d-x入门实战】微信飞机大战之八:自定义敌机精灵相关推荐

  1. 【三】仿微信飞机大战cocos2d-x3.0rc1

    上一篇:[二]仿微信飞机大战cocos2d-x3.0rc1 今天的任务是: 1.我机子弹无限量发射 2.三种类型敌机的出现 3.敌机自己碰墙死掉 一.效果界面展示 暂时没有实现子弹打中敌机 二.工程解 ...

  2. Unity游戏开发官方入门教程:飞机大战(六)——创建子弹

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  3. Unity游戏开发官方入门教程:飞机大战(二)——创建飞船对象

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  4. cocos2d-x-3.3-022-仿微信飞机大战-开篇介绍

    原文同步发布于我的wiki,查看原文或更新请移步: 点击打开链接 写在最前面 微信飞机大战,触控的大神JackyStudio 已经在他的专栏微信飞机大战讲解中完整细致的实现了一遍,基于cocos2d- ...

  5. Unity游戏开发官方入门教程:飞机大战(五)——实现飞船控制脚本

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  6. 【C语言游戏】微信飞机大战 | PlaneFight(EasyX,drawAlpha绘制透明贴图,计时器,计帧器,游戏难度自动调整,接受鼠标消息,源码素材免费分享)

    一.数据结构介绍 struct aircraft //所有飞机的结构体 typedef struct aircraft{ int type;//飞机类型 int HP;//剩余血量 int bomb_ ...

  7. Unity游戏开发官方入门教程:飞机大战(十)——敌人的爆炸和移动

    Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...

  8. 【cocos2d-x入门实战】微信飞机大战之一:搞个飞机来玩玩

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/11650413 学习了一个阶段的cocos2d-x,发现用起来还是蛮顺手的.然 ...

  9. 【cocos2d-x入门实战】微信飞机大战之十:UFO层特殊道具

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/11961795 游戏的趣味性就在于不时的给你一些惊喜.当然如果只是简单的子弹打 ...

最新文章

  1. ESXi6.5环境搭建(二:ESXi 6.5环境的安装及配置)
  2. MATLAB_8-边缘检测_demo.m[课堂齿轮作业]其他的在文章末尾
  3. 注意 ExecuteNonQuery() 返回值
  4. 无旋treap的简单思想以及模板
  5. 012_union操作符
  6. AD20学习笔记5---PCB设计规则设置及PCB手工布线
  7. 论文浅尝 | 融合多层次领域知识的分子图对比学习
  8. mysql数据库中excel数据的导入与导出
  9. redis并发锁 thinkphp5_资深架构师经典总结:Redis分布式锁实现理解
  10. C++ const修饰指针变量的位置不同代表的意义
  11. ActiveMQ实现负载均衡+高可用部署方案 -转载
  12. 视觉SLAM十四讲学习记录 第三讲
  13. 基于智能电网的电力线载波通信研究
  14. Ember 从0到1
  15. NVIDIA-SMI
  16. 联想服务器装系统鼠标没反应,联想Thinkpad笔记本重装系统后键盘鼠标失灵如何解决...
  17. 【个人亲历】上海市人才引进落户最详细的流程记录说明
  18. 【Pygamre实战】2023人气超高的模拟经营类游戏:梦想小镇代码版火爆全场,免费体验分享下载哦~
  19. 网站推荐-极简壁纸网站
  20. Bluetooth Baseband介绍

热门文章

  1. 文件管理(文件系统)
  2. HDU 6095 Rikka with Competition
  3. 如何将Jenkins基础环境迁移到Docker?
  4. 邮件服务-postfix
  5. zoc7中文乱码问题解决方法
  6. 宏定义有无参数宏定义和带参数宏定义两种
  7. switchport port-security aging
  8. ping某个域名的详细过程
  9. matlab烟花动图程序,用PS制作漂亮烟花绽放效果的GIF图片
  10. Pthon画皮卡丘源码