从头开始读cocos2d-x-3.2alpha0 (1) 了解AppDelegate

哈喽  各位小伙伴,人最害怕的是不敢,我一个小小码农,今天号称要深入了解cocos2d-x-3.2alpha0 的原理,说干就干。


首先,记住一句话,计算机上展示给我们看的都是画出来的。


win32程序的入口为main函数,找到我们要的main函数;

会发现这两句话:

    AppDelegate app;
    return Application::getInstance()->run();

不得不说很简洁,先看第2句话,跟进去看看。

在run方法中

   // Initialize instance and cocos2d.
    if (!applicationDidFinishLaunching())
    {
        return 0;
    }

擦  调用了applicationDidFinishLaunching()方法 ,我们在AppDelegate.cpp中确实在这个方法里进行了初始化一些设置,和运行场景,不过调用run方法是Application::getInstance()这个东东啊,带着疑问接着看下去。你会看到:

 while(!glview->windowShouldClose())
    {
        QueryPerformanceCounter(&nNow);//查询定时器的计数值
        if (nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart)
        {
            nLast.QuadPart = nNow.QuadPart;
            
            director->mainLoop();//这名字赤裸裸啊 主循环
            glview->pollEvents();
        }
        else
        {
            Sleep(0);
        }
    }

while循环而且从条件名一看就知道当glview不应该被关闭也就是游戏没有关闭的情况下这是一个永真的循环(注意逻辑,游戏没有关闭永真的循环)下面是设置帧数的函数(1/帧数)
void Application::setAnimationInterval(double interval)
{
    LARGE_INTEGER nFreq;
    QueryPerformanceFrequency(&nFreq);//返回硬件支持的高精度计数器的频率。
    _animationInterval.QuadPart = (LONGLONG)(interval * nFreq.QuadPart);
}


言归正传,看看传说中的mainLoop


void DisplayLinkDirector::mainLoop()
{
    if (_purgeDirectorInNextLoop)// this flag will be set to true in end() 所以不管他
    {
        _purgeDirectorInNextLoop = false;
        purgeDirector();
    }
    else if (! _invalid)
    {
        drawScene();//看见没有又是赤裸裸的绘制场景啊 记住一起都是画出来的
     
        // release the objects
        PoolManager::getInstance()->getCurrentPool()->clear();//每一次绘制完成清理autorelease pool.
    }
}


擦  不得不说  跑偏了,继续言归正传讲了这么一坨可是跟AppDelegate有关系吗,当然要不我写这篇博客干什么(当然这也是一句废话),看看Application::getInstance()里是什么。
Application* Application::getInstance()
{
    CC_ASSERT(sm_pSharedApplication);
    return sm_pSharedApplication;
}
我擦  直接就return了  搞什么,竟然不是一个单例模式 疑问what is sm_pSharedApplication?  搞什么鬼,不要慌张,再看看main里的第一句话 AppDelegate app;看似简简单单的背后却隐藏着深深的含义,一个类对象如果这么声明一个对象的话会调用无参构造函数。

AppDelegate::AppDelegate() {

}

不愧是无参构造函数 ,真什么都没写啊。难道我系列第一篇就挂了,当然不是( 鄙视我都鄙视自己),看下面这个

class  AppDelegate : private cocos2d::Application


如果子类构造函数没有显式调用父类构造函数会隐式调用父类无参构造函数偷笑


Application::Application()
: _instance(nullptr)
, _accelTable(nullptr)
{
    _instance    = GetModuleHandle(nullptr);
    _animationInterval.QuadPart = 0;
    CC_ASSERT(! sm_pSharedApplication);
    sm_pSharedApplication = this;//找到你了
}


所以我们写在AppDelegate::applicationDidFinishLaunching()中的代码在run()方法中被调用。


Yes 写完了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值