cocos2d-x v3.2 FlappyBird 各个类对象具体代码分析(2)

来源:互联网 发布:阿里云计算认证考试 编辑:程序博客网 时间:2024/06/05 01:51

今天分析的是WelcomeScene.h类,这个类是我自己写的,主要为了实现各种资源的加载,声音图片动画,这里主要说明一点,加载到缓存中的资源是全局的,在每个地方都可以调用,为了使这个场景不乏味,我自己添加了背景图片,和简单的loading动画。

要用到的资源:


以welcomeBg.plist和welcomeBg.png 为例这两个文件是对应的,使用一个叫TexturePacker软件把一张一张分散的小图片制作成一张大图片


制作前


制作后

那个plist文件则记录了里面每张图片的坐标和图片的名字


这就是plist文件,可以看到这种数据。具体制作方法还是百度吧。

这里还要讲的就是cocos2d-x里的SpriteFrameCache类,这是个单例类,它能够根据plist文件里的数据,截取对应大图里的纹理,这样用起来很方便。

下面就是代码分析

//这个类主要是实现资源的加载,声音和图片,还有我们猪脚的动画//都加载到缓存中,方便以后使用//WelcomeScene.h#pragma once#include "cocos2d.h"class WelcomeScene:public cocos2d::Layer{public:WelcomeScene();~WelcomeScene();//创建欢迎界面的场景static cocos2d::Scene * createScene();bool init();CREATE_FUNC(WelcomeScene);//加载资源结束后场景切换void loadingDone();private:};

//WelcomeScene.cpp#include "WelcomeScene.h"#include "GameBegin.h"#include "define.h"#include "SimpleAudioEngine.h"USING_NS_CC;WelcomeScene::WelcomeScene(){}WelcomeScene::~WelcomeScene(){}cocos2d::Scene * WelcomeScene::createScene(){auto scene=Scene::create();auto welcomeLayer=WelcomeScene::create();scene->addChild(welcomeLayer);return scene;}bool WelcomeScene::init(){if (!Layer::init()){return false;}auto origin=Director::getInstance()->getVisibleOrigin();auto visibleSize=Director::getInstance()->getVisibleSize();//读取游戏的图片资源SpriteFrameCache::getInstance()->addSpriteFramesWithFile("welcomeBg.plist");SpriteFrameCache::getInstance()->addSpriteFramesWithFile("images.plist");//给场景设置背景auto bg=Sprite::createWithSpriteFrameName("welcomeBg.png");bg->setPosition(Point(origin.x+visibleSize.width/2,origin.y+visibleSize.height/2));this->addChild(bg);//随机种子,因为后面要用到随即数srand((unsigned)time(NULL));//加载声音CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sounds/sfx_die.mp3");CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sounds/sfx_hit.mp3");CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sounds/sfx_point.mp3");CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sounds/sfx_swooshing.mp3");CocosDenshion::SimpleAudioEngine::getInstance()->preloadEffect("sounds/sfx_wing.mp3");//loading 界面动画加载及播放,这个就是welcomneBg里有三张loading的图片使用//相当于帧动画auto animation=Animation::create();//这里的 LOADING_FRE 就是上一张define.h里面定义了的,是图片播放频率animation->setDelayPerUnit(LOADING_FRE);animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("zt1.png"));animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("zt2.png"));animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("zt3.png"));auto animate=Animate::create(animation);//这里是loading动画播放的次数,LOADING_NUM 在define.h里去找auto repeat=Repeat::create(animate,LOADING_NUM);//这里是回调函数,当loading动画播放完成后,我们要切换场景啊auto callBack=CallFuncN::create(CC_CALLBACK_0(WelcomeScene::loadingDone,this));//然后把动画和回调函数放到一个列队中,先执行动画,动画执行完了回调切场景auto sequence=Sequence::create(repeat,callBack,NULL);//这个是要执行动画的精灵,我们给他定义动画的第一帧auto loading=Sprite::createWithSpriteFrameName("zt1.png");loading->setPosition(Point(origin.x+visibleSize.width/2,origin.y+visibleSize.height/2));this->addChild(loading);//执行动画loading->runAction(sequence);//下面的是我们猪脚小鸟的动画,我们在这里定义好//然后放到缓存中,给它取个名字,下次使用的时候就可以直呼其名//把它召唤出来-.-//这是黄色的那只小鸟挥动翅膀动画auto birdAnimation_0=Animation::create();birdAnimation_0->setDelayPerUnit(BIRD_FLY_FRE);birdAnimation_0->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bird0_0.png"));birdAnimation_0->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bird0_1.png"));birdAnimation_0->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bird0_2.png"));//这里就是把他放到缓存中,然后名字就是 BIRDANIMATION_0 见define.h文件AnimationCache::getInstance()->addAnimation(birdAnimation_0,BIRDANIMATION_0);//这是蓝色的那只小鸟挥动翅膀动画auto birdAnimation_1=Animation::create();birdAnimation_1->setDelayPerUnit(BIRD_FLY_FRE);birdAnimation_1->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bird1_0.png"));birdAnimation_1->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bird1_1.png"));birdAnimation_1->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bird1_2.png"));AnimationCache::getInstance()->addAnimation(birdAnimation_1,BIRDANIMATION_1);//这是红色的那只小鸟挥动翅膀动画auto birdAnimation_2=Animation::create();birdAnimation_2->setDelayPerUnit(BIRD_FLY_FRE);birdAnimation_2->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bird2_0.png"));birdAnimation_2->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bird2_1.png"));birdAnimation_2->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("bird2_2.png"));AnimationCache::getInstance()->addAnimation(birdAnimation_2,BIRDANIMATION_2);return true;}//这个就是loading动画执行完后的回调函数void WelcomeScene::loadingDone(){//我们切换到了GameBegin这个场景了Director::getInstance()->replaceScene(GameBegin::createScene());}


这是运行结果......其实我们加载了很多东西-.-

今天就到这里了


0 0
原创粉丝点击