上一节中我们获取到了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
#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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)