今天分析的是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());
}
这是运行结果......其实我们加载了很多东西-.-
今天就到这里了