Enemy类没什么内容,就create和init方法,根据参数来创建不同的敌机,头文件代码如下:

 //飞机的类型
enum planeType {smallPlane, midPlane, bigPlane}; class Enemy : public CCSprite
{ public: void loseLife(); CC_SYNTHESIZE(float, m_speed, Speed);
CC_SYNTHESIZE(int, m_life, Life);
CC_SYNTHESIZE(int, m_score, Score);
CC_SYNTHESIZE(planeType, m_type, Type); ~Enemy();
virtual bool init(planeType type, CCTexture2D* texture);
static Enemy* create(planeType type, CCTexture2D* texture); };

create和init方法实现如下:

Enemy* Enemy::create(planeType type, CCTexture2D* texture)
{
Enemy *pRet = new Enemy();
if (pRet && pRet->init(type, texture))
{
pRet->autorelease();
return pRet;
}
else
{
delete pRet;
pRet = NULL;
return NULL;
}
} bool Enemy::init(planeType type, CCTexture2D* texture)
{
bool bRet = false;
do
{
const char* fileName;
float score = ;
int life = ;
float speed = ; int random_speed = rand() % + ; switch (type)
{
case bigPlane:
fileName = "enemy3_n1.png";
life = ;
score = ;
break; case midPlane:
fileName = "enemy2.png";
life = ;
score = ;
break; case smallPlane:
fileName = "enemy1.png";
life = ;
score = ;
break; default:
break;
}
;
CC_BREAK_IF(!CCSprite::initWithSpriteFrameName(fileName)); this->m_score = score;
this->m_life = life;
this->m_speed = *random_speed;
this->m_type = type;
bRet = true; } while (); return bRet;
}

EnemyLayer类则负责敌机除了创建之外的所有工作,包括开始启动创建方法、停止创建、移除敌机、敌机爆炸等。头文件:

 class EnemyLayer : public cocos2d::CCLayer
{ protected: CCSize designResolutionSize;
CCSpriteBatchNode* batchNode; public: CCArray *m_enemys; EnemyLayer(void);
~EnemyLayer(void);
virtual bool init(); void startTakeEnemys(float dt);
void stopTakeEnemy(void); void EnemyMoveToFinish(CCNode* pSender);
void removeEnemy(CCNode* pTarget, void* enemy);
void removeAllEnmeys(); void addEnemy(float dt); void bomb(CCNode* pSender); CREATE_FUNC(EnemyLayer);
};

敌机的创建和子弹不同,还记得子弹的创建我是保证屏幕上只有一粒子弹的吧,敌机则不然,固定每隔多少时间就会创建

 void EnemyLayer::startTakeEnemys(float dt)
{ float delay = 1.0f;//多少秒后调用
float interval = 0.3f;//调用时间间隔
this->schedule(schedule_selector(EnemyLayer::addEnemy), interval, kCCRepeatForever, delay);
}

addEnemy和bomb方法实现:

 void EnemyLayer::addEnemy(float dt)
{
if (true)
{
int seed = ;
int random_planeType = rand() % seed + ;//1~19
planeType type; Enemy* enemy = NULL; //按概率随机生成大中小三种敌机,或者不产生
//big
if (random_planeType % == )
{
type = bigPlane;
SimpleAudioEngine::sharedEngine()->playEffect("music/big_spaceship_flying.wav",false);
}
//mid
else if(random_planeType % == )
{
type = midPlane;
}
//small
else if(random_planeType % == )
{
type = smallPlane;
}
// no
else
{
return;
} enemy = Enemy::create(type, this->batchNode->getTexture()); //初始位置(随机)
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
float x = rand() % (int)(winSize.width - (int)enemy->boundingBox().size.width * ) + enemy->boundingBox().size.width;
float y = winSize.height - enemy->boundingBox().size.height/; CCPoint position = ccp(x,y); enemy->setPosition(position);
this->m_enemys->addObject(enemy);
batchNode->addChild(enemy); //敌机的运动轨迹CCDirector::sharedDirector()->getWinSize()
float length = enemy->getContentSize().height + designResolutionSize.height;//飞行距离,超出屏幕即结束
float velocity = /;//飞行速度:420pixel/sec
float realMoveDuration = length/enemy->getSpeed();//飞行时间 CCFiniteTimeAction* actionMove = CCMoveTo::create(realMoveDuration,ccp(x, -enemy->getContentSize().height));
CCFiniteTimeAction* actionDone = CCCallFuncN::create(this,callfuncN_selector(EnemyLayer::EnemyMoveToFinish));//回调一个敌机结束处理函数 CCSequence* sequence = CCSequence::create(actionMove,actionDone,NULL); enemy->runAction(sequence); } } void EnemyLayer::bomb(CCNode* pSender)
{ CCAnimation *animationBomb = NULL;
Enemy *enemy = (Enemy*) pSender;
char bombMusciName[]; if (enemy->getType() == bigPlane)
{
sprintf(bombMusciName, "music/enemy3_down.wav");
animationBomb = CCAnimationCache::sharedAnimationCache()->animationByName("animation_Enemy3Bomb");
}
else if(enemy->getType() == midPlane)
{
sprintf(bombMusciName, "music/enemy2_down.wav");
animationBomb = CCAnimationCache::sharedAnimationCache()->animationByName("animation_Enemy2Bomb");
}
else if(enemy->getType() == smallPlane)
{
sprintf(bombMusciName, "music/enemy1_down.wav");
animationBomb = CCAnimationCache::sharedAnimationCache()->animationByName("animation_Enemy1Bomb");
} SimpleAudioEngine::sharedEngine()->playEffect(bombMusciName, false);//开始播放背景音效,false表示不循环 CCActionInterval *action = CCScaleTo::create(0.5f, pSender->getScale() + 0.05f);
CCCallFuncND *funcND = CCCallFuncND::create(this,callfuncND_selector(EnemyLayer::removeEnemy),(void*)pSender);
CCFiniteTimeAction* seq = CCSequence::create(CCAnimate::create(animationBomb), funcND, NULL); pSender->stopAllActions();
pSender->runAction(seq); }

可以看得出,这两个方法其实放到Enemy类里也很正常完全没问题的,这个要看coder想怎么写了。另外,敌机飞出屏幕外时的删除和被子弹打中时爆炸的回收是不同,差一个爆炸效果,而子弹在这两种情况的处理是一样的。

cocos2dx打飞机项目笔记四:Enemy类和EnemyLayer类的更多相关文章

  1. cocos2dx打飞机项目笔记一:项目结构介绍

    最近在学习cocos2dx引擎,版本是2.1.3,开发环境是win7 + vs2010,模仿微信打飞机游戏,开发中参考了 csdn 偶尔e网事 的系列文章:http://blog.csdn.net/c ...

  2. cocos2dx打飞机项目笔记三:HeroLayer类和坐标系

    HeroLayer类主要是处理hero的一些相关东西,以及调用bulletLayer的一些方法,因为子弹是附属于hero的~~ HeroLayer 类的成员如下: class HeroLayer : ...

  3. cocos2dx打飞机项目笔记六:GameScene类和碰撞检测 boundingbox

    GameScene类虽然是占用游戏最多时间的类,但是里面的东西不是很多,最重要的就是碰撞检测了,碰撞检测代码如下: void GameScene::detectionCrash() { CCArray ...

  4. cocos2dx打飞机项目笔记二:BulletLayer类

    BulletLayer.h 内容如下 class BulletLayer : public cocos2d::CCLayer { public: CC_SYNTHESIZE(bool, m_IsHer ...

  5. cocos2dx打飞机项目笔记七:各种回调:定时器schedule、普通回调callFunc、菜单回调menu_selector、事件回调event_selector

    各种回调函数的定义: typedef void (CCObject::*SEL_SCHEDULE)(float); typedef void (CCObject::*SEL_CallFunc)(); ...

  6. cocos2dx打飞机项目笔记五:CCSpriteBatchNode 的使用

    在上一节里,在头文件看到 定义了一个 CCSpriteBatchNode* batchNode;,在addEnemy方法里看到 batchNode->addChild(enemy); 新建的敌机 ...

  7. ASP.Net MVC OA项目笔记<四>

    1.1.1 EF线程唯一 在数据层中用到了EF的实例,在数据会话层也用到了,所以在一个请求中只能创建一个EF实例(线程内唯一对象),把它封装成工厂类 1.1.2 为了防止相互引用,循环引用,所以这个工 ...

  8. Cocos2d-x 3.2 学习笔记(四)学习打包Android平台APK!

    从cocos2dx 3.2项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后,以后就会非常快捷! (涉及到3.1.1版本的,请自动对应3.2版本,3.x版本的环境搭建都是一样的) ...

  9. cocos2d-x打飞机实例总结(一):程序入口分析和AppDelegate,Application,ApplicationProtocol三个类的分析

    首先,是个敲代码的,基本上都知道程序的入口是main函数,显然,就算在cocos2d-x框架中也一样 我们看看main函数做了什么 #include "main.h" #inclu ...

随机推荐

  1. Android APK反编译就这么简单 具体解释

    在学习Android开发的过程你.你往往会去借鉴别人的应用是怎么开发的,那些美丽的动画和精致的布局可能会让你爱不释手,作为一个开发人员.你可能会非常想知道这些效果界面是怎么去实现的,这时,你便能够对改 ...

  2. asp.net *.ashx类型的文件使用说明

    你想创建一个ASP.NET文件,它不是aspx文件,它能动态的返回一个图片.XML文件或其他非HTML文件. 解决方案:使用ashx文件. 1. 使用ASHX handlers 首先,我们要回顾要使用 ...

  3. python3基础知识学习记录

    学习地址:http://www.runoob.com/python3/python3-tutorial.html ------------------------------ 为什么要学python: ...

  4. Linux学习目录

    一.CentOS for Linux 大神博客:骏马金龙  Linux也可以参考,这篇博客进行学习 http://www.cnblogs.com/f-ck-need-u/p/7048359.html ...

  5. Scala之模式匹配(Patterns Matching)

    前言 首先.我们要在一開始强调一件非常重要的事:Scala的模式匹配发生在但绝不仅限于发生在match case语句块中.这是Scala模式匹配之所以重要且实用的一个关键因素!我们会在文章的后半部分具 ...

  6. TP系统常量信息

    [系统常量信息] 获取系统常量信息: 如果加参数true,会分组显示: 显示如下: [跨控制器调用] 一个控制器在执行的时候,可以实例化另外一个控制,并通过对象访问其指定方法. 跨控制器调用可以节省我 ...

  7. codevs2894、2837、1669、2503、3231

    6.25动态规划之背包回顾 2894 Txx考试  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description Txx是一个 ...

  8. 《从零开始学Swift》学习笔记(Day 37)——默认构造函数

    原创文章,欢迎转载.转载请注明:关东升的博客 结构体和类的实例在构造过程中会调用一种特殊的init方法,称为构造函数.构造函数没有返回值,可以重载.在多个构造函数重载的情况下,运行环境可以根据它的外部 ...

  9. python基础里的那些为什么?

    一.执行python脚本的两种方式? 直接在解释器里编写并在解释器里执行 文件编写,并在终端通过 python 路径  这种方式执行 好,我们就以输出hello world这个例子来比较两种方式的不同 ...

  10. Unity使用native读取streamingasset里文件

    需求是,使用native方式,读取apk包里的lua代码,读进c#,做解密 一准备unity工程 public class GameMain : MonoBehaviour { public cons ...