cocos2d-x 植物大战僵尸(3)随机太阳因子及利用C++多态实现金币递增

原创 2013年12月03日 08:58:15

大家早上好,我就接着,昨天的写了;

玩过植物大战僵尸的朋友都应该知道太阳光照射产生金币的过程,我把它叫做太阳因子,我就这样命名了,怎么滴!

好吧,太阳因子会在地图上方随机位置产生;我设计它并要求它完成两个直线运动实现系统的自动拾取; 说到自动拾取我就想到我那次玩植物大战僵尸的时候,突然冒出一句:是否要系统自动帮您拾取太阳光照,当时感觉这真他妈高科技,好人性化;呵呵;其实不过是简单的流程控制罢了!

好,下面我们来建一个层:(首先来说下这个层得作用:产生并实现太阳因子的各个功能,包括太阳因子的线性运动和回收);

SunCellLayer.h :

#pragma once
#include "e:\cocos2d-x\cocos2d-x-2.2\cocos2d-x-2.2\cocos2dx\layers_scenes_transitions_nodes\cclayer.h"
#include "cocos2d.h"
#include "SunCellSprite.h"

class SunCellLayer :public cocos2d::CCLayer
{
public:
	SunCellLayer(void);
	~SunCellLayer(void);

	CREATE_FUNC(SunCellLayer);
	bool virtual init();
	SunCellSprite* _sunCellSprite; //太阳因子精灵
	void initSunCell(float dt);//定时产生太阳因子
    cocos2d::CCSpriteBatchNode* _sunBatchNode;//太阳因子的精灵批处理节点
	cocos2d::CCSpriteFrameCache* _sunCache;//太阳因子的精灵框帧缓存
	void SunCellMoveWay();//声明太阳因子的运动路线;
	void removeSunCell(CCNode* pSend);//太阳因子的回收
};
在.cpp中我们先不去写上面方法的具体实现过程;

#include "SunCellLayer.h"
#include "GameLayer.h"
USING_NS_CC;

SunCellLayer::SunCellLayer(void)
{
	this->_sunCache =CCSpriteFrameCache::sharedSpriteFrameCache();//创建精良框帧缓存
	this->_sunCache->addSpriteFramesWithFile("suncell.plist");//包含精灵碎图的文件
	this->_sunCache->retain(); //保存缓存资源

	this->_sunBatchNode=CCSpriteBatchNode::create("suncell.pvr.ccz");//创建太阳因子的批处理节点;
	this->_sunBatchNode->retain();
	this->addChild(this->_sunBatchNode);//把精灵批处理节点加到太阳因子层

	this->_sunCellSprite =NULL;

}

SunCellLayer::~SunCellLayer(void)
{
	this->_sunCache->release();
	this->_sunBatchNode->release();
}

bool SunCellLayer::init()
{
	if(!CCLayer::init())
	{
		return false;
	}

	return true;
}

void SunCellLayer::initSunCell(float dt)
{
     
}

void SunCellLayer::SunCellMoveWay()
{
	
}

void SunCellLayer::removeSunCell(CCNode* pSend)
{
	
}

这是SunCellLayer类的基本结构;

下面我们要创建一个太阳因子的精灵类;然后把它加到太阳因子层里面去

SunCellSprite.h

#pragma once
#include "e:\cocos2d-x\cocos2d-x-2.2\cocos2d-x-2.2\cocos2dx\sprite_nodes\ccsprite.h"
#include "cocos2d.h"
class SunCellSprite :public  cocos2d::CCSprite
{
public:
	SunCellSprite(void);
	~SunCellSprite(void);
    CREATE_FUNC(SunCellSprite);
    virtual bool init();
};

SunCellSprite.cpp

#include "SunCellSprite.h"
USING_NS_CC;

SunCellSprite::SunCellSprite(void)
{

}
SunCellSprite::~SunCellSprite(void)
{
}
bool SunCellSprite::init()
{
	if(!CCSprite::initWithSpriteFrameName("Sun_1.png"))
	{
		return false;
	}
   int i;
   CCArray* sunArray = CCArray::create();//创建一个数组用于存放太阳因子的帧
   sunArray->retain();
   //下面是太阳因子的动画实现过程
   for(i=1;i<23;i++)
   {
	   CCSpriteFrame* sunFrames = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(CCString::createWithFormat("Sun_%d.png",i)->getCString());
	   sunArray->addObject(sunFrames);
   }
   CCAnimation* sunAnimation=CCAnimation::createWithSpriteFrames(sunArray,0.2f);
   this->runAction(CCRepeatForever::create(CCAnimate::create(sunAnimation)));
   return true;
}

	 
现在我们要把太阳因子精灵加到太阳因子层里面去;

在上面的SunCellLayer.h中我们已经声明过了,大家回头看下;

下面我们就来填充SunCellLayer.cpp哪些空的函数体,我们要求太阳因子每隔一小段时间产生一次。所以在上面的

void SunCellLayer::initSunCell(float dt)函数中加入以下代码:


void SunCellLayer::initSunCell(float dt)
{
       this->_sunCellSprite = SunCellSprite::create();//产生代糖因子
	   this->_sunBatchNode->addChild(this->_sunCellSprite);//把太阳因子加入到精灵批处理节点中去
	   CCSize winsize = CCDirector::sharedDirector()->getWinSize();//获取窗口的大小
	   //设定太阳因子产生的随机位子
	   this->_sunCellSprite->setPosition(ccp(3*winsize.width/4 * rand()/RAND_MAX + 1*winsize.width/5,winsize.height+this->_sunCellSprite->getContentSize().height));
	   this->SunCellMoveWay();//执行上面提到的两个线性运动,并在金币产生的位置回收太阳因子
}

我们要求太阳因子做两个线性运动后回收;所以在上面的void SunCellLayer::SunCellMoveWay()中加入以下代码:

void SunCellLayer::SunCellMoveWay()
{
	//这个函数代表太阳因子的具体运动过程
	CCSize winSize = CCDirector::sharedDirector()->getWinSize();
	CCFiniteTimeAction* sunCellMove1 = CCMoveTo::create(4.0f,ccp(this->_sunCellSprite->getPosition().x,1* winSize.height/4 *rand()/RAND_MAX + 2*winSize.height/5));
	CCFiniteTimeAction* sunCellMove2 = CCMoveTo::create(0.5f,ccp(2*winSize.width/7, 8*winSize.height/9));
	this->_sunCellSprite->runAction(CCSequence::create(sunCellMove1,sunCellMove2,CCCallFuncN::create(this,callfuncN_selector(SunCellLayer::removeSunCell)),NULL));
}

在上面的void SunCellLayer::removeSunCell(CCNode* pSend)加入以下代码:

void SunCellLayer::removeSunCell(CCNode* pSend)
{
	CCSprite* sprite = (CCSprite*) pSend;
	this->_sunBatchNode->removeChild(sprite,true);//从精灵批处理节点中回收太阳因子
	((GameLayer*)this->getParent())->_dollarDisplayLayer->_dollar = ((GameLayer*)this->getParent())->_dollarDisplayLayer->_dollar +25;//这句很重要,我的得意之处
	//利用C++多态实现金币的自动递增;
}
在SunCellLayer.cpp的init()中调用定时器:

schedule(schedule_selector(SunCellLayer::initSunCell),9.0f);//太阳因子的定时器


最后把我们的太阳因子层加到主游戏层里面去:

在GameLayer.h中加入以下代码:

#include "SunCellLayer.h"
SunCellLayer* _sunCellLayer;
	void initSunCellLayer();
	

在GameLayer.cpp的构造函数中:(这点很重要,一不小心就有可能造成内存泄露)

this->_sunCellLayer=NULL;

在void GameLayer::initSunCellLayer()中定义初始化太阳因子层:

//初始化太阳因子层
void GameLayer::initSunCellLayer()
{
	this->_sunCellLayer = SunCellLayer::create();
	this->addChild(this->_sunCellLayer);
}

在GameLayer.cpp中的init()方法中加入以下代码:
	this->initSunCellLayer();

这样太阳因子部分就完成了。。貌似有点多啊,先生们!










相关文章推荐

cocos2d-x游戏开发 跑酷(七) 添加金币和岩石

断断续续的,这个跑酷的代码终于写完了。再写两篇文章总结一下,这个游戏就算完工了,希望这个系列对新手有帮助。如果你能沉下心来看这几篇文章,我相信,一定能有所收获。当然最后肯定会开源代码的,请放心。 ...

【cocos2dx-3.0beta-制作flappybird】一闪一闪亮晶晶—游戏金币闪烁效果实现

一、引言 在Flappy Bird这个游戏中,我们其实也是用到了粒子效果。那便是在游戏结束画面当中,奖牌周围若隐若现的星星了。 二、原理分析 在前述的素材当中,我们注意到了如下素材: ...

Cocos2d-x简单游戏<植物大战僵尸>代码实现|第九部分:游戏场景GameScene.cpp<后续会提供源码下载链接>

#include "GameScene.h" #include "SimpleAudioEngine.h" #include "Plants.h" #include "BaseData.h" ...

Cocos2d-x简单游戏<植物大战僵尸>代码实现|第七部分:僵尸类<后续会提供源码下载链接>

这个植物大战僵尸的小游戏Demo 虽然下,但是基本包括了:   1.植物的选取、僵尸的攻击、发射子弹;   2.太阳的生成、碰撞检测等功能;      第一部分:Coco...

使用Cocos2D-x引擎在Mac下开发运行在iOS设备上的《植物大战僵尸》第一篇

今天,让我们一起来看一下关于使用Cocos2D-x引擎开发运行在iOS设备上的《植物大战僵尸》简易版本,我所做的就设计了两关,开始动画、菜单界面、游戏界面、游戏成功失败界面,菜单界面上有开始游戏按钮、...

使用Quick-Cocos2d-x开发植物大战僵尸02-地图编辑

我们首先要编辑一下游戏对战场景中的地图,使用瓦片地图编辑工具Tiled,这个工具相信大家都很熟悉了,如何使用该工具的教程也很多,这里我就不说怎么使用,不知道怎么使用的小伙伴自行百度学习哈 打开Tile...

使用Quick-Cocos2d-x开发植物大战僵尸03-游戏加载页面

呵呵,之前说好的要用lua写一个植物大战僵尸的Demo,只是写了个开头,然后就没有后面了,现在没什么事,就觉得写了个开头算怎么回事啊喂,所以又无耻的开始写了,还请各位多多原谅。好了,废话不多说,开始吧...

cocos2d-x 植物大战僵尸(二)

结着上次的写吧; 要实现的效果是阳光因子(姑且这么叫吧);阳光因子每隔一段时间在随机游戏窗口的上方随机产生;散落到屏幕的随机位置后,通过一个回调函数收回;收回的瞬间把玩家的金币 加 $25;(就这么...

cocos2d-x 植物大战僵尸(一:)

cocos2d-x这个游戏框架,我是在9月上旬接触的,开始没人指点,在入门上走了好多的弯路。。大概花了一个月时间才上手。所以我不想很多初学者想我一样学的那么吃力。。故而写点实战的例子拿出来跟大家分享。...

cocos2d-x 植物大战僵尸(三) bool型值对游戏流程的控制

当植物枪产生以后要进入一个冷却时间;在这段时间内不允许产生新的植物枪;这需要一个bool型值来控制; 声明一个bool型变量   bool _control;//这个变量用来控制倒计时过程中,禁止产生...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2d-x 植物大战僵尸(3)随机太阳因子及利用C++多态实现金币递增
举报原因:
原因补充:

(最多只允许输入30个字)