重新学习COCOs2D-X版本2.2.3开始---第一篇引擎的游戏入口

前端之家收集整理的这篇文章主要介绍了重新学习COCOs2D-X版本2.2.3开始---第一篇引擎的游戏入口前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


你看很多视频,很多教程,很多人会告诉你,cocos2dx引擎的游戏入口都是从如下代码开始

  1. bool AppDelegate::applicationDidFinishLaunching() {
  2. // initialize director
  3. CCDirector* pDirector = CCDirector::sharedDirector();
  4. CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
  5.  
  6. pDirector->setOpenGLView(pEGLView);
  7. // turn on display FPS
  8. pDirector->setDisplayStats(true);
  9.  
  10. // set FPS. the default value is 1.0/60 if you don't call this
  11. pDirector->setAnimationInterval(1.0 / 60);
  12.  
  13. // create a scene. it's an autorelease object
  14. CCScene *pScene = HelloWorld::scene();
  15.  
  16. // run
  17. pDirector->runWithScene(pScene);
  18.  
  19. return true;
  20. }


但一个好奇心强大的人只知道这个是远远不够的,可能很少人会告诉你为什么是从这里开始呢。

现在跟着问题一步步回溯,我们就回到C++程序的起点,也就是mian函数

  1. int APIENTRY _tWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
  2. {
  3. UNREFERENCED_PARAMETER(hPrevInstance);
  4. UNREFERENCED_PARAMETER(lpCmdLine);
  5.  
  6. // create the application instance
  7. AppDelegate app;
  8. CCEGLView* eglView = CCEGLView::sharedOpenGLView();
  9. eglView->setViewName("Test");
  10. eglView->setFrameSize(480,320);
  11. return CCApplication::sharedApplication()->run();
  12. }

从该代码大家可以发现一开始顶一个一个AppDelegate app 之后都没见用过,有经验的人可能会发现这个类的名字,同过名字可以看出,这是设计模式之中的代理模式,并且也是C++种的多态特性。

这个问题我们先不管,就当做问号放在这,现在我们要关系的是 最后一句话,CCApplication::sharedApplication()->run();

我们对着run()一直按F12你就会路过

  1. int CCApplication::run()
  2. {
  3. //此处略去代码
  4.  
  5. // Initialize instance and cocos2d.
  6. if (!applicationDidFinishLaunching())
  7. {
  8. return 0;
  9. }
  10.  
  11. //此处略去代码
  12. }
接下来你在进入applicationDidFinishLaunching()你会发现如下
  1. bool AppDelegate::applicationDidFinishLaunching() {
  2. //此处略去代码
  3. return true;
  4. }

是不是很熟悉也就是游戏的入口,但是你会发现该函数是AppDelegate的成员,然而并不是CCApplication的成员,但为什么CCApplication可以直接调用呢,有人会说是继承的关系,没错他继承了CCApplicationProtocol,看看CCApplicationProtocol的定义

  1. class CC_DLL CCApplicationProtocol
  2. {
  3. public:
  4.  
  5. //略去一部分代码
  6. /**
  7. @brief Implement CCDirector and CCScene init code here.
  8. @return true Initialize success,app continue.
  9. @return false Initialize Failed,app terminate.
  10. */
  11. virtual bool applicationDidFinishLaunching() = 0;
  12.  
  13. };
  14.  
  15. // end of platform group
  16. /// @}
  17.  
  18. NS_CC_END
  19.  
  20. #endif // __CC_APPLICATION_PROTOCOL_H__

这里声明该方法。也就是说有这么一个继承体系

CCApplicationProtocol->CCApplication->AppDelegate

而且三个类中只有AppDelegate中的applicationDidFinishLaunching定义了,其他里面也只有声明而已。但是我们还没解决为什么

CCApplication::sharedApplication()->run();中里面的applicationDidFinishLaunching会是AppDelegate里面的,而不是CCApplication。

这里有一段CCApplication.cpp代码如下

  1. <pre name="code" class="cpp">CCApplication * CCApplication::sm_pSharedApplication = 0;
  2.  
  3. CCApplication::CCApplication()
  4. : m_hInstance(NULL),m_hAccelTable(NULL)
  5. {
  6. m_hInstance = GetModuleHandle(NULL);
  7. m_nAnimationInterval.QuadPart = 0;
  8. CC_ASSERT(! sm_pSharedApplication);
  9. sm_pSharedApplication = this;
  10. }


  1.  

这里面的sm_pSharedApplication = this,中的this是整个问题的关键,一般人直接看可能会觉得this指的是当前类的实例也就是CCApplication。其实并不是这样的,这里的this是指AppDelegate,所以最后调用的applicationDidFinishLaunching是AppDelegate中的

更贴切的来说是AppDelegate app这句话调用的时候,初始化了构造函数,进而调用父类的构造函数,所以此时的this的调用者本身,也就是AppDelegate

下列是为什么方便理解所写得简化版

  1. /*
  2. * CCApplicationProtocol.h
  3. *
  4. */
  5.  
  6. #ifndef SRC_CCAPPLICATIONPROTOCOL_H_
  7. #define SRC_CCAPPLICATIONPROTOCOL_H_
  8.  
  9. class CCApplicationProtocol {
  10. public:
  11. CCApplicationProtocol();
  12. virtual ~CCApplicationProtocol();
  13.  
  14. virtual bool applicationDidFinishLaunching()=0;
  15. };
  16.  
  17. #endif /* SRC_CCAPPLICATIONPROTOCOL_H_ */


  1. /*
  2. * CCApplication.h
  3. *
  4. */
  5.  
  6. #ifndef CCAPPLICATION_H_
  7. #define CCAPPLICATION_H_
  8.  
  9. #include "CCApplicationProtocol.h"
  10.  
  11. class CCApplication: public CCApplicationProtocol {
  12. public:
  13. CCApplication();
  14. virtual ~CCApplication();
  15.  
  16. int run();
  17.  
  18. static CCApplication * sharedApplication();
  19. static CCApplication * sm_pSharedApplication;
  20. };
  21.  
  22. #endif /* CCAPPLICATION_H_ */


  1. #include "CCApplication.h"
  2. #include "stddef.h"
  3.  
  4. CCApplication * CCApplication::sm_pSharedApplication = NULL;
  5.  
  6. CCApplication::CCApplication() {
  7. // TODO Auto-generated constructor stub
  8. sm_pSharedApplication = this;
  9. }
  10.  
  11. CCApplication::~CCApplication() {
  12. // TODO Auto-generated destructor stub
  13. }
  14.  
  15.  
  16. int CCApplication::run(){
  17. applicationDidFinishLaunching();
  18. return 1;
  19. }
  20.  
  21. CCApplication * CCApplication::sharedApplication()
  22. {
  23. if(sm_pSharedApplication != NULL)
  24. return sm_pSharedApplication;
  25. }



  1. /*
  2. * main.cpp
  3. *
  4. */
  5.  
  6.  
  7.  
  8. #include <iostream>
  9. #include "CCApplication.h"
  10. #include "AppDelegate.h"
  11. using namespace std;
  12. int main()
  13. {
  14. AppDelegate app;
  15.  
  16. //AppDelegate * pp = &app;
  17.  
  18. // CCApplication * p = &app;
  19. // p->applicationDidFinishLaunching();
  20.  
  21. return CCApplication::sharedApplication()->run();
  22. }


最后输出结果是Game start

猜你在找的Cocos2d-x相关文章