转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11757175

昨天收到了电子工业出版社寄过来的《cocos2d-x游戏开发之旅》这本书了,书还是不错的,那天rp爆发在微博上抽到的奖品。

感觉自己这个系列写的好像有点慢,但是想说尽可能把每一个点介绍到,所以,嫌啰嗦的请见谅咯。。。

我在这个游戏中对精灵和层的处理方式是一个层中只放一种精灵,把精灵的接口提供出去,然后通过层的叠加来实现整个游戏。

1.飞机登场了

飞机是Hero,所以它应该是一个单例类,cocos2d-x中有很多单例类,成员函数中有sharedxxxx的基本上就是。比如导演类,几个cache类等待。但是我这里偷个懒,并没有把它处理成单例类,因为整个游戏结构比较简单,但是在大的项目中就不能这么处理了。

和导演类的shareDirector一样,我们在PlaneLayer中也添加PlaneLayer的一个静态指针sharedPlane。但是和导演类不一样的是,我们需要在创建PlaneLayer后才能使用这个sharedPlane,而且在PlaneLayer销毁后就不能使用它,这里需要我们自己控制好整个流程。

//PlaneLayer.h
class PlaneLayer :
public CCLayer
{
public: PlaneLayer(void); ~PlaneLayer(void); static PlaneLayer* create();//实现create函数 virtual bool init(); public: static PlaneLayer* sharedPlane;//提供sharedPlane全局指针
}; //PlaneLayer.cpp
PlaneLayer* PlaneLayer::sharedPlane=NULL;//静态变量要在cpp外初始化
PlaneLayer* PlaneLayer::create()
{
PlaneLayer *pRet = new PlaneLayer();
if (pRet && pRet->init())
{
pRet->autorelease();
sharedPlane=pRet;//获得静态指针sharedPlane的值
return pRet;
}
else
{
CC_SAFE_DELETE(pRet);
return NULL;
}
}

和示例不一样,这里的create我们要自己实现,而不是简单的使用LAYER_CREATE_FUNC宏了。

而这个层的使用,只需要在上一篇中的GameLayer.cpp的init函数里调用就可以了。

//加入planeLayer
this->planeLayer=PlaneLayer::create();
this->addChild(planeLayer);

2.添加动画效果

细心的玩家会发现,飞机在飞行过程中机尾是在喷火的,其实这就是帧动画。

这里篇幅有限,就简单介绍下帧动画和这里用到的其他动画效果。

帧动画的使用步骤:

(1)create,创建CCAnimation类实例。

(2)setDelayPerUnit,设置帧间间隔时间。

(3)addSpriteFrame,添加帧图片。

(4)create,创建CCAnimate类实例,传入(1)的CCAnimation实例,注意CCAnimation是动画过程是名词,CCAnimate才是动画动作。

(5)精灵调用runAction即可使用。

(6)注意CCAnimationCache这也是一个动画类全局缓冲池。如果大量重复动画可以放里面使用,加快游戏速度。

bool PlaneLayer::init()
{
bool bRet=false;
do
{
CC_BREAK_IF(!CCLayer::init()); CCSize winSize=CCDirector::sharedDirector()->getWinSize(); CCSprite* plane=CCSprite::create(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("hero1.png"));
plane->setPosition(ccp(winSize.width/2,plane->getContentSize().height/2));
this->addChild(plane,0,AIRPLANE);//添加精灵,AIRPLANE是tag CCBlink *blink=CCBlink::create(1,3);//闪烁动画 CCAnimation* animation=CCAnimation::create();
animation->setDelayPerUnit(0.1f);
animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("hero1.png"));
animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("hero2.png"));
CCAnimate* animate=CCAnimate::create(animation);//帧动画 CCSequence* sequence=CCSequence::create(blink,CCRepeatForever::create(animate));//重复帧动画和连续动画
plane->runAction(sequence); bRet=true;
} while (0); return bRet;
}

那这些CCBlink,CCRepeaterForever和CCSequence又是什么?

这就是cocos2d-x提供的一些动画效果,其实用起来都很简单,无非是设置duration持续时长,repeat重复次数,和一些位移的坐标点,角度等等,就可以直接运行。可以在cocos2d-x的test示例中找到。

现在飞机出现了,在一开始闪烁3次以后,结合上篇的背景滚动,飞机就会喷气往前飞了。。。吼吼。。。

[置顶] 【cocos2d-x入门实战】微信飞机大战之四:飞机登场咯的更多相关文章

  1. [置顶] 【cocos2d-x入门实战】微信飞机大战之六:子弹层的处理

    这一篇将会处理完子弹层的其他要点. 1.子弹的初始位置 子弹的初始位置在飞机的机头位置,因为飞机在游戏的过程中会随着玩家的触摸而改变其位置,所以,子弹的初始位置只能以当前飞机位置为基准进行添加. CC ...

  2. [置顶] 【cocos2d-x入门实战】微信飞机大战之三:飞机要起飞了

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11730601 不过明眼人一看就知道起飞的不是飞机,是背景,相对运动引起的错觉. 1 ...

  3. [置顶] 【cocos2d-x入门实战】微信飞机大战之二:别急,先处理好CCScene和CCLayer的关系

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/11713197 在整个游戏开始之前,我们先看一下HelloWorld示例中CCSce ...

  4. [置顶] 【cocos2d-x入门实战】微信飞机大战之十三:游戏场景过渡

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12082043 游戏是实现了,但是如果有个欢迎界面和一个结束界面就更好了. 欢 ...

  5. [置顶] 【cocos2d-x入门实战】微信飞机大战之十二:分数的本地存储

    转载请表明地址:http://blog.csdn.net/jackystudio/article/details/12036237 作为一个单机游戏,连分数存储的的功能都没有,让它怎么在单机游戏圈里混 ...

  6. [置顶] IOS 基础入门教程

    IOS 基础入门教程 教程列表: IOS 简介 IOS环境搭建 Objective C 基础知识 创建第一款iPhone应用程序 IOS操作(action)和输出口(Outlet) iOS - 委托( ...

  7. [置顶] 【Git入门之十五】Github操作指南

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12374633 最终篇,介绍一下Github网站的使用,主要是翻译为主,简化了 ...

  8. [置顶] Hibernate从入门到精通(五)一对一单向关联映射

    上次的博文中Hibernate从入门到精通(四)基本映射我们已经讲解了一下基本映射和相关概念,接下来我们会讲稍微复杂点的映射——关系映射. 关系映射分类 关系映射即在基本映射的基础上处理多个相关对象和 ...

  9. [置顶] Mysql存储过程入门知识

    Mysql存储过程入门知识 #1,查看数据库所有的存储过程名 #--这个语句被用来移除一个存储程序.不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程 #SELECT NAME FROM ...

随机推荐

  1. 走进C标准库(4)——"stdio.h"中的putc

    花了点时间把园子弄得好看了点,现在继续. 函数名: putc 功  能: 输出一字符到指定流中 用  法: int putc(int ch, FILE *stream); #define _putc_ ...

  2. Python自动化环境搭建

    安装配置 Eclipse + PyDev + Robotframework 集成开发环境 1.安装JDK安装目录下的jdk-7u17-windows-i586.exe文件(JAVA开发.运行环境)安装 ...

  3. 主计划MPS禁止改写项目编号(PROJECT)

    应用 Oracle   Manufacturing Planning 层 Level Function 函数名 Funcgtion Name MRPFSDMS-253 表单名 Form Name MR ...

  4. C++ Placement New

    先看一个题目: #include <stdio.h> #include <iostream> using namespace std; struct Base { int j; ...

  5. Hibernate 数据的批量插入、更新和删除

    4.2  Hibernate的批量处理 Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象时,将被自动转换为对数据库的操作.例如调用Session的delete ...

  6. 链表-Partition List

    struct ListNode* partition(struct ListNode* head, int x) { struct ListNode *p1=(struct ListNode*)mal ...

  7. Ignatius and the Princess III(母函数)

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  8. 跟我一起学extjs5(16--各种Grid列的自己定义渲染)

    跟我一起学extjs5(16--各种Grid列的自己定义渲染)         Grid各列已经可以展示出来了.列的类型包含字符型,整型,浮点型,货币型,百分比型,日期型和布尔型,我自己定义了各种类型 ...

  9. [置顶] PHP如何扩展和如何在linux底层对php扩展?

    虽然大部分php工程师都不需要知道php的C代码核心是如何运作的,有些人可能知道有个dl()函数.或者使用过一些第三方的类库,这些正是本文的重点之一.            希望对那些想把php带向更 ...

  10. libcurl使用示例

    远程下载文件,并将http 头信息存放内存中以及文件大小等相关信息: #include <stdio.h> #include <curl/curl.h> #include &l ...