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

今天分析的是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());

}


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

今天就到这里了


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值