本篇代码例子: 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(); };
#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; }
之后我们为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); };
// 预载入资源,实现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); };
#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。