本篇代码例子: 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.youkuaiyun.com/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;
}
这时运行程序:
我们要实现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。