coco2dx-2.2.2 win32启动过程(opengl 和 窗口大小初始化部分) - 学习笔记 1
因为最近要做不同分辩率的适配,所于看了下引擎这方面的代码,记录一下当是学习笔记,cocos2d-x 版本 2.2.2 , 例子是samples\Cpp\TestCpp下的 TestCpp.
先看下main.cpp 里的_tWinMain()方法里,
// 创建对应平台下的一个 CCEGLView,这个是一和绘制有关的类(包括创建win32的窗口和触摸事件处理),基类是CCEGLViewProtocol,下面会说到里面的几个和屏幕绘制有关的成员
CCEGLView* eglView = CCEGLView::sharedOpenGLView();
eglView->setViewName("TestCpp");
eglView->setFrameSize(960, 640); //看下面
void CCEGLView::setFrameSize(float width, float height)
{
// 初始化 CCEGLViewProtocol 基类的 m_obDesignResolutionSize = m_obScreenSize = CCSizeMake(width, height),设计分辨率和屏幕大小,
CCEGLViewProtocol::setFrameSize(width, height); resize(width, height); // 重新调整win32 窗口大小
centerWindow();
}
接着是程序加载完成后 applicationDidFinishLaunching()
bool AppDelegate::applicationDidFinishLaunching()
{
// initialize director
CCDirector *pDirector = CCDirector::sharedDirector();
pDirector->setOpenGLView(CCEGLView::sharedOpenGLView()); // 把上面创建eglView设置给 Director ,里面初始化 Director相关变量,看下面代码片段 }
void CCDirector::setOpenGLView(CCEGLView *pobOpenGLView)
{
//代码删减.. // 函数 CCSize CCDirector::getWinSize(void) 里返回的值,这里看到的是 GLView 里的DesignResolutionSize,后面的设置屏幕适配策略时还会修改这个值
m_obWinSizeInPoints = m_pobOpenGLView>getDesignResolutionSize(); createStatsLabel(); if (m_pobOpenGLView) {
setGLDefaultValues(); // 下一步看下这里,setProjection(m_eProjection) - > 调用 EGLView里的 setViewPortInPoints() 设置openGL 视口大小
} CHECK_GL_ERROR_DEBUG();
//触摸事件委托
m_pobOpenGLView->setTouchDelegate(m_pTouchDispatcher);
m_pTouchDispatcher->setDispatchEvents(true);
}
CCDirector::setProjection()
void CCDirector::setProjection(ccDirectorProjection kProjection)
{
CCSize size = m_obWinSizeInPoints; setViewport(); //m_pobOpenGLView->setViewPortInPoints(0, 0, m_obWinSizeInPoints.width, m_obWinSizeInPoints.height);下面看下现实
//代码有删,这时只给出是 kCCDirectorProjection3D
case kCCDirectorProjection3D:
{
float zeye = this->getZEye(); kmMat4 matrixPerspective, matrixLookup; kmGLMatrixMode(KM_GL_PROJECTION);
kmGLLoadIdentity();
// issue #1334
kmMat4PerspectiveProjection( &matrixPerspective, , (GLfloat)size.width/size.height, 0.1f, zeye*);
// kmMat4PerspectiveProjection( &matrixPerspective, 60, (GLfloat)size.width/size.height, 0.1f, 1500); kmGLMultMatrix(&matrixPerspective); kmGLMatrixMode(KM_GL_MODELVIEW);
kmGLLoadIdentity();
kmVec3 eye, center, up;
kmVec3Fill( &eye, size.width/, size.height/, zeye );
kmVec3Fill( ¢er, size.width/, size.height/, 0.0f );
kmVec3Fill( &up, 0.0f, 1.0f, 0.0f);
kmMat4LookAt(&matrixLookup, &eye, ¢er, &up);
kmGLMultMatrix(&matrixLookup);
}
}
void CCEGLView::setViewPortInPoints(float x , float y , float w , float h)
{
//m_fFrameZoomFactor 默认为1,m_fScaleX初化为1,在 setDesignResolutionSize 时根据不同适配策略而改变,m_obViewPortRect在setDesignResolutionSize时设置。x,y 为0.
glViewport((GLint)(x * m_fScaleX * m_fFrameZoomFactor + m_obViewPortRect.origin.x * m_fFrameZoomFactor), (GLint)(y * m_fScaleY * m_fFrameZoomFactor + m_obViewPortRect.origin.y * m_fFrameZoomFactor), (GLsizei)(w * m_fScaleX * m_fFrameZoomFactor), (GLsizei)(h * m_fScaleY * m_fFrameZoomFactor)); }
下面来看下
void CCEGLViewProtocol::setDesignResolutionSize()
if (width == 0.0f || height == 0.0f)
{
return;
} m_obDesignResolutionSize.setSize(width, height); //记录新的设计分辨率
//计算缩放比率,下面根据适配策略不同来确定这个值
m_fScaleX = (float)m_obScreenSize.width / m_obDesignResolutionSize.width;
m_fScaleY = (float)m_obScreenSize.height / m_obDesignResolutionSize.height; if (resolutionPolicy == kResolutionNoBorder)
{
m_fScaleX = m_fScaleY = MAX(m_fScaleX, m_fScaleY);
} if (resolutionPolicy == kResolutionShowAll)
{
m_fScaleX = m_fScaleY = MIN(m_fScaleX, m_fScaleY);
} if ( resolutionPolicy == kResolutionFixedHeight) {
m_fScaleX = m_fScaleY;
m_obDesignResolutionSize.width = ceilf(m_obScreenSize.width/m_fScaleX);
} if ( resolutionPolicy == kResolutionFixedWidth) {
m_fScaleY = m_fScaleX;
m_obDesignResolutionSize.height = ceilf(m_obScreenSize.height/m_fScaleY);
} // calculate the rect of viewport 根据确定的缩放比率计算viewPort ,(在 CCEGLView::setViewPortInPoints()里有用到)
float viewPortW = m_obDesignResolutionSize.width * m_fScaleX;
float viewPortH = m_obDesignResolutionSize.height * m_fScaleY; m_obViewPortRect.setRect((m_obScreenSize.width - viewPortW) / , (m_obScreenSize.height - viewPortH) / , viewPortW, viewPortH); m_eResolutionPolicy = resolutionPolicy; // reset director's member variables to fit visible rect
CCDirector::sharedDirector()->m_obWinSizeInPoints = getDesignResolutionSize(); //更新 CCDirector::m_obWinSizeInPoints
CCDirector::sharedDirector()->createStatsLabel();
CCDirector::sharedDirector()->setGLDefaultValues(); //上面有说到,会调用CCDirector::setProjection(),重新设置视口
}
这里说一下CCSize CCDirector::getWinSize(void)
CCSize CCDirector::getWinSize(void)
{
return m_obWinSizeInPoints;//这里返回的其实主是 CCEGLViewProtocol::m_obDesignResolutionSize
}
还有两个和适配有关的
CCSize CCDirector::getVisibleSize()
{
if (m_pobOpenGLView)
{
return m_pobOpenGLView->getVisibleSize();
}
else
{
return CCSizeZero;
}
} CCPoint CCDirector::getVisibleOrigin()
{
if (m_pobOpenGLView)
{
return m_pobOpenGLView->getVisibleOrigin();
}
else
{
return CCPointZero;
}
}
//下面才是真实调用
真实调用
//这里看,只对适配策略是kResolutionNoBorder特效处理
CCSize CCEGLViewProtocol::getVisibleSize() const
{
if (m_eResolutionPolicy == kResolutionNoBorder)
{
return CCSizeMake(m_obScreenSize.width/m_fScaleX, m_obScreenSize.height/m_fScaleY);
}
else
{
return m_obDesignResolutionSize;
}
} CCPoint CCEGLViewProtocol::getVisibleOrigin() const
{
if (m_eResolutionPolicy == kResolutionNoBorder)
{
return CCPointMake((m_obDesignResolutionSize.width - m_obScreenSize.width/m_fScaleX)/,
(m_obDesignResolutionSize.height - m_obScreenSize.height/m_fScaleY)/);
}
else
{
return CCPointZero;
}
}
写完后发现很乱,,反正是写给自己看的笔记就懒得去修改了,如果你也看到了,发现不对的地方请指正。。- -
coco2dx-2.2.2 win32启动过程(opengl 和 窗口大小初始化部分) - 学习笔记 1的更多相关文章
- laravel的启动过程---摘自网络博客个人学习之用
如果没有使用过类似Yii之类的框架,直接去看laravel,会有点一脸迷糊的感觉,起码我是这样的.laravel的启动过程,也是laravel的核心,对这个过程有一个了解,有助于得心应手的使用框架,希 ...
- nor flash与nand flash启动的简单比较--APPLE的ARM学习笔记一
2010-10-08 22:26:00 A,nor flash与nand flash的一些区别 1)接口区别: NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来. NAND Fla ...
- OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)
1. 先上代码 头文件glCommon.h #include <GL/glew.h> #include <GL/GL.h> #include <GL/GLU.h> ...
- springboot启动过程(1)-初始化
1 springboot启动时,只需要调用一个类前面加了@SpringBootApplication的main函数,执行SpringApplication.run(DemoApplication. ...
- OpenGL ES 2.0 渲染管线 学习笔记
图中展示整个OpenGL ES 2.0可编程管线 图中Vertex Shader和Fragment Shader 是可编程管线: Vertex Array/Buffer objects 顶点数据来源, ...
- Flask学习-Flask app启动过程
因为0.1版本整体代码大概只有350行,比较简单.所以本篇文章会以Flask 0.1版本源码为基础进行剖析Flask应用的启动过程. Flask参考资料flask,官网有一个最简单app: from ...
- redis(一)内部机制的介绍和启动过程
redis(一)内部机制的介绍和启动过程 redis的基本介绍 redis服务端 redis客户端 redis的持久化 redis中的文件事件和时间时间 redis的启动过程 redis的基本介绍 r ...
- MySQL启动过程详解三:Innodb存储引擎的启动
Innodb启动过程如下: 1. 初始化innobase_hton,它是一个handlerton类型的指针,以便在server层能够调用存储引擎的接口. 2. Innodb相关参数的检车和初始化,包括 ...
- sql学习笔记(18)-----------数据库创建过程
手动创建数据库的步骤: 第一步:决定数据库实例的SID 数据库实例的SID用来将当前实例和以后可能创建的实例进行区分 % setenv ORACLE_SID mynewdb 第二步:建立数 ...
随机推荐
- CentOs7安装JDK/Tomcat/Git/Gradle
安装Jdk: wget http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/j ...
- 51nod加农炮
这道题维护一下前缀最大值然后二分答案就好了哇 233 #include<cstdio> #include<cstring> #include<algorithm> ...
- GitLab 密码重设
内容全部来自: CSDN bisal GitLab 密码重设方法 假设注册邮箱为: abc@test.com 步骤 1) 登录 git 服务器 2) 执行: gitlab-rails console ...
- 通过 CLI 搭建 ghost
参考: ghost 官网 系统架构说明 架构 架构说明 本实践将 web 接入, nodejs 服务, 数据库分离, 适合生产环境场景. nginx 接入请求, 反向代理后端 nodejs 服务 no ...
- 【洛谷 P1645】 序列 (差分约束)
题目链接 差分约束. 设\(s[i]\)表示前\(i\)个位置有多少个数,那么对于一个限制条件\((L,R,C)\),显然有 \[s[R]-s[L-1]>=C\] 于是连一条\(L-1\)到\( ...
- [bzoj1692][Usaco2007 Dec]队列变换——贪心+后缀数组
Brief Description 给定一个数列,您每次可以把数列的最前面的数或最后面的数移动到新数列的开头,使得新数列字典序最小.输出这个新序列. Algorithm Design 首先我们可以使用 ...
- node导入导出的问题
node的每一个文件,都是一个域,那么里面所有的变量都不允许被外界引用,除非导出去.要使用外界的变量,也必须使用导入的方式导入进来. import 变量名 from '文件地址'//css可以直接导入 ...
- win8优化
微软发布win8系统之后受到很多电脑爱好者的关注,都想去尝试体验win8操作系统,对电脑系统优化和系统性能提高一直是我们所追求的.而很多用户都会选择第三方软件对系统进行相关优化,其实我们可以手动对电脑 ...
- MySQL 之 foreign key
前段回顾 create table 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] ); #解释: 类型:使用限制字段必须 ...
- 【 Linux 】lvs-dr模型实现HA,后端Nginx、PHP、MySQL分离 搭建wordpress站点
要求: 1. wordpress程序通过nfs共享给各个realserver 2. 后端realserver中的nginx和php分离 网络结构图: 环境说明: OS:centos6 ...