cocos2d-x退出回调?

时间:2015-10-15 19:26:42

标签: c++ cocos2d-x

我需要在应用程序退出之前运行一些清理和拆除代码。

我已经编写了我的onExit函数,我将在调用Director :: end之前调用它。但是当用户通过关闭窗口退出应用程序时,我需要运行此回调。

据我所知,cocos2d :: Application和cocos2d :: ApplicationProtocol都没有定义任何类型的退出或退出虚拟方法,可以被覆盖。

2 个答案:

答案 0 :(得分:0)

您可以在 AppController.mm 中实现(void)applicationWillTerminate:(UIApplication *)application,如果它尚未在您的cocos项目中实现(在我的 cocos2d_tests.xcodeproj 中已经实现),并且从那里打电话给你onExit功能。

类似的东西:

- (void)applicationWillTerminate:(UIApplication *)application {
    // call onExit() here, or forward the call to call onExit() :)
}

注意:这仅适用于iOS。对于Android,据我所知,并不等同于applicationWillTerminate

答案 1 :(得分:0)

我知道这个问题很旧,但是我还是想回答。

我创建了一个GameController类,并且AppDelegate有一个指向该类的指针。 这个GameController类将至少处理第一个场景或沿游戏变化的场景。 例如,这是我的AppDelegate.h:

#ifndef  _APP_DELEGATE_H_
#define  _APP_DELEGATE_H_

#include "cocos2d.h"

class GameController;
/**
@brief    The cocos2d Application.

Private inheritance here hides part of interface from Director.
*/
class  AppDelegate : private cocos2d::Application
{
public:
    AppDelegate();
    virtual ~AppDelegate();

    virtual void initGLContextAttrs() override;

    /**
    @brief    Implement Director and cocos2d::Scene* init code here.
    @return true    Initialize success, app continue.
    @return false   Initialize failed, app terminate.
    */
    virtual bool applicationDidFinishLaunching() override;

    /**
    @brief  Called when the application moves to the background
    @param  the pointer of the application
    */
    virtual void applicationDidEnterBackground() override;

    /**
    @brief  Called when the application reenters the foreground
    @param  the pointer of the application
    */
    virtual void applicationWillEnterForeground() override;

private:
    GameController* m_gameController;
};

#endif // _APP_DELEGATE_H_

GameController类具有一个公共功能Destroy实例,在该实例中,我会清理所有其他场景,类等。 因此,在AppDelegate的Destructor中,我调用了该函数:

AppDelegate.cpp:

#include "AppDelegate.h"

#include "GameController.h"
#include "extensions/cocos-ext.h"

USING_NS_CC;

AppDelegate::AppDelegate() : m_gameController(nullptr)
{
}

AppDelegate::~AppDelegate()
{
    m_gameController->DestroyInstance();
}

...
...
...

初始化AppDelegate.cpp中的所有内容并返回true之前,我调用GameController :: GetInstance()静态函数

bool AppDelegate::applicationDidFinishLaunching() {
...
...
...

m_gameController = GameController::GetInstance();

if (!m_gameController)
    {
        log("\n[AppDelegate] [Fatal] - GameController is nullptr.\n");
        return false;
    }

return true;
}

然后,GameController将(顾名思义)控制游戏,并且在游戏结束时(或在Win32,Mac osx或linux上关闭窗口),您可以在GameController :: DestroyInstance( )由AppDelegate Destructor调用。

这是我Gamecontroller.h的一部分:

#ifndef _GAME_CONTROLLER_H_
#define _GAME_CONTROLLER_H_

#include <atomic>

class GameController
{
public:
    ~GameController();

    static GameController* GetInstance();
    void DestroyInstance();
...
...
...

这是我GameController.cpp的一部分:

#include "GameController.h"

static GameController* s_gameController = nullptr;

GameController::GameController()
{

}

GameController::~GameController()
{

}

GameController * GameController::GetInstance()
{
    if (!s_gameController)
    {
        s_gameController = new (std::nothrow) GameController;
        if (s_gameController)
        {
            if (!s_gameController->Init())
            {
                delete s_gameController;
                s_gameController = nullptr;
            }
        }
    }
    return s_gameController;
}

void GameController::DestroyInstance()
{
    if (s_gameController)
    {
        delete s_gameController;
        s_gameController = nullptr;
    }
}
...
...
...

希望有帮助:D