How to create android cocos2dx splash screen?

坚强是说给别人听的谎言 提交于 2019-12-01 09:56:15

问题


This is my code I don't know how to create splash screen and how it will direct in my menu screen. All .h must be connected to BaseScreen and the BaseScreen will be the one connected in cocos2d layer. please help me in my codes. Do only thing that appears in my emulator is the sprite which I code in HelloWorldScreen.h

SplashScreen.h

ifndef __SPLASH_SCREEN_H__
define __SPLASH_SCREEN_H__

include "BaseScreen.h"
include "cocos2d.h"

class SplashScreen : BaseScreen 
{
public:
void update ();
static cocos2d::CCSprite* splashScreen;
int time;
MenuScreen menuScreen;
};
endif

HelloWorldScene.cpp

include "HelloWorldScene.h"
include "SplashScreen.h"
include "cocos2d.h"

USING_NS_CC;

CCScene* HelloWorld::scene()
{
// 'scene' is an autorelease object
CCScene *scene = CCScene::create();

// 'layer' is an autorelease object
HelloWorld *layer = HelloWorld::create();

// add layer as a child to scene
scene->addChild(layer);

// return the scene
return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{

// 1. super init first
if ( !CCLayer::init() )
{
    return false;
}

CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSize size = CCDirector::sharedDirector()->getWinSize();
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();


// 2. add a menu item with "X" image, which is clicked to quit the program
//    you may modify it.

// add a "close" icon to exit the progress. it's an autorelease object
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
                                    "CloseNormal.png",
                                    "CloseSelected.png",
                                    this,
                                    menu_selector(HelloWorld::menuCloseCallback));

pCloseItem->setPosition(ccp(origin.x + visibleSize.width -                       pCloseItem->getContentSize().width/2 ,
                            origin.y + pCloseItem->getContentSize().height/2));

// create menu, it's an autorelease object
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);
this->addChild(pMenu, 1);


// 3. add your codes below...

// create background image from png
    CCSprite *splashScreen = CCSprite::create("company.png");
    // position the background image at the center of window
    splashScreen->setPosition(ccp(size.width / 2, size.height / 2));


    // add background image at z-position = -1, bottom of all
    this->addChild(splashScreen, -1);

    // calculate the scaling factor to fill the window size
    float bX = size.width / splashScreen->getContentSize().width;
    float bY = size.height / splashScreen->getContentSize().height;

    // set the scaling factor to the background image
    splashScreen->setScaleX(bX);
    splashScreen->setScaleY(bY);

return true;
}


//callfuncN_selector(MainScene::spriteMoveFinished)
//backcalls the function spriteMoveFinished()
void HelloWorld::spriteMoveFinished(CCNode* pSender)
{
CCSprite *sprite = (CCSprite *)pSender;
this->removeChild(sprite, true);
}


void HelloWorld::menuCloseCallback(CCObject* pSender)
{
CCDirector::sharedDirector()->end();

if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
endif
}

BaseScreen.h

ifndef __BASE_SCREEN_H__
define __BASE_SCREEN_H__

include "cocos2d.h"

class BaseScreen : public cocos2d::CCLayer
{
public:
//  BaseScreen getParent ();
void loadNewScreen (BaseScreen newScreen);
void update ();
//  BaseScreen *parentBaseScene;
};
endif

回答1:


Here are three steps to add a splash screen scene on android. Using cocos2d-x 3.4. Hope this helps!

1 Create a SplashScene.cpp

    #include "SplashScene.h"
    #include "HomeScene.h"

    using namespace cocos2d;

    cocos2d::Scene* SplashScene::createScene()
    {
        // 'scene' is an autorelease object
        auto scene = Scene::create();

        // 'layer' is an autorelease object
        auto layer = SplashScene::create();

        // add layer as a child to scene
        scene->addChild(layer);

        // return the scene
        return scene;
    }



// on "init" you need to initialize your instance
bool SplashScene::init()
{
    if ( !Layer::init() )
    {
        return false;
    }

    auto visibleSize = Director::getInstance()->getVisibleSize();

    auto sprite = Sprite::create("splash.png");

    // position the sprite on the center of the screen
    sprite->setPosition(Vec2(visibleSize.width/2 , visibleSize.height/2 ));

    // add the sprite as a child to this layer
    this->addChild(sprite, 0);

    return true;
}

void SplashScene::onEnter() {
    Layer::onEnter();

    // Wait for 0.5 seconds to load main scene
    this->scheduleOnce(schedule_selector(SplashScene::finishSplash), 0.5f);
}

void SplashScene::finishSplash(float dt) {
    // ... do whatever other initializations here
    // Show the actual main scene
    Director::getInstance()->replaceScene(HomeScene::createScene());
}

2 Create SplashScene.h

#ifndef __SplashScene__
#define __SplashScene__

#include <stdio.h>
#include "cocos2d.h"

USING_NS_CC;

class SplashScene : public cocos2d::Layer
{
public:
    // there's no 'id' in cpp, so we recommend returning the class instance pointer
    static Scene* createScene();

    // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
    virtual bool init();

    void onEnter();

    void finishSplash(float dt);

    // implement the "static create()" method manually
    CREATE_FUNC(SplashScene);
};

#endif /* defined(__stickerPuzzle__SplashScene__) */

3 Modify AppDelegate.cpp

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLViewImpl::create("My Game");
        director->setOpenGLView(glview);
    }

    // set FPS. the default value is 1.0/60 if you don't call this
    director->setAnimationInterval(1.0 / 60);

    // ... other stuff ... 

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    // On Android - start the splash scene first
    auto scene = SplashScene::createScene(); 
    director->runWithScene(scene);
#endif

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    // On iOS, no need to add splash scene, start main scene directly
    auto scene = HomeScene::createScene(); 
    director->runWithScene(scene);
#endif

    return true;
}



回答2:


I am using the scheduleOnce function.

void Splash::onEnter(){
    CCLayer::onEnter();
    CCLog("onEnter");
    this->scheduleOnce(schedule_selector(Splash::finishSplash),2.0f);
}

void Splash::finishSplash(float dt){
    CCDirector::sharedDirector()->replaceScene(GameWall::scene());
}

after 2 seconds, finish the splash screen and start GameWall Screen. That's all I have done.




回答3:


You can make class inherit from CCLayer which start your applications and display your sprite. Then you can override onEnterTransitionDidFinish method:

 void SplashScreen::onEnterTransitionDidFinish(){
  CCScene * sceneAfterSplashScreen = StartLayer::scene();
  CCDirector::sharedDirector()->replaceScene(sceneAfterSplashScreen);
}

When the splash screen arrived to the screen, then it's start to load new scene and replace it.




回答4:


try this link out maybe you can find something useful here http://www.androidhive.info/2013/07/how-to-implement-android-splash-screen-2/

#include "HelloWorldScene.h" 
#include "OptionsScene.h" 
#include "SplashScene.h" 
#include "SimpleAudioEngine.h" 
#include "RedirectMethods.h" 

using namespace cocos2d;
using namespace CocosDenshion;

CCScene* SplashScene::scene() {
    CCScene *scene = CCScene::create();
    SplashScene *layer = SplashScene::create();
    scene->addChild(layer);
    return scene;
}

bool SplashScene::init() {
    if (!CCLayer::init()) {
        return false;
    }

    CCSize screenSize = CCDirector::sharedDirector()->getWinSize();

    CCSprite* logomarca = CCSprite::create("cocos2dx_logo.png");
    logomarca->setPosition(ccp(screenSize.width / 2, screenSize.height / 2));
    this->addChild(logomarca, 1);

    CCFiniteTimeAction *seq1 = CCSequence::create(CCDelayTime::create(3.0),
            CCCallFuncN::create(this,
                    callfuncN_selector(RedirectMethods::MenuScene)), NULL);

    this->runAction(seq1);

    return true;
}

or try this one i hope it will solve it



来源:https://stackoverflow.com/questions/19044265/how-to-create-android-cocos2dx-splash-screen

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!