2013-09-27 98 views
2

这是我的代码,我不知道如何创建启动画面,以及它如何在我的菜单画面中直接显示。所有.h必须连接到BaseScreen,并且BaseScreen将是连接在cocos2d图层中的一个。请在我的代码中帮助我。不要出现在我的模拟器唯一的事情是精灵,我的代码在HelloWorldScreen.h如何创建android cocos2dx启动画面?

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 
+0

你正在为iOS或Android开发? –

+0

我正在开发一款适用于cocos2dx的安卓游戏 – Dana

回答

0

尝试此链接出来也许你能找到的东西在这里有用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; 
} 

或试试这个,我希望它会解决它

+0

uhm您是否有任何链接是cocos2dx的启动屏幕?感谢您的链接 – Dana

+0

是否有一个已经制作的游戏与闪屏,可以免费下载其源代码? – Dana

0

可以使类继承从CCLayer启动您的应用程序并显示您的精灵。然后你就可以覆盖onEnterTransitionDidFinish方法:

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

当闪屏抵达到屏幕上,那么它开始加载新的场景和更换。

+0

好的,我的类HelloWorldScene可以是那个类吗?在那里我会把这个代码是我的权利?谢谢你的回答我会试试这个然后 – Dana

+0

我把你的代码放在我的HelloWorldScene类中,然后我把void -----> onEnterTransitionDidFinish();在HelloWorldScene中。h然后它创建错误:覆盖cocos2d :: CCLayeronEnterTransitionDidFinish和错误:no'void HelloWorld :: onEnterTransitionDidFinish()'在类'HelloWorld'中声明的成员函数。我是一个新手,所以我很难理解,请帮助 – Dana

+0

感谢您的回应我已经完成了闪屏这一行代码CCDirector :: sharedDirector() - > replaceScene(CCTransitionFade :: create(3.0f ,MenuScene ::场景())); – Dana

3

我正在使用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界面。这就是我所做的一切。

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