对于3.0以前的版本都是helloworld,在3.0里面改成cpp-empty-test
我们先来看看main.cpp,作为c、c++程序员,程序入口就是main.cpp所以他很重要,看下面代码:
#include "main.h"
#include "../Classes/AppDelegate.h"
USING_NS_CC;
int APIENTRY _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();
}
对于我,上面无关重要的(我自己觉得)我不管
int APIENTRY _tWinMain
像这货根我们常见的不同,但是对我们重要吗?管他了,他就是一吊丝,![偷笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/titter.gif)
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
进去一看,没用!!
根我们有关,程序真正运行起来是这两行代码
AppDelegate app;
return Application::getInstance()->run();
上面代码涉及到两个类,我们来看看他们的关系
我们从根开始聊聊:
1.先看看ApplicationProtocol代码
class CC_DLL ApplicationProtocol
{
public:
/**
* @js NA
* @lua NA
*/
virtual ~ApplicationProtocol() {}
/**
@brief Implement Director and Scene init code here.
@return true Initialize success, app continue.
@return false Initialize failed, app terminate.
* @js NA
* @lua NA
*/
virtual bool applicationDidFinishLaunching() = 0;
/**
@brief This function will be called when the application enters background.
* @js NA
* @lua NA
*/
virtual void applicationDidEnterBackground() = 0;
/**
@brief This function will be called when the application enters foreground.
* @js NA
* @lua NA
*/
virtual void applicationWillEnterForeground() = 0;
/**
@brief Callback by Director for limit FPS.
@param interval The time, expressed in seconds, between current frame and next.
* @js NA
* @lua NA
*/
virtual void setAnimationInterval(double interval) = 0;
/**
@brief Get current language config
@return Current language config
* @js NA
* @lua NA
*/
virtual LanguageType getCurrentLanguage() = 0;
/**
@brief Get current language iso 639-1 code
@return Current language iso 639-1 code
* @js NA
* @lua NA
*/
virtual const char * getCurrentLanguageCode() = 0;
/**
@brief Get target platform
* @js NA
* @lua NA
*/
virtual Platform getTargetPlatform() = 0;
};
看到没,全是纯虚函数,好好根着学学吧,骚年!!(其实我就是那骚年)这样设计函数接口,大家知道含有纯虚函数的类为抽象类,不能实例化。
2.在来看看Application类
class CC_DLL Application : public ApplicationProtocol
{
public:
/**
* @js ctor
*/
Application();
/**
* @js NA
* @lua NA
*/
virtual ~Application();
/**
@brief Run the message loop.
*/
int run();
/**
@brief Get current applicaiton instance.
@return Current application instance pointer.
*/
static Application* getInstance();
protected:
static Application * sm_pSharedApplication;
};
virtual bool applicationDidFinishLaunching() = 0;
virtual void applicationDidEnterBackground() = 0;
virtual void applicationWillEnterForeground() = 0;
这是我简化后的,因为对于我们来说,只有这几个函数对于我们有用。需要注意一点Application继承于ApplicationProtocol但是他没有实现所有的纯虚函数,还有三个函数没有实现
所以Application也是抽象类
2.1 Application的构造函数:
Application::Application()
: _instance(nullptr)
, _accelTable(nullptr)
{
_instance = GetModuleHandle(nullptr);
_animationInterval.QuadPart = 0;
CC_ASSERT(! sm_pSharedApplication);
sm_pSharedApplication = this;
}
主要关注sm_pSharedApplication=this, 他保存了当前自己,他是个static Application的指针,他在下面这个函数接口中有用
Application* Application::getInstance()
{
CC_ASSERT(sm_pSharedApplication);
return sm_pSharedApplication;
}
他代替了3.0以前的
static Application* sharedApplication();
前面我们看到main.cpp中Application::getInstance()->run();前面有AppDelegate app;大家也许发现,只是声明了一个AppDelegate的对象,却不用他,能不能把他去掉了?
答案是不能的,并且他写这里并不是无关紧要的,大家知道c++中有多态,当父类的函数中某个函数为虚函数时,他会主动调用子类的实现。我们知道AppDelegate中有个三个函数没有实现,他们是在AppDelegate中实现,大家调试一下就知道,这样一来,main.cpp分析完了
3.AppDelegate类
bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
<span style="white-space:pre"> </span>//修改主窗体名字
<span style="white-space:pre"> </span>glview = GLView::create("test");
<span style="white-space:pre"> </span>//重置窗体大小
<span style="white-space:pre"> </span>glview->setFrameSize(640, 480);
director->setOpenGLView(glview);
}
// 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.0 / 60);
// create a scene. it's an autorelease object
auto scene = HelloWorld::createScene();
// run
director->runWithScene(scene);
return true;
}
此函数是用来初始化程序的,这个函数和3.0以前也不一样了。3.0把GLView的一个对象放到导演类(Director)中。GLView是window框架设计的开始
运行程序时,大家发现左下角有几行数据,里面还有一些数字时不时改变一下,自己还不能控制是不是觉得很蛋疼,你终于不用蛋疼了,只需要把下面代码改一改
// turn on display FPS
director->setDisplayStats(true);
改成false,从此你的世界就清静了。
大家想说,我们怎么加内容在框架里面了?
================================================================华丽的分割线
恩,这集结束了,请看下集吧~~~~~~