Cocos2d-x 捕鱼达人游戏学习教程(3)--创建游戏的场景


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

我们将创建自己的游戏场景,因此要将HelloWorldScene这个类删掉,之后创建自己的游戏场景类GameScene,这个类继承自CCScene,在实现这个之前我们要创建BackgroundLayer、FishLayer、CannonLayer、PanelLayer和MenuLayer5个类都是继承自CCLayer

BackgroundLayer是背景层的类用来显示游戏的背景

BackgroundLayer.h代码如下:


#include "cocos2d.h"

USING_NS_CC;

class BackgroundLayer:public CCLayer
{
    
public:
    CREATE_FUNC(BackgroundLayer);
    bool init();
    
};

BackgroundLayer.cpp代码如下:


#include "BackgroundLayer.h"
#include "StaticData.h"

bool BackgroundLayer::init()
{
    bool pRet = false;
    
    do {
        CC_BREAK_IF(!CCLayer::init());
        //得到屏幕的大小包括宽和高
        CCSize winSize = CCDirector::sharedDirector()->getWinSize();
        //初始化一个精灵用来显示背景图片
        CCSprite* background = CCSprite::createWithSpriteFrameName(STATIC_DATA_STRING("background"));
        //设置背景图片的位置
        background->setPosition(ccp(winSize.width * 0.5, winSize.height * 0.5));
        //将精灵添加到层上
        this->addChild(background);
        pRet = true;
    } while (0);
    return pRet;
    
}

如果对上面代码中的do{}while(0)语句不理解推荐这篇文章:http://blog.csdn.net/qqmcy/article/details/9201217

之后我们为GameScene类加入代码:


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

GameScene.cpp

// 预载入资源,实现StartScene后将其删除
void GameScene::preloadResources()
{
    //将存放资源的plist文件加入到程序的缓存中
    CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("fishingjoy_resource.plist");
}

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

GameScene::~GameScene()
{
    
}


我们还要修改AppDelegate.cpp文件,首先,是先将之前的HelloWorldScene类的头文件删掉,换成GameScene的头文件。

之后再做如下修改。

bool AppDelegate::applicationDidFinishLaunching()
{
。。。。。。
    CCScene *pScene = GameScene::create();

    // run
    pDirector->runWithScene(pScene);

    return true;
}




这时运行程序:

Cocos2d-x 捕鱼达人游戏学习教程(3)--创建游戏的场景_第1张图片



我们要实现FishLayer层的类,在实现它之前我们要先创建一个Fish类。


Fish.h代码如下:


#include "cocos2d.h"
USING_NS_CC;
typedef enum
{
    k_Fish_Type_Red = 0,
    k_Fish_Type_Yellow,
    k_Fish_Type_Count
}FishType;
class Fish:public  CCNode
{
    
public:
    //函数重载FishType type = k_Fish_Type_Red 意思就是传一个参数将k_Fish_Type_Red的值给type
    static Fish* create(FishType type = k_Fish_Type_Red);
    //同上
    bool init(FishType type = k_Fish_Type_Red);
    //初始化一个只读的精灵
    CC_SYNTHESIZE_READONLY(CCSprite*, _fishSprite, FishSprite);
    //初始化一个int值,用来设置鱼的种类
    CC_SYNTHESIZE_READONLY(int, _type, Type);
    
    
};

Fish.cpp


#include "StaticData.h"
enum
{
    //这个枚举用来标记动画的类型
    k_Action_Animation = 0,
};

//实现create方法
Fish* Fish::create(FishType type)
{
    Fish* fish = new Fish();
    fish->init(type);
    fish->autorelease();
    return fish;
}

bool Fish::init(FishType type)
{
    //将鱼类型的标记传进来
    _type = type;
    //根据传进来的_type生成一个字符串,这个字符串的用途是从缓存中取之前生成的动画效果
    CCString* animationName = CCString::createWithFormat(STATIC_DATA_STRING("fish_animation"),_type);
    //从程序的缓存中将动画效果取出
    CCAnimation* fishAnimation = CCAnimationCache::sharedAnimationCache()->animationByName(animationName->getCString());
    //CCAnimate -- 动画,主要是将动画类CCAnimation生成动作CCAction
    CCAnimate* fishAnimate = CCAnimate::create(fishAnimation);
    //设置fishAnimate的tag值
    fishAnimate->setTag(k_Action_Animation);
    //初始化一个鱼的精灵
    _fishSprite = CCSprite::create();
    //将鱼添加到层上
    this->addChild(_fishSprite);
    //让鱼的精灵对象_fishSprite执行动作,CCRepeatForever永远重复执行
    _fishSprite->runAction(CCRepeatForever::create(fishAnimate));
    return true;
}




这样我们的Fish就完成了,我们将在下一篇完成鱼的图层类FishLayer。

你可能感兴趣的:(cocos2d-x,CCScene,捕鱼达人,CCLayer,CC_BREAK_IF)