zoukankan      html  css  js  c++  java
  • Cocos2d-x如何添加新场景及切换新场景(包括场景特效)

    做了一天多的工作终于把此功能搞定了,实际上添加新场景花费不了多少时间,时间主要花在切换到另一个场景的实现上,主要原因是编译时出现了一个错误,百思不得其解,后来经过查资料不断摸索才知道自己问题的所在,改正了错误编译通过,实现了我想要的结果,看着那个场景切换的自由和切换过程中各种特效的绚丽,看在眼里,乐在心里。

    下面开始我的探索之路:

    首先新建一个场景,其实你可以参考HelloWorld场景建立自己的场景,当然你在新的场景里实现的功能由你自己来定,下面贴上我的新建场景代码:

    SecondScene.h:

     1 #include "cocos2d.h"
     2 
     3 class SecondScene : public cocos2d::Layer
     4 {
     5 public:
     6     static cocos2d::Scene* createScene();
     7     virtual bool init();  
     8     void menuCloseCallback(cocos2d::Ref* pSender);
     9     CREATE_FUNC(SecondScene);
    10 };  
     1 #include "SecondScene.h"
     2 #include "HelloWorldScene.h"
     3 USING_NS_CC;
     4 
     5 Scene* SecondScene::createScene()
     6 {
     7     auto scene = Scene::create();
     8     auto layer = SecondScene::create();
     9     scene->addChild(layer);
    10     return scene;
    11 }
    12 
    13 bool SecondScene::init()
    14 {
    15   
    16     if ( !Layer::init() )
    17     {
    18         return false;
    19     }
    20     
    21     Size visibleSize = Director::getInstance()->getVisibleSize();
    22     Vec2 origin = Director::getInstance()->getVisibleOrigin();
    23     auto closeItem = MenuItemImage::create(
    24                                            "CloseNormal.png",
    25                                            "CloseSelected.png",
    26                                            CC_CALLBACK_1(SecondScene::menuCloseCallback, this));
    27     
    28     closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
    29                                 origin.y + closeItem->getContentSize().height/2));
    30 
    31     auto menu = Menu::create(closeItem, NULL);
    32     menu->setPosition(Vec2::ZERO);
    33     this->addChild(menu, 1);
    34     
    35     auto label = LabelTTF::create("Hello World world", "Arial", 24);
    36     
    37     label->setPosition(Vec2(origin.x + visibleSize.width/2,
    38                             origin.y + visibleSize.height - label->getContentSize().height));
    39 
    40     this->addChild(label, 1);
    41 
    42     auto sprite = Sprite::create("HelloWorld.png");
    43 
    44     sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
    45 
    46     this->addChild(sprite, 0);
    47     
    48     return true;
    49 }
    50 
    51 
    52 void SecondScene::menuCloseCallback(Ref* pSender)
    53 {
    54 CCScene* s = HelloWorld::createScene();  
    55 Director::sharedDirector()-       >replaceScene(CCTransitionFlipX::create(2.0f,s)); 
    56 }

    在HelloWorld.cpp中修改HelloWorld::menuCloseCallback(Ref * pSender)

    1 void HelloWorld::menuCloseCallback(Ref* pSender)
    2 {
    3     CCScene* secondScene = SecondScene::createScene();  
    4     Director::sharedDirector()->pushScene(CCTransitionJumpZoom::create(2.0f,secondScene));  
    5 }

    到此,创建新场景完成,下面就是编译运行切换到新的场景中实现切换的特效。

    在编译过程中我遇到个问题如下,这个问题费了很长时间才解决。

    jni/../../Classes/HelloWorldScene.cpp:118: error: undefined reference to 'SecondScene::createScene()'
    clang++: error: linker command failed with exit code 1 (use -v to see invocation)
    make: *** [obj/local/armeabi/libcocos2dcpp.so] Error 1

    解决方法是:加入每个新场景都要先注册一下,找到jni-->Classes目录下的Android.mk文件,加入新的场景文件SecondScene.cpp

    1 LOCAL_SRC_FILES := hellocpp/main.cpp 
    2                    ../../Classes/AppDelegate.cpp 
    3                    ../../Classes/HelloWorldScene.cpp 
    4                    ../../Classes/SecondSce
    重新编译通过,点击场景的菜单即可实现切换特效效果。
  • 相关阅读:
    安装centos虚拟机
    关于区别广播域与冲突域
    网络七层架构
    怎么有效避免黑客使用跳板软件进行攻击窃取信息数据
    C语言猜数字游戏
    页置换算法FIFO、LRU、OPT
    Samza的ApplicationMaster
    Samza文档翻译 : Comparison Introduction
    Samza文档翻译 : Architecture
    Samza文档翻译 : Concepts
  • 原文地址:https://www.cnblogs.com/cocos2014/p/3941364.html
Copyright © 2011-2022 走看看