我需要在应用程序退出之前运行一些清理和拆除代码。
我已经编写了我的onExit函数,我将在调用Director :: end之前调用它。但是当用户通过关闭窗口退出应用程序时,我需要运行此回调。
据我所知,cocos2d :: Application和cocos2d :: ApplicationProtocol都没有定义任何类型的退出或退出虚拟方法,可以被覆盖。
答案 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