cocos2dx架构一瞥—程序架构、实时更新、主线程

本文接上一篇cocos2dx架构一瞥——Node类、坐标系及UI树。

本文是阅读《我所理解的cocos2d-x》第二章——Cocos2dx架构一瞥的2.4、2.5、2.6小章节后的总结。

(参考书籍《我所理解的cocos2d-x》,秦春林著)

(文中cocos2d-x版本为3.17)

六、应用程序架构

1、游戏生命周期

在cocos2dx中,一个游戏对应的是一个Application对象。但是我们通常不直接创建Application对象,而是通过实现一个Application的子类,来自定义我们游戏生命周期各个阶段的处理,这个子类叫AppDelegate。

int WINAPI _tWinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPTSTR    lpCmdLine,
                       int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // create the application instance
    AppDelegate app;
    return Application::getInstance()->run();
}

AppDelegate类

class  AppDelegate : private cocos2d::Application
{
public:
    AppDelegate();
    virtual ~AppDelegate();
    virtual void initGLContextAttrs();

    virtual bool applicationDidFinishLaunching();
    virtual void applicationDidEnterBackground();
    virtual void applicationWillEnterForeground();
};

Application类中的调用

 int Application::run()
{
 // Initialize instance and cocos2d.
    if (!applicationDidFinishLaunching())//此处调用的就是AppDelegate类中的方法
    {
        return 1;
    }
 }

我们细说一下AppDelegate类中的方法,因为这是我们主要的逻辑。

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    //首先我们初始化并获取Director单例,(单例模式)
    auto director = Director::getInstance();
    //然后我们获取OpenGLES的对象,并判断一下是否存在
    auto glview = director->getOpenGLView();
    if(!glview) {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)
        glview = GLViewImpl::createWithRect("MindOfMnemonist", cocos2d::Rect(0, 0, designResolutionSize.width, designResolutionSize.height));
#else
        glview = GLViewImpl::create("MindOfMnemonist");
#endif
        director->setOpenGLView(glview);
		glview->setDesignResolutionSize(800, 480, kResolutionExactFit);
    }
    // turn on display FPS
    director->setDisplayStats(true);

    // set FPS. the default value is 1.0/60 if you don't call this
    director->setAnimationInterval(1.0f / 60);
    
    // create a scene. it's an autorelease object
    auto scene = Scene::scene();

    // run
    //Director对象进行绘制场景
    //在多屏幕设备上,我们可以创建多个Director(去掉单例),每一个Director对应渲染一个屏幕。
    director->runWithScene(scene);
}

//除了以上的设置,我们还可以设置分辨率,帧率,资源搜索目录。

在应用程序启动之后,我们可能会需要相应切换事件(手机切换软件,程序就到了后台),程序前后台切换的时候,切到后台我们应该暂停游戏,切回之后再继续

我们可以在下面两个函数设置

class  AppDelegate : private cocos2d::Application
{
public:
    AppDelegate();
    virtual ~AppDelegate();

    virtual void initGLContextAttrs();
	//程序正常运行
    virtual bool applicationDidFinishLaunching();
	//程序被切到后台
    virtual void applicationDidEnterBackground();
	//切回前台
    virtual void applicationWillEnterForeground();
};
// This function will be called when the app is inactive. Note, when receiving a phone call it is invoked.
void AppDelegate::applicationDidEnterBackground() {
    Director::getInstance()->stopAnimation();
}

void AppDelegate::applicationWillEnterForeground() {
    Director::getInstance()->startAnimation();
}
2、窗口尺寸

在cocos2dx中Director控制着场景的一切,包括OpenGLES的初始化、窗口管理、场景管理以及切换、游戏循环等等。

在刚刚的源码中我们可以看到,Director控制着一个GLView的对象,它表示一个OpenGLES窗口。GLView会初始化OpenGLES相关的工作,在游戏的每一帧,Director都会通过GLView对象来绘制。

class CC_DLL Director : public Ref
{
GLView *_openGLView;
};

在概念上,WinSize表示实际的画布大小,VisibleSize表示屏幕上可见区域的大小,所以VisibleSize总是小于等于WinSize。

WinSize和VisibleSize都表示设计分辨率,设计分辨率又被称虚拟分辨率,它通常根据美术资源的分辨率来设置。

winSizeInPixels可以获取屏幕的实际分辨率。

3、场景管理
class CC_DLL Director : public Ref
{
	/** Gets current running Scene. Director can onl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值