问题
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