Cocos2d-x 捕鱼达人游戏学习教程(4)--实现鱼层类FishLayer

时间:2023-02-08 10:45:46

本篇文章的代码例子: http://vdisk.weibo.com/s/ICRLw


在上一篇文章的基础之上,实现FishLayer类。


FishLayer.h


#include "cocos2d.h"
#include "Fish.h"
USING_NS_CC;

class FishLayer:public CCLayer
{

public:
//用CREATE_FUNC宏创建FishLayer
CREATE_FUNC(FishLayer);
bool init();
//初始化一个数组,用来存放鱼的对象
CC_SYNTHESIZE_READONLY(CCArray*, _fishes, Fishes);
//该类的析构方法
~FishLayer();
//添加鱼的方法
void addFish();
};



FishLayer.cpp



bool FishLayer::init()
{
bool pRet = false;
do {
//用CC_BREAK_IF方法初始化,可以达到容错的功能
CC_BREAK_IF(!CCLayer::init());
//初始化存放鱼对象的数组
_fishes = CCArray::create();
//用CC_SAFE_RETAIN宏来增加_fishes的引用计数
CC_SAFE_RETAIN(_fishes);
//循环50次
for (int i =0; i < 50; i++)
{
//创建一个随机数,CCRANDOM_0_1可以创建0~1之间的随机数 ,之后*2,可以达到1或2随机出现 的效果
int type = CCRANDOM_0_1()* 2;
//初始化鱼的对象 ,用create方法创建时传参数的意思是type是个1或2的随机数,根据type值的不同创建不同的鱼对象
Fish* fish = Fish::create((FishType)type);
//将fish添加到_fishes数组中
_fishes->addObject(fish);
}
//每隔3秒调用一次addFish方法
this->schedule(schedule_selector(FishLayer::addFish),3.0);
pRet = true;
} while (0);
return pRet;
}

void FishLayer::addFish()
{
//获取当前屏幕的大小
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
//生成一个1到11之间的随机数
int countToAdd = CCRANDOM_0_1() * 10 +1;
int countHasAdded = 0;

CCObject* iterator;
//将鱼的对象从_fishes数组中取出
CCARRAY_FOREACH(_fishes, iterator)
{
//用遍历方法从数组中取精灵对象时,只能用CCObject类取出,取出之后要强转成相对应的类型
Fish* fish = (Fish*)iterator;
//对鱼是否在场景中做判断
if (!fish->isRunning())
{
this->addChild(fish);
//todo 后期应重设Fish产生时的随机坐标
int randomX = CCRANDOM_0_1() * winSize.width;
int randomY = CCRANDOM_0_1() * winSize.height;
fish->setPosition(ccp(randomX, randomY));
countHasAdded++;
//下面判断的目的是为了让分批显示在屏幕上而且每次显示的数目不一致
if (countToAdd == countHasAdded)
{
break;
}

}
}
}



FishLayer::~FishLayer()
{
CC_SAFE_RELEASE(_fishes);
}



接下来我们要将鱼层的类加入到场景中:

在GameScene.h类添加如下代码:

添加红色字体的代码。

#include "cocos2d.h"
#include "BackgroundLayer.h"

#include "FishLayer.h"//添加头文件

USING_NS_CC;

class GameScene:public CCScene
{

public:
//CREATE_FUNC这个宏定义能够调用create()方法和init()方法,就是初始化的意思
CREATE_FUNC(GameScene);
//初始化时在这个方法中赋值
bool init();
//本类的析构方法
~GameScene();
//载入资源的方法
void preloadResources();
CC_SYNTHESIZE_RETAIN(BackgroundLayer*, _backgroundLayer, BackgroundLayer);

//声明鱼层类的对象
CC_SYNTHESIZE_RETAIN(FishLayer*, _fishLayer, FishLayer);


};

添加红色字体的代码。



GameScene.cpp

//预载入资源,实现StartScene后将其删除
void GameScene::preloadResources()
{
//将存放资源的plist文件加入到程序的缓存中
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("fishingjoy_resource.plist");
//从之前加入到系统缓存中的plist文件中读取KEY为fish_frame_count的值 这个值是8
int frameCount = STATIC_DATA_INT("fish_frame_count");

for (int type = k_Fish_Type_Red; type < k_Fish_Type_Count; type++)
{

CCArray* spriteFrames = CCArray::create();
for (int i = 0; i < frameCount; i++)
{
//获取图片的名字
CCString* filename = CCString::createWithFormat(STATIC_DATA_STRING("fish_frame_name_format"),type,i);
//用相应图片的名字将图片取出
CCSpriteFrame* spriteFrame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(filename->getCString());
//放入数组
spriteFrames->addObject(spriteFrame);
}
//生产动画类
CCAnimation* fishAnimation = CCAnimation::createWithSpriteFrames(spriteFrames);
fishAnimation->setDelayPerUnit(STATIC_DATA_FLOAT("fish_frame_delay"));
//给每一个动画起个名字,为了以后将动画取出
CCString* animationName = CCString::createWithFormat(STATIC_DATA_STRING("fish_animation"),type);
//将动画类的对象放入系统的缓存中,以键值对的形式
CCAnimationCache::sharedAnimationCache()->addAnimation(fishAnimation, animationName->getCString());
}
}

bool GameScene::init()
{
bool pRet = false;
do {
//调用父类的初始化方法,CC_BREAK_IF就是一个容错保护的方法
CC_BREAK_IF(!CCScene::init());
//调用预加载资源的方法
this->preloadResources();
//初始化背景层
_backgroundLayer = BackgroundLayer::create();
//将层添加到场景中
this->addChild(_backgroundLayer);

//初始化鱼的层
_fishLayer = FishLayer::create();
//将鱼的层添加到场景中
this->addChild(_fishLayer);





pRet = true;
} while (0);
return pRet;
}


现在运行程序鱼就会出现在屏幕上