自己动手写cocos2dx游戏引擎(四)——窗体GLView

自己动手写cocos2dx游戏引擎(四)——窗体GLView,第1张

概述上一节中我们获取到了Director对象。 通过这个对象我们可以获取到一个OpenGL的一个视图。 在定义GLview之前,我们需要定义一个常用几何头文件。 // Geometry.h #ifndef __GEMMETRY_H__#define __GEMMETRY_H__class Size { public: Size() {} Size(floa

上一节中我们获取到了Director对象。

通过这个对象我们可以获取到一个OpenGL的一个视图。

在定义GLvIEw之前,我们需要定义一个常用几何头文件。

//Geometry.h

#ifndef __GemmETRY_H__#define __GemmETRY_H__class Size {    public:        Size() {}        Size(float wIDth,float height) {            this->wIDth = wIDth;            this->height = height;        }           float wIDth;        float height;};class Vec2 {    public:        Vec2() {}        Vec2(float x,float y) {            this->x = x;            this->y = y;        }           float x;        float y;};class Rect {    public:        Rect() {}        Rect(float x,float y,float wIDth,float height) {            origin.x = x;            origin.y = y;            size.wIDth = wIDth;            size.height = height;        }           Vec2 origin;        Size  size;};#endif
这个头文件中定义的Size和Vec2,都是为定义矩形Rect服务的,分别表示长宽和原点。

//GLVIEw.h

#ifndef __GLVIEW_H__                                                                                                  #define __GLVIEW_H__                                                                                                                                                                                                                        #include "Geometry.h"                                                                                                                                                                                                                       class GLVIEw {                                                                                                            public:                                                                                                                   virtual ~GLVIEw() {}                                                                                                  virtual voID setVIEwname(const std::string& vIEwname) {                                                                   _vIEwname = vIEwname;                                                                                             }                                                                                                                     virtual voID setFrameSize(float wIDth,float height) {                                                                    _designResolutionSize = _screenSize = Size(wIDth,height);                                                        }                                                                                                                 protected:                                                                                                                std::string _vIEwname;                                                                                                Size _designResolutionSize;                                                                                           Size _screenSize;                                                                                             };                                                                                                                                                                                                                                          #endif

在GLVIEw中定义了三个属性,一个表示窗口的标题名称,两个尺寸都是窗口的大小,后面做屏幕大小适配的时候可以用到。

在APPDelegate中获取的并不是GLVIEw的对象,而是它的子类对象GLVIEwImpl

#ifndef __GLVIEWIMPL_H__                                                                                              #define __GLVIEWIMPL_H__                                                                                                                                                                                                                    #include "GLVIEw.h"                                                                                                                                                                                                                         class GLVIEwImpl: public GLVIEw {                                                                                         public:                                                                                                                   static GLVIEwImpl* createWithRect(const std::string& vIEwname,Rect rect);                                            bool initWithRect(const std::string& vIEwname,Rect rect);                                                    };                                                                                                                                                                                                                                          GLVIEwImpl* GLVIEwImpl::createWithRect(const std::string& vIEwname,Rect rect) {                                          GLVIEwImpl* ret = new GLVIEwImpl;                                                                                     if (ret && ret->initWithRect(vIEwname,rect)) {                                                                          // ret->autorelease;// 后面再看内存管理                                                                               return ret;                                                                                                       }                                                                                                                     if (ret != NulL) {                                                                                                        delete ret;                                                                                                           ret = NulL;                                                                                                       }                                                                                                                     return NulL;                                                                                                      }                                                                                                                                                                                                                                           bool GLVIEwImpl::initWithRect(const std::string& vIEwname,Rect rect) {                                                   setVIEwname(vIEwname);                                                                                                setFrameSize(rect.size.wIDth,rect.size.height);                                                                  }                                                                                                                                                                                                                                           #endif

其中涉及到了一个自动释放的功能,是关于内存管理的,后面再看内存管理的内容。

然后在AppDelegate中调用时,判断当前窗口是否存在,不存在就创建一个:

#ifndef __APP_DELEGATE_H__#define __APP_DELEGATE_H__#include "Application.h"#include "Director.h"#include "GLVIEw.h"#include "GLVIEwImpl.h"#include "Geometry.h"#include <iostream>class AppDelegate: private Application {    public:        virtual bool applicationDIDFinishLaunching() {            Director* director = Director::getInstance();            GLVIEw* glvIEw = director->getopenGLVIEw();            if (!glvIEw) {                glvIEw = GLVIEwImpl::createWithRect("Winname",Rect(0,960,640));                director->setopenGLVIEw(glvIEw);            }               return true;        }   };#endif


并在Director中将其设置为当前的视图窗口。
#ifndef __DIRECTOR_H__                                                                                                #define __DIRECTOR_H__                                                                                                                                                                                                                      #include "GLVIEw.h"                                                                                                                                                                                                                         class Director {                                                                                                          public:                                                                                                                   Director() {                                                                                                              _openGLVIEw = NulL;                                                                                               }                                                                                                                     virtual ~Director() {}                                                                                                static Director* getInstance();                                                                                       GLVIEw* getopenGLVIEw() { return _openGLVIEw; }                                                                       virtual bool init(){ return true; }                                                                                   voID setopenGLVIEw(GLVIEw *openGLVIEw) {                                                                                  if (_openGLVIEw != openGLVIEw) {                                                                                          if (_openGLVIEw) {                                                                                                        // 释放已经存在的视图对象,后面再看                                                                               }                                                                                                                     _openGLVIEw = openGLVIEw;                                                                                         }                                                                                                                 }                                                                                                                 private:                                                                                                                  GLVIEw *_openGLVIEw;                                                                                          };                                                                                                                                                                                                                                          class displaylinkDirector : public Director {                                                                             public:                                                                                                                                                                                                                                 };                                                                                                                                                                                                                                          static displaylinkDirector *s_SharedDirector = NulL;                                                                                                                                                                                        Director* Director::getInstance()                                                                                     {                                                                                                                         if (!s_SharedDirector) {                                                                                                  s_SharedDirector = new displaylinkDirector;                                                                           s_SharedDirector->init();                                                                                         }                                                                                                                     return s_SharedDirector;                                                                                          }                                                                                                                                                                                                                                           #endif

实际上到这一步就启动流程已经完成,如果在cocos2dx的项目中,就可以看到一个黑色的窗口,另外还有场景和消息循环没有加进来。


附代码:demo4

总结

以上是内存溢出为你收集整理的自己动手写cocos2dx游戏引擎(四)——窗体GLView全部内容,希望文章能够帮你解决自己动手写cocos2dx游戏引擎(四)——窗体GLView所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1075796.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存