Как создать заставку android cocos2dx?

Это мой код, я не знаю, как создать заставку и как она будет направлена ​​на мой экран меню. Все .h должны быть подключены к BaseScreen, а BaseScreen будет подключен к слою cocos2d. пожалуйста, помогите мне в моих кодах. Единственное, что появляется в моем эмуляторе, это спрайт, который я кодирую в 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

person Dana    schedule 27.09.2013    source источник
comment
вы разрабатываете для iOS или Android?   -  person Spring Breaker    schedule 27.09.2013
comment
Я разрабатываю игру для Android для cocos2dx.   -  person Dana    schedule 27.09.2013


Ответы (4)


Вот три шага, чтобы добавить сцену заставки на Android. Использование cocos2d-x 3.4. Надеюсь это поможет!

1 Создайте файл 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 Создайте файл 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. Измените 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;
}
person marcwjj    schedule 16.04.2015

Я использую функцию scheduleOnce.

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());
}

через 2 секунды завершите заставку и запустите GameWall Screen. Это все, что я сделал.

person einverne    schedule 09.11.2013

Вы можете наследовать класс от CCLayer, который запускает ваши приложения и отображает ваш спрайт. Затем вы можете переопределить метод onEnterTransitionDidFinish:

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

Когда заставка появляется на экране, начинается загрузка новой сцены и ее замена.

person Wez Sie Tato    schedule 27.09.2013
comment
Итак, мой класс HelloWorldScene может быть этим классом? и там я поставлю эти коды, я прав? Спасибо за ответ, тогда попробую - person Dana; 27.09.2013
comment
Я поместил ваш код в свой класс HelloWorldScene, а затем поместил void -----› onEnterTransitionDidFinish(); в HelloWorldScene.h затем создается ошибка: переопределяет cocos2d::CCLayeronEnterTransitionDidFinish и ошибка: нет функции-члена void HelloWorld::onEnterTransitionDidFinish(), объявленной в классе HelloWorld. Я новичок, поэтому мне трудно понять, пожалуйста, помогите - person Dana; 27.09.2013
comment
Спасибо за ваш ответ. Я сделал заставку с помощью этой единственной строки кода CCDirector::sharedDirector()-›replaceScene(CCTransitionFade::create(3.0f,MenuScene::scene())); - person Dana; 03.10.2013

попробуйте эту ссылку, возможно, вы найдете что-то полезное здесь 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;
}

или попробуйте этот, я надеюсь, что это решит это

person Community    schedule 27.09.2013
comment
хм У вас есть какие-нибудь ссылки, которые являются заставкой для cocos2dx? Спасибо за ссылку - person Dana; 27.09.2013
comment
Есть ли уже готовая игра с заставкой, исходный код которой можно скачать бесплатно? - person Dana; 30.09.2013