GLView是cocos2d-x基于OpenGL ES的调用封装UI库。

OpenGL本身是跨平台的计算机图形实现API,在每一个平台的详细实现是不一样。所以每次使用之前先要初始化,去设置平台相关的信息。以下以win32的平台实现去分析:首先进入win32程序实现的入口文件:

  1. bool AppDelegate::applicationDidFinishLaunching() {
  2. // initialize director
  3. auto director = Director::getInstance();
  4. auto glview = director->getOpenGLView();
  5. if(!glview) {
  6. glview = GLView::create("My Game"); //创建GL对象
  7. director->setOpenGLView(glview);
  8. }
  9.  
  10. // turn on display FPS
  11. director->setDisplayStats(true);
  12.  
  13. // set FPS. the default value is 1.0/60 if you don't call this
  14. director->setAnimationInterval(1.0 / 60);
  15.  
  16. // create a scene. it's an autorelease object
  17. auto scene = HelloWorld::createScene();
  18.  
  19. // run
  20. director->runWithScene(scene);
  21.  
  22. return true;
  23. }
  1. GLView* GLView::create(const std::string& viewName)
  2. {
  3. auto ret = new GLView;
  4. if(ret && ret->initWithRect(viewName, Rect(0, 0, 960, 640), 1)) {//3.2之后。win32的窗体应该实在这里改,Android和其它平台也有相似的文件文件
  5. ret->autorelease();
  6. return ret;
  7. }
  8.  
  9. return nullptr;
  10. }

设置GLView的初始化信息,比較有意思:

  1. bool GLView::initWithRect(const std::string& viewName, Rect rect, float frameZoomFactor)
  2. {
  3. setViewName(viewName);//窗体名字
  4.  
  5. _frameZoomFactor = frameZoomFactor;//基础深度值。即Z轴
  6.  
  7. glfwWindowHint(GLFW_RESIZABLE,GL_FALSE); //这句我也没看懂,求教
  1. win32注冊窗体,这个就是真正的窗体。为什么之前说cocos2d的程序是单窗体单线程,这里是就明确了,我们仅仅使用单例Director,永远仅仅管理一个窗体
  1.  
  1. _mainWindow = glfwCreateWindow(rect.size.width * _frameZoomFactor,
  2. rect.size.height * _frameZoomFactor,
  3. _viewName.c_str(),
  4. _monitor,
  5. nullptr);
  6. glfwMakeContextCurrent(_mainWindow);//设置为当前画布(Contex也有翻译为上下文、文本)
  7.  
  8. glfwSetMouseButtonCallback(_mainWindow, GLFWEventHandler::onGLFWMouseCallBack);//鼠标的相关事件监听,在移动平台则应该是Touch began end 、focus(切换屏幕或应用会触发)
  9. glfwSetCursorPosCallback(_mainWindow, GLFWEventHandler::onGLFWMouseMoveCallBack);//拖动回调注冊
  10. glfwSetScrollCallback(_mainWindow, GLFWEventHandler::onGLFWMouseScrollCallback);//滚屏事件注冊,平时我们拖动TableView时就是由这个进行直接回调
  11. glfwSetCharCallback(_mainWindow, GLFWEventHandler::onGLFWCharCallback);//字符输入事件回调
  1. </pre><pre code_snippet_id="498510" snippet_file_name="blog_20141027_8_222555" name="code" class="cpp"><pre name="code" class="cpp">/*
  1. The key functions deal with physical keys, with layout independent
  2.  *  [key tokens](@ref keys) named after their values in the standard US keyboard
  3.  *  layout.  If you want to input text, use the
  4.  *  [character callback](@ref glfwSetCharCallback) instead.
  5. glfwSetWindowPosCallback(_mainWindow, GLFWEventHandler::onGLFWWindowPosCallback);
  6. glfwSetFramebufferSizeCallback(_mainWindow, GLFWEventHandler::onGLFWframebuffersize);
  7. glfwSetWindowSizeCallback(_mainWindow, GLFWEventHandler::onGLFWWindowSizeFunCallback);
  8.  
  9. setFrameSize(rect.size.width, rect.size.height);
  1. */
  1. /*以上是原Api声明,实际意思:全部的物理键盘按键操作都会由这个触发,可是虚拟键盘的实现我还不清楚,应该是通过前面的MouseButton来之后调用CharCallback实现*/

glfwSetKeyCallback(_mainWindow, GLFWEventHandler::onGLFWKeyCallback);

  1.  
  1. glfwSetWindowPosCallback(_mainWindow, GLFWEventHandler::onGLFWWindowPosCallback); //屏幕拖动事件回调。在wp8和相关平台实现才须要
  2.     glfwSetFramebufferSizeCallback(_mainWindow, GLFWEventHandler::onGLFWframebuffersize);//帧缓存大小设置?谁知道细节
  3.     glfwSetWindowSizeCallback(_mainWindow, GLFWEventHandler::onGLFWWindowSizeFunCallback); //窗体大小的设置眼下在移动设备上是没有这个相关接口,win32和mac才有
  1. // check OpenGL version at first
  2. const GLubyte* glVersion = glGetString(GL_VERSION);
  3.  
  4. if ( utils::atof((const char*)glVersion) < 1.5 ) //opengl1.5以上兼容
  5. {
  6. char strComplain[256] = {0};
  7. sprintf(strComplain,
  8. "OpenGL 1.5 or higher is required (your version is %s). Please upgrade the driver of your video card.",
  9. glVersion);
  10. MessageBox(strComplain, "OpenGL version too old");
  11. return false;
  12. }
  13.  
  14. initGlew();
  15.  
  16. // Enable point size by default.
  17. glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
  18.  
  19. return true;
  20. }

跳转

  1. // helper
  2. bool GLView::initGlew()
  3. {
  4. #if (CC_TARGET_PLATFORM != CC_PLATFORM_MAC)
  5. GLenum GlewInitResult = glewInit();//OpenGL库固定初始化函数。
  6.  
  7. if (GLEW_OK != GlewInitResult)
  8. {
  9. MessageBox((char *)glewGetErrorString(GlewInitResult), "OpenGL error");
  10. return false;
  11. }
  12.  
  13. if (GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader)
  14. {
  15. log("Ready for GLSL");
  16. }
  17. else
  18. {
  19. log("Not totally ready :(");
  20. }
  21.  
  22. if (glewIsSupported("GL_VERSION_2_0"))
  23. {
  24. log("Ready for OpenGL 2.0");
  25. }
  26. else
  27. {
  28. log("OpenGL 2.0 not supported");
  29. }
  30.  
  31. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
  32. if(glew_dynamic_binding() == false) //OpenGL是一个单独的状态机。须要使用window OpenGL的api去完毕硬件绑定。
  33.  
  34. 用设计模式的思想能够当做OpenGL是个策略模式中的策略。而window OpenGL则是提供策略支持详细实现。<span style="font-family: Arial, Helvetica, sans-serif;">window OpenGL</span><span style="font-family: Arial, Helvetica, sans-serif;">同一时候的代理(window os才是真正去管理硬件的总代理) wgl的细节我也不熟。就此搁置</span>
  35. {
  36. MessageBox("No OpenGL framebuffer support. Please upgrade the driver of your video card.", "OpenGL error");
  37. return false;
  38. }
  39. #endif
  40.  
  41. #endif // (CC_TARGET_PLATFORM != CC_PLATFORM_MAC)
  42.  
  43. return true;
  44. }
  1. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
  2. static bool glew_dynamic_binding()
  3. {
  4. const char *gl_extensions = (const char*)glGetString(GL_EXTENSIONS);
  5.  
  6. // If the current opengl driver doesn't have framebuffers methods, check if an extension exists
  7. if (glGenFramebuffers == nullptr)
  8. {
  9. log("OpenGL: glGenFramebuffers is nullptr, try to detect an extension");
  10. if (strstr(gl_extensions, "ARB_framebuffer_object"))
  11. {
  12. log("OpenGL: ARB_framebuffer_object is supported");
  13.  
  14. glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) wglGetProcAddress("glIsRenderbuffer");
  15. glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) wglGetProcAddress("glBindRenderbuffer");
  16. glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) wglGetProcAddress("glDeleteRenderbuffers");
  17. glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) wglGetProcAddress("glGenRenderbuffers");
  18. glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) wglGetProcAddress("glRenderbufferStorage");
  19. glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) wglGetProcAddress("glGetRenderbufferParameteriv");
  20. glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) wglGetProcAddress("glIsFramebuffer");
  21. glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) wglGetProcAddress("glBindFramebuffer");
  22. glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) wglGetProcAddress("glDeleteFramebuffers");
  23. glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) wglGetProcAddress("glGenFramebuffers");
  24. glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) wglGetProcAddress("glCheckFramebufferStatus");
  25. glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) wglGetProcAddress("glFramebufferTexture1D");
  26. glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) wglGetProcAddress("glFramebufferTexture2D");
  27. glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) wglGetProcAddress("glFramebufferTexture3D");
  28. glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) wglGetProcAddress("glFramebufferRenderbuffer");
  29. glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) wglGetProcAddress("glGetFramebufferAttachmentParameteriv");
  30. glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) wglGetProcAddress("glGenerateMipmap");
  31. }
  32. else
  33. if (strstr(gl_extensions, "EXT_framebuffer_object"))
  34. {
  35. log("OpenGL: EXT_framebuffer_object is supported");
  36. glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) wglGetProcAddress("glIsRenderbufferEXT");
  37. glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) wglGetProcAddress("glBindRenderbufferEXT");
  38. glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) wglGetProcAddress("glDeleteRenderbuffersEXT");
  39. glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) wglGetProcAddress("glGenRenderbuffersEXT");
  40. glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) wglGetProcAddress("glRenderbufferStorageEXT");
  41. glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) wglGetProcAddress("glGetRenderbufferParameterivEXT");
  42. glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) wglGetProcAddress("glIsFramebufferEXT");
  43. glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) wglGetProcAddress("glBindFramebufferEXT");
  44. glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) wglGetProcAddress("glDeleteFramebuffersEXT");
  45. glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) wglGetProcAddress("glGenFramebuffersEXT");
  46. glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) wglGetProcAddress("glCheckFramebufferStatusEXT");
  47. glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) wglGetProcAddress("glFramebufferTexture1DEXT");
  48. glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) wglGetProcAddress("glFramebufferTexture2DEXT");
  49. glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) wglGetProcAddress("glFramebufferTexture3DEXT");
  50. glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) wglGetProcAddress("glFramebufferRenderbufferEXT");
  51. glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) wglGetProcAddress("glGetFramebufferAttachmentParameterivEXT");
  52. glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) wglGetProcAddress("glGenerateMipmapEXT");
  53. }
  54. else
  55. {
  56. log("OpenGL: No framebuffers extension is supported");
  57. log("OpenGL: Any call to Fbo will crash!");
  58. return false;
  59. }
  60. }
  61. return true;
  62. }
  63. #endif

GLView基本分析的更多相关文章

  1. Cocos2d-X3.0 刨根问底(三)----- Director类源码分析

    上一章我们完整的跟了一遍HelloWorld的源码,了解了Cocos2d-x的启动流程.其中Director这个类贯穿了整个Application程序,这章随小鱼一起把这个类分析透彻. 小鱼的阅读源码 ...

  2. cocos android分析

    来自:http://xiebaochun.github.io/ cocos2d-x Android环境搭建 cocos2d-x环境搭建比較简单,可是小问题还是不少,我尽量都涵盖的全面一些. 下载软件  ...

  3. cocos2D(三)---- 第一cocos2d的程序代码分析

    在第一讲中已经新建了第一个cocos2d程序,执行效果例如以下: 在这讲中我们来分析下里面的代码,了解cocos2d的工作原理,看看屏幕上的这个"Hello World"是怎样显示 ...

  4. 4、Cocos2dx 3.0三,找一个小游戏开发Hello World 分析

    尊重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27186557 Hello World 分析 打开新 ...

  5. CardboardSDK-iOS 源码简单分析

    该项目地址: 地址 克隆地址为 https://github.com/rsanchezsaez/CardboardSDK-iOS.git 目前如果想在iOS设备上实现双目VR的功能,Google 已经 ...

  6. Cocos2dx开发之运行与渲染流程分析

    学习Cocos2dx,我们都知道程序是由 AppDelegate 的方法 applicationDidFinishLaunching 开始,在其中做些必要的初始化,并创建运行第一个 CCScene 即 ...

  7. cocos2d-x学习之路(二)——分析AppDelegate和HelloWorldScene文件

    这里我们来看一下cocos自动给我们生成的工程里有些什么东西,并且分析一下这些代码的用途,来为我们以后编写cocos程序铺下基础. 这里我建议看我这份随笔的看官先看看cocos官网的快速入门手册,不然 ...

  8. 4、Cocos2dx 3.0游戏开发找小三之Hello World 分析

    尊重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27186557 Hello World 分析 打开新 ...

  9. 三、第一个cocos2d程序的代码分析

    http://blog.csdn.net/q199109106q/article/details/8591706 在第一讲中已经新建了第一个cocos2d程序,运行效果如下: 在这讲中我们来分析下里面 ...

随机推荐

  1. css书写顺序和常用命名推荐

    写代码的时候有一个好的规范和顺序能够帮你节省很多时间.下文将推荐相关CSS书写顺序和规范的一些方法.这个文档将会整理进前端规范文档中,如果你有更好的意见,不妨留言告知我们. CSS书写顺序 该代码来自 ...

  2. Nginx+PostgreSQL+Django+UWSGI搭建

    最近因为项目上的需要开始大量使用nginx,因此也想趁机将以前常用的django+apache的架构换成django+nginx.常见的 django webapp 部署方式采用FCGI 或 WSGI ...

  3. HTTP请求大全

    1xx - 信息提示这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应.100 - 继续101 - 切换协议 2xx - 成功这类状态代码表明服务器成功地接受了客 ...

  4. windows环境中mysql忘记root密码的解决办法

    原文地址:http://www.cnblogs.com/linuxnotes/archive/2013/03/09/2951101.html windows下重置Mysql Root密码的方法mysq ...

  5. linux中读写锁的rwlock介绍-nk_ysg-ChinaUnix博客

    linux中读写锁的rwlock介绍-nk_ysg-ChinaUnix博客 linux中读写锁的rwlock介绍 2013-02-26 13:59:35 分类: C/C++   http://yaro ...

  6. C#深复制和浅复制

    本文在于巩固基础 我们来看看什么是深复制.浅复制: C#中对于数据的复制机制虽然简单但是容易让人误解.C#数据类型大体分为值类型(value type)与引用类型(reference type).对于 ...

  7. 一行统计shell

    cat count.log | awk '{print $7}' | awk '{if ($1 == "-") empty++ }END {print NR, empty, emp ...

  8. Hive入门之UDFS函数

    一.UDFS函数介绍 1. 基本UDF (1)SHOWFUNCTIONS:这个用来熟悉未知函数. DESCRIBE FUNCTION<function_name>; (2)A IS NUL ...

  9. LINQ to Entity Framework 操作符(转)

    在开始了解LINQ to Entities之前,需要先对.NET Framework 3.5版本后对C#语言的几个扩展特性做一些阐释,这有助于我们更容易.更深刻的理解LINQ to Entities技 ...

  10. 关于gradle /Users/xxxx/Documents/workspace/fontmanager/.gradle/2.2.1/taskArtifacts/cache.properties (No such file or directory)报错办法

    转自:http://www.cnblogs.com/raomengyang/p/4367620.html   Android Studio报错: What went wrong: java.io.Fi ...