有几天没和大家分享博客了,原因很简单,就是我在运行第12章所写的代码时:(开始一切正常,不过没多久就出现了内存泄露!。可能求成心切吧,当时没多加考虑就把代码发上去了。我在此对看过第12章得朋友表示歉意,真的很抱歉。(好比,大家原先的思维是对的,可能经我这么一搅和,却错了!)所以,因为上次的过失,我决定了,以后我一定对写过的代码多做测试,直到确定没错误了,才会发到CSDN上面去!再次向大家表示歉意!这几天来我一直在(为实现同一角色的不同动画的切换)而做了大量的尝试,基本上都解决了!(所以我也想和大家说句心里话:我们在面临陌生的事物时,最好是自己多去实践,而不是等着看别人的新发现!这样不利于自己灵感的爆发,你也许不相信灵感,不过我感觉它是在你多次的实验中产生的);

     (我们重新写一下12章得内容,有需要最新源码的朋友可以在评论里留言!这一章写完以后植物大战僵尸的第一关也将要接近尾声了。我在考虑第二关年前有没有时间写了。不说这烦心事了);

好了开始吧:第12章主要是要实现僵尸被子弹多次击中后,所要做的系列动画。这些动画在redcat.plist文件中:我截个图吧:(就是这个)

      我们打开我们工程里的RedCatJsSprite.h文件;在里面加入几句代码:(这是红帽子僵尸要做的系列动画)

cocos2d::CCFiniteTimeAction* _walkAction;
cocos2d::CCFiniteTimeAction* _headAction;//头动画
cocos2d::CCFiniteTimeAction* _noHeadAction;//无头动画; //无头动画函数
cocos2d::CCFiniteTimeAction* headAninmation();
//僵尸头动画
cocos2d::CCFiniteTimeAction* noHeadAninmation(); //僵尸的倒地动画:
cocos2d::CCFiniteTimeAction* downTheGround();
cocos2d::CCFiniteTimeAction* _downAction;

在RedCatJsSprite.cpp中定义这几个动画;(然后在碰撞检测中执行,这要到后面说。)

下面是红帽子僵尸的头动画,无头动画,和死亡动画的定义:(大家注意下,这都是连续性动作)

//僵尸的头动画;
CCFiniteTimeAction* RedCatJsSprite::headAninmation()
{
int i;
CCArray* headArray =CCArray::create();//创建一个数组用于存放僵尸的头帧;
headArray->retain();
for(i=1;i<13;i++)
{
CCSpriteFrame* headFrames = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(CCString::createWithFormat("jshead_%d.png",i)->getCString());
headArray->addObject(headFrames);
}
CCAnimation* headAnimation=CCAnimation::createWithSpriteFrames(headArray,0.07f); this->_headAction =CCAnimate::create(headAnimation);
this->_headAction->retain(); return this->_headAction; } CCFiniteTimeAction* RedCatJsSprite::noHeadAninmation()
{ //僵尸的无头动画
int i;
CCArray* noHeadArray =CCArray::create();//创建一个数组用于存放僵尸的无头帧;
noHeadArray->retain();
for(i=1;i<19;i++)
{
CCSpriteFrame* noHeadFrames = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(CCString::createWithFormat("losthead_%d.png",i)->getCString());
noHeadArray->addObject(noHeadFrames);
}
CCAnimation* noHeadAnimation=CCAnimation::createWithSpriteFrames(noHeadArray,0.2f);
this->_noHeadAction =CCRepeat::create(CCAnimate::create(noHeadAnimation),50);
this->_noHeadAction->retain(); return this->_noHeadAction;
} cocos2d::CCFiniteTimeAction* RedCatJsSprite::downTheGround()
{
int i;
CCArray* downArray =CCArray::create();//创建一个数组用于存放僵尸的倒地帧;
downArray->retain();
for(i=1;i<11;i++)
{
CCSpriteFrame* downFrames = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(CCString::createWithFormat("redcatjsdie_%d.png",i)->getCString());
downArray->addObject(downFrames);
}
CCAnimation* downAnimation=CCAnimation::createWithSpriteFrames(downArray,0.1f);
this->_downAction =CCAnimate::create(downAnimation);
this->_downAction->retain(); return this->_downAction;
}

然后我们在红帽子僵尸的碰撞检测层实现他们,碰撞检测层在12章我们已经做过声明,这里就不再从新声明了;(我重新写了12章得void  bulletBoundingJs();函数);它的内部是这样子的:(我来解释下:僵尸的生命值我们前面已经说了是60,每次子弹攻击减少3,当生命值等于9时我们让僵尸做无头动画:看下效果:)

就是这里:

if(sprite2->_hp==9){sprite2->stopAllActions();//终止之前的所有动作;
sprite2->runAction(CCSequence::create(((GameLayer*)this->getParent())->_jsLayer->_redCatSprite->headAninmation(),CCSpawn::create(((GameLayer*)this->getParent())->_jsLayer->_redCatSprite->noHeadAninmation(),((GameLayer*)this->getParent())->_jsLayer->noHeadJsMoveWay(),NULL),NULL));
}

这个过程子弹与无头僵尸继续碰撞,当僵尸的生命值为零时:我们让僵尸倒地,随后消失:

if(sprite2->_hp==0) 
{ sprite2->stopAllActions(); sprite2->runAction(CCSequence::create(((GameLayer*)this->getParent())->_jsLayer->_redCatSprite->downTheGround(),CCCallFuncN::create(((GameLayer*)this->getParent())->_jsLayer,callfuncN_selector(JsLayer::preRemoveRedCat)),NULL));
 }

      

void BoundingLayer::bulletBoundingJs()
{
CCObject* object1;//创建遍历数组的两个对象
CCObject* object2; CCArray* removeBulletArray= CCArray::create();//创建待删除的子弹的临时数组
removeBulletArray->retain();//保存临时数组 CCArray* removeJsArray =CCArray::create();//创建待删除僵尸的临时数组
removeJsArray->retain();
CCARRAY_FOREACH(((GameLayer*)this->getParent())->_touchLayer->_bulletArray,object1)//遍历所有子弹
{
BulletSprite* sprite1= (BulletSprite*)object1;
CCARRAY_FOREACH(((GameLayer*)this->getParent())->_jsLayer->_jsArray,object2)//遍历所有僵尸
{
RedCatJsSprite* sprite2 =(RedCatJsSprite*)object2;
if(sprite1->boundingBox().intersectsRect(sprite2->ReRedCatBounding()) )//碰撞检测机理
{ removeBulletArray->addObject(sprite1);
removeJsArray->addObject(sprite2);
}
}
}
CCARRAY_FOREACH(removeBulletArray,object1)//遍历待删除子弹数组
{ BulletSprite* sprite1 = (BulletSprite*)object1;
sprite1->runAction(CCCallFuncN::create(((GameLayer*)this->getParent())->_bulletLayer,callfuncN_selector(BulletLayer::removeBullet)));
CCARRAY_FOREACH(removeJsArray,object2)//遍历待删除僵尸数组
{ RedCatJsSprite* sprite2 =(RedCatJsSprite*)object2;
sprite2->_hp =sprite2->_hp-3;
sprite2->runAction(CCBlink::create(0.1,1));//僵尸闪烁 if(sprite2->_hp==9)
{
sprite2->stopAllActions();//终止之前的所有动作;
sprite2->runAction(CCSequence::create(((GameLayer*)this->getParent())->_jsLayer->_redCatSprite->headAninmation(),CCSpawn::create(((GameLayer*)this->getParent())->_jsLayer->_redCatSprite->noHeadAninmation(),((GameLayer*)this->getParent())->_jsLayer->noHeadJsMoveWay(),NULL),NULL));
} if(sprite2->_hp==0)
{
sprite2->stopAllActions();
sprite2->runAction(CCSequence::create(((GameLayer*)this->getParent())->_jsLayer->_redCatSprite->downTheGround(),CCCallFuncN::create(((GameLayer*)this->getParent())->_jsLayer,callfuncN_selector(JsLayer::preRemoveRedCat)),NULL)); }
}
} removeBulletArray->release();//释放临时数组
removeJsArray->release();//释放临时数组
} 释放临时数组;这里面包含了同一精灵,不同动画间的切换,这个切换要看起来自然和动画不重叠也是需要好好琢磨的。如果下次要是还讲的话,那就讲第二关了。(我还有点内容没讲完,索性今晚都讲了!下章....)

[置顶] cocos2d-x 植物大战僵尸(13)类似酷跑的【同一角色不同动画间的切换的实现】的更多相关文章

  1. cocos2d 简单的日常高仿酷跑游戏

    1.第一个直接看看这个游戏看起来视频(GIF我们不能满足游戏展) 跑酷游戏最纠结的是地图.碰撞倒是简单,能够自己写或者使用box2d等物理引擎.跑酷游戏地图的特点就是随机性.可是随机中又有策划特意安排 ...

  2. [置顶] 创建GitHub技术博客全攻略

    [置顶] 创建GitHub技术博客全攻略 分类: GitHub2014-07-12 13:10 19710人阅读 评论(21) 收藏 举报 githubio技术博客网站生成 说明: 首先,你需要注册一 ...

  3. [置顶] Android开发笔记(成长轨迹)

    分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...

  4. js之滚动置顶效果

    0.js获取高度 ? 1 2 3 4 5 6 document.all   // 只有ie认识   document.body.clientHeight              // 文档的高,屏幕 ...

  5. sd_cms置顶新闻,背景颜色突击显示

    维护之前的一个客户网站,使用的是sd_cms系统,因为好久没有维护了,看到这网站的时候,真不敢相信,自己也曾做出过这样的网站. 客户要求置顶新闻始终在最上面,有背景颜色突击显示. 找到对应的代码,修改 ...

  6. QQ好友列表向左滑动出现置顶、删除--第三方开源--SwipeMenuListView

    SwipeMenuListView是在github上的第三方开源项目,该项目在github上的链接地址是:https://github.com/baoyongzhang/SwipeMenuListVi ...

  7. [置顶]VC2013的一个bug

    [置顶]VC2013的一个bug 前段时间在尝试使用一个C++的GUI库nana.这个库最大的特点在于使用现代C++风格去编写GUI程序,而不需要使用大量的比较丑陋的代码(如MFC中的各种宏),或者其 ...

  8. [置顶] Web用户的身份验证及WebApi权限验证流程的设计和实现 (不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!!)

     转发 http://blog.csdn.net/besley/article/details/8516894 不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!! [ ...

  9. [置顶] SQL Server 2005 双机热备的实现

    [置顶] SQL Server 2005 双机热备的实现 分类: SQLSERVER2011-08-24 21:25 901人阅读 评论(0) 收藏 举报 sql servermicrosoftsql ...

随机推荐

  1. android 中获取网络状态、判断3G、2G、wifi网络、判断wifi是否打开、获取本机地址、获取本机串号IMEI整理

    代码如下:package com.android.xym; import java.io.IOException; import java.net.HttpURLConnection; import ...

  2. sqlite 查询数据 不用回调

    int main( void ){    sqlite3 *db=NULL;    char *zErrMsg = 0;    int rc;    //打开数据库连接    rc = sqlite3 ...

  3. MFC解决Static控件背景透明时文本覆盖重影

    通过映射OnCtlColor消息,而后在该函数中使用pDC->SetBkMode(TRANSPARENT)使Static控件背景透明时会出现:文本覆盖重影的问题,当改变控件的文本就会发生新文本与 ...

  4. 普通IT和文艺IT工程师的区别

    在一个UITableView的editing设置的方法实现过程中,我想到两种写法,顺便想了一下两种方法的区别.觉得这时一个普通IT工程师和NB工程师的区别一个有趣的印记. 您通常时怎么去实现的呢? - ...

  5. Android布局_LinearLayout布局

    一.LinearLayout 布局,类似于一个盒子 1. 主要属性有: (1)android:orientation 设置LinearLayout容器布局组件的方式:要么按行要么按列.只能取值:hor ...

  6. linux线程间同步方式汇总

    抽空做了下linux所有线程间同步方式的汇总(原生的),包含以下几个: 1, mutex 2, condition variable 3, reader-writer lock 4, spin loc ...

  7. HDU1171:Big Event in HDU(多重背包分析)

    通过分析,要使A>=B并且差值最小.所以只要使sum/2的容量下,B最大就Ok了 #include<iostream> #include<cstdio> #include ...

  8. Javaweb统计在线人数的小栗子

    最近在学习Javaweb相关的内容(不黑不吹之前对web开发零基础),下面通过一个统计在线人数的小栗子讲讲Servlet监听器吧 开发环境 eclipse  tomcat 7 先说说这个小栗子的构思: ...

  9. php知识(第2天)

    运算符 PHP中运算符一共分为9类: 赋值运算符, 算术运算符,比较运算符, 逻辑运算符, 错误抑制符, 三目运算符, 位运算符, 自操作运算符, 连接操作符 算术运算符 算术运算: 基本运算符: + ...

  10. python的filter()函数

    filter()函数是 Python 内置的另一个有用的高阶函数. filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,fil ...