我的博客:http://blog.csdn.net/dawn_moon
上一节讲了一个loading的动画界面,其实没有loading资源。
怎么样loading资源,如何预加载资源呢。

直接上代码

// 创建一个一直重复的动画
    loading->runAction(RepeatForever::create(Sequence::create(fadeIn,fadeIn->reverse(),NULL)));

    // loading resources
    {
        // 帧缓存
        auto spriteFrameCache = SpriteFrameCache::getInstance();
        // 纹理缓存
        auto textureCache = Director::getInstance()->getTextureCache();
        textureCache->addImage(s_backgound);
        textureCache->addImage(s_backgound_cloud1);
        textureCache->addImage(s_backgound_cloud2);
        textureCache->addImage(s_backgound_sea1);
        textureCache->addImage(s_backgound_sea2);
        textureCache->addImage(s_beach_adornment);
        textureCache->addImage(s_island);

        spriteFrameCache->addSpriteFramesWithFile(s_boat_plist);

        // 加载声音资源
        SimpleAudioEngine::getInstance()->preloadBackgroundMusic(s_music_Back2new);
        SimpleAudioEngine::getInstance()->preloadBackgroundMusic(s_music_Back3new);
        SimpleAudioEngine::getInstance()->preloadBackgroundMusic(s_music_class);
        SimpleAudioEngine::getInstance()->preloadBackgroundMusic(s_music_mainmenu);
        SimpleAudioEngine::getInstance()->preloadEffect(s_music_2);
        SimpleAudioEngine::getInstance()->preloadEffect(s_music_3);
        SimpleAudioEngine::getInstance()->preloadEffect(s_music_4);
        SimpleAudioEngine::getInstance()->preloadEffect(s_music_12);
        SimpleAudioEngine::getInstance()->preloadEffect(s_music_14);
        SimpleAudioEngine::getInstance()->preloadEffect(s_music_15);
        SimpleAudioEngine::getInstance()->preloadEffect(s_music_16);
        SimpleAudioEngine::getInstance()->preloadEffect(s_music_19);

    }

这段预加载资源是写在init()函数里面的,接着上一章讲的代码。
可以看出,这里的加载资源是同步加载。就是init以后,一个一个去加载资源,一个加载完了加载另一个。
可以在开始加载的地方打个时间,加载完的地方再打个时间,算一下加载资源需要多少时间。
获取系统时间,单位秒

utils::gettime();

这个加载资源比较快,不到一秒就加载完毕了。

加载完毕以后需要进入场景了,就是开始场景。

那这里如何实现这个机制。

scheduleOnce(SEL_SCHEDULE(&StartGame::initUi),2);

加载完以后直接用一个自定义调度器,调了一个函数,initUi,延迟2秒调用。

简单粗暴。

在这个initUi()函数里面,我会把游戏开始前的场景实现完成。大概有一个海洋背景,几片云朵,倒影,岛屿,船等。

void StartGame::initUi(float t)
{
    removeAllChildren();

    auto textureCache = Director::getInstance()->getTextureCache();

    auto spriteFrameCache = SpriteFrameCache::getInstance();

    {// 加载背景
        auto background = Sprite::createWithTexture(textureCache->getTextureForKey(s_backgound));

        background->setPosition(wSize.width / 2,wSize.height / 2);

        addChild(background);
    }

    {   // 白云1
        auto cloud1 = Sprite::createWithTexture(textureCache->getTextureForKey(s_backgound_cloud1));
        // 设置锚点,左下角
        cloud1->setAnchorPoint(Vec2(0,0));

        cloud1->setPosition(0,wSize.height - cloud1->getContentSize().height);

        addChild(cloud1);

        // 白云倒影
        auto cloudShadow = Sprite::createWithTexture(textureCache->getTextureForKey(s_backgound_cloud1));

        cloudShadow->setAnchorPoint(Vec2(0,0));

        cloudShadow->setFlippedY(true);

        cloudShadow->setopacity(40);

        cloudShadow->setPosition(40,wSize.height - cloud1->getContentSize().height * 2);

        addChild(cloudShadow);

        // 白云2
        auto cloud2 = Sprite::createWithTexture(textureCache->getTextureForKey(s_backgound_cloud2));
        // 设置锚点,左下角
        cloud2->setAnchorPoint(Vec2(0,0));

        cloud2->setPosition(cloud1->getContentSize().width,wSize.height - cloud2->getContentSize().height);

        addChild(cloud2);

        // 岛
        auto land = Sprite::createWithTexture(textureCache->getTextureForKey(s_island));

        land->setAnchorPoint(Vec2(1,0));

        land->setPosition(wSize.width - 40,wSize.height - land->getContentSize().height - 47 * 2);

        addChild(land);

        // 岛倒影
        auto landShadow = Sprite::createWithTexture(textureCache->getTextureForKey(s_island));

        landShadow->setAnchorPoint(Vec2(1,0));

        landShadow->setFlippedY(true);

        landShadow->setopacity(40);

        landShadow->setPosition(wSize.width - 40,wSize.height - land->getContentSize().height - 78 * 2);

        addChild(landShadow);

        // 取第一帧
        auto frame = spriteFrameCache->getSpriteFrameByName("sailing_boat1.png");
        auto boat = Sprite::createWithSpriteFrame(frame);
        boat->setPosition(wSize.width - boat->getContentSize().width-50*2,230*2);

        // 创建一个帧动画
        auto animation = Animation::create();
        for (int i = 1; i < 4; i++) {
            char bname[64] = {0}; sprintf(bname,"sailing_boat%d.png",i); animation->addSpriteFrame(spriteFrameCache->getSpriteFrameByName(bname)); } animation->setDelayPerUnit(0.5); animation->setRestoreOriginalFrame(true); addChild(boat); auto animate = Animate::create(animation); boat->runAction(RepeatForever::create(animate)); // 船来回游荡,并会掉头 auto flipxAction = FlipX::create(true); auto moveBy = MoveBy::create(10,Vec2(-240,0)); auto action = Sequence::create(moveBy,flipxAction,moveBy->reverse(),flipxAction->reverse(),NULL); boat->runAction(RepeatForever::create(action)); // 第二条船 auto boat2 = Sprite::createWithSpriteFrame(frame); boat2->setFlippedX(true); boat2->setPosition(100,400); addChild(boat2); boat2->runAction(animate->clone()); auto moveBy2 = MoveBy::create(12,Vec2(300,0)); auto action2 = Sequence::create(moveBy2,flipxAction->clone()->reverse(),moveBy2->reverse(),flipxAction->clone(),NULL); boat2->runAction(RepeatForever::create(action2)); } } 

3.x版的动作系统和2.x有很大区别,比如Moveto动作没有reverse()方法了,就是说Moveto不能直接逆动作了。还有帧动画简化了很多。

大概会是这么个样子:

还有一些元素,下一张再来说明。

早上起来又加了一些注释,这样看起来清楚一些。

void StartGame::initUi(float t)
{
    // 干掉所有的子节点,这里主要是要干掉loading的精灵和其动作
    removeAllChildren();

    // 纹理缓存,预加载的资源可以直接从缓存取出来
    auto textureCache = Director::getInstance()->getTextureCache();

    // 帧缓存,直接从缓存取帧
    auto spriteFrameCache = SpriteFrameCache::getInstance();

    {// 加载背景
        auto background = Sprite::createWithTexture(textureCache->getTextureForKey(s_backgound));

        background->setPosition(wSize.width / 2,0));

        // 垂直翻转
        cloudShadow->setFlippedY(true);

        // 设置透明度
        cloudShadow->setopacity(40);

        cloudShadow->setPosition(40,wSize.height - cloud2->getContentSize().height);

        addChild(cloud2);

        // 岛
        auto land = Sprite::createWithTexture(textureCache->getTextureForKey(s_island));

        // 设置锚点,右下角
        land->setAnchorPoint(Vec2(1,wSize.height - land->getContentSize().height - 78 * 2);

        addChild(landShadow);

        // 取第一帧
        auto frame = spriteFrameCache->getSpriteFrameByName("sailing_boat1.png");

        // 用帧创建一个船精灵
        auto boat = Sprite::createWithSpriteFrame(frame);
        boat->setPosition(wSize.width - boat->getContentSize().width-50*2,230*2);

        // 创建一个帧动画
        auto animation = Animation::create();

        // 循环取船的序列帧
        for (int i = 1; i < 4; i++) {

            char bname[64] = {0}; sprintf(bname,i); animation->addSpriteFrame(spriteFrameCache->getSpriteFrameByName(bname)); } // 设置每一个动画帧的间隔 animation->setDelayPerUnit(0.5); // 动画完毕后保持第一帧 animation->setRestoreOriginalFrame(true); addChild(boat); // 创建一个动作 auto animate = Animate::create(animation); boat->runAction(RepeatForever::create(animate)); // 向左移动 auto moveBy = MoveBy::create(10,0)); // 水平翻转,船掉头 auto flipxAction = FlipX::create(true); // 组合动画,船来回游荡,并会掉头 auto action = Sequence::create(moveBy,NULL); boat->runAction(RepeatForever::create(action)); // 第二条船,动画同上,不过是在左边 auto boat2 = Sprite::createWithSpriteFrame(frame); boat2->setFlippedX(true); boat2->setPosition(100,400); addChild(boat2); // 这里不能直接用animate,因为boat1已经使用,这里必须要用另一个动作,所以clone一下 boat2->runAction(animate->clone()); auto moveBy2 = MoveBy::create(12,0)); // 这里的flipx跟boat1相反,所以这里先reverse一下,后面不reverse auto action2 = Sequence::create(moveBy2,NULL); boat2->runAction(RepeatForever::create(action2)); } } 

这段代码其实很清晰了。不过这里有很多知识点,比如纹理缓存,组合动作,帧动画,锚点等,后面一一讲解,这里先看代码吧。

cocos2d-x 3.6版连连看开始界面的更多相关文章

  1. CSS中实现动画效果-附案例

    这篇文章主要介绍了 CSS中实现动画效果并附上案例代码及实现效果,就是CSS动画样式处理,动画声明需要使用@keyframes name,后面的name是人为定义的动画名称,下面我们来看看文章的具体实现内容吧,需要的小伙伴可以参考一下

  2. ios – 围绕其中心点旋转UIImageView?

    我在UIImageView中有一个透明的png,我想围绕它的中心点旋转.代码应该非常简单:图像以正确的速度/时间和直角旋转,但其位置会发生偏移.这是一个正在发生的事情的例子:灰色方块只是为了在屏幕上显示位置.透明的png是另一个图.白色虚线显示UIImageView的中心.图像的左侧显示图像的原始位置,右侧显示使用上述代码旋转后的图像.黑色和白色圆圈位于图像文件的中心.有什么东西我不见了吗?

  3. ios – 将UIView的框架和角半径合在一起

    码:此代码是UIView的扩展.解决方法我像这样调整我的圈子视图:

  4. ios – 如何在Cocos2D 3.x中为CCSprite制作动画?

    你知道如何在新的Cocos2Dv3.x中动画CCSprite吗?许多类都被改变了,旧的方法似乎不起作用.任何的想法?谢谢.额外信息解决方法这是它的工作原理:

  5. ios5 – UIPageViewController转换速度/持续时间?

    有没有办法改变页面卷曲过渡的默认持续时间?这是快速的方式然后我希望它会是?谢谢沙尼解决方法Hy,这是使用默认转换来卷曲页面和指定卷曲速度的方法.祝你工作顺利.

  6. ios – 重用UICollectionView中的单元格时,会短暂显示重用的UICollectionViewCell的旧内容

    我正在使用UICollectionView来显示从URL异步加载的图片网格.我的集合视图使用可重用单元格来显示UICollectionViewCells.当不重复使用单元格时,所有内容都会正确显示,但是当我滚动一下时,重用的单元格会在它们开始正常行为之前短暂闪烁旧内容.以下是自定义UICollectionViewController的实现:这是自定义UICollectionViewCell的实现.

  7. 在iOS中移动UICollectionView的单元格?

    我有一个UICollectionView.I我试图给它作为SpringBoard的功能.我有能力给每个单元格摇动动画.但是我想当图标摇动时,我应该能够移动他们.为了摇动单元格,我已经在每个单元格上添加了UILongPressGesture.当手势结束时,我已经添加了一个自定义动画.还在左上角添加了一个删除按钮.长按手势代码:添加手势到集合视图回调方法单元格在inde路径项在这里工作正常为了移动单元

  8. iOS:CAShapeLayer绘制非直视图像并为其形状设置动画

    我一直在阅读有关CAShapeLayer的文档,但我仍然不太明白.根据我的理解,Layer始终是扁平的,其大小始终是矩形.另一方面,CAShapeLayer允许您定义不仅仅是矩形的图层.它可以是圆形,三角形等,只要您将它与UIBezierPaths一起使用即可.我的理解是在这里吗?

  9. ios – CGContextSaveGState:应用启动时的无效上下文0x0

    FWW我的应用程序大多是用Swift2.0编写的,在iOS9上使用Xcode7b6.解决方法我遇到同样的问题,其原因是,我正在为不同的屏幕设置不同的状态栏样式.因此,我需要在plist中添加“查看基于控制器的状态栏外观”键.如果我删除此键,警告消失.

  10. ios – 可以将视图放在彼此之上

    我正在构建一个Watch应用程序,其中我要覆盖WKInterfaceImage与一组WKInterfaceLabel对象.在StoryBoard编辑器中似乎无法做到这一点.有没有人能够为WatchApp设计出相互之间的观点?

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部