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

标签: cocos2d-x 游戏引擎
1615人阅读 评论(0) 收藏 举报
分类:

上一节中我们获取到了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, 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

查看评论

WIN32多线程程序设计学习笔记(第三章)

WIN32多线程程序设计学习笔记(第三章) 通过在上一章的学习,我学会使用GetExitCodeThread()这个函数来判断一个线程是否还在执行。通过这个函数,我就可以对付“某个线程必须在某个线程结...
  • chinani
  • chinani
  • 2004-03-29 10:41:00
  • 2060

【cocos2d-x 3.4】全屏显示窗口,隐藏标题栏

方法一 :首先,修改appDelegate::applicationDidFinishLaunching() 函数 auto director = Director::getInstance()...
  • linpeijieaini
  • linpeijieaini
  • 2015-12-30 17:12:42
  • 1290

cocos2dx3.3开发FlappyBird总结五:说说屏幕适配

官方网站中有一篇教程,是关于适配问题的,笔者也是通过阅读后,才了解一些,希望大家好好阅读,必定受益匪浅: http://cn.cocos2d-x.org/tutorial/show?id=2360...
  • woaifen3344
  • woaifen3344
  • 2015-03-20 10:30:56
  • 2269

cocos2dx项目显示窗口大小调整

在AppDelegate.cpp中,这一部分 bool AppDelegate::applicationDidFinishLaunching() {     // initialize d...
  • riririreach
  • riririreach
  • 2015-05-03 10:56:08
  • 1818

IOS 下cocos2dx3.X 启动流程:

IOS 下cocos2dx3.X 启动流程:   1、 入口函数: int main(int argc,char *argv[]) { NSAutoreleasePool * pool = ...
  • tianxiawuzhei
  • tianxiawuzhei
  • 2015-09-10 17:22:43
  • 2732

自己动手写游戏引擎一(Windows窗口框架)

 前言:以前做的东西写的代码现在回头看有些会觉得“凌乱”,这段刚好有时间, 想把以前的基础的东西整理一下,顺便写这个简单的DirectX入门教程。这个教程,我们只讲流程,关于一些细节的东西,概念,函数...
  • Ysong_Lee
  • Ysong_Lee
  • 2006-05-12 19:52:00
  • 3397

自己动手写cocos2dx游戏引擎(一)——引擎入口

在网易的第二个项目已经上线快两个月了,已经在着手做第三个项目了。 第一个项目是原生的app,使用的是cocos2dx2.2.4做的; 第二个项目是一个html5游戏,在预研的时间同时用了cocos2d...
  • xufeng0991
  • xufeng0991
  • 2015-12-14 20:31:10
  • 1524

GLView基本分析

GLView是cocos2d-x基于OpenGL ES的调用封装UI库。 OpenGL本身是跨平台的计算机图形实现API,在每个平台的具体实现是不一样。所以每次使用之前先要初始化,去设置平台相关的信息...
  • jingzhewangzi
  • jingzhewangzi
  • 2014-10-27 17:43:34
  • 3267

Cocos2dx 事件响应机制(1): GLView

CCGLView.cpp: 部分代码注释如下,由于作者是在windows下阅读的代码,因此这里的CCGLView的路径为【 cocos2d\cocos\platform\desktop\CCGLV...
  • XIANG__jiangsu
  • XIANG__jiangsu
  • 2017-05-25 17:13:54
  • 537

学习心得 CCEGLView::sharedOpenGLView()在3.x中的替换问题

今天在写项目的时候遇到了如下问题 解决方法如图中的代码
  • qq_30392565
  • qq_30392565
  • 2016-07-15 19:33:08
  • 1577
    个人资料
    持之以恒
    等级:
    访问量: 60万+
    积分: 9270
    排名: 2511
    关于我
    编程是一门艺术,态度决定高度,细节决定成败。