Cocos2d-x 中setFrameSize 和 setDesignResolutionSize的一个问题
来源:互联网 发布:淘宝网怎么打不开了 编辑:程序博客网 时间:2024/06/01 12:50
最近开始搞cocos了,虽然开发起来看起来还挺简单的……但是感觉坑真是好多。。。
ok,现在讲一下我遇到的一个问题。在cocos2dx-3.x的版本中,增加了DesignResolutionSize的概念,这个东西可以使得自己设计的屏幕大小适应各种机器的屏幕。听起来还是很方便的。我开始想要模拟一个960*640的屏幕,但逻辑上的分辨率是480*320,于是我这么写了:
auto glview = director->getOpenGLView(); if(!glview) { glview = GLViewImpl::create("Cpp Empty Test"); director->setOpenGLView(glview); }// 设定分辨率glview->setDesignResolutionSize(480,320,ResolutionPolicy::EXACT_FIT);glview->setFrameSize(960,640);
结果出现了奇怪的问题,在我写touch事件的时候,坐标怎么搞都不对。搞了好长时间才弄好,晕了。实际上,问题就出在我刚才设定分辨率的部分,把代码改成这样就好了:
glview->setFrameSize(960,640);glview->setDesignResolutionSize(480,320,ResolutionPolicy::EXACT_FIT);
为什么会出现这样的问题呢。。。我们来看一下源码,首先是setDesignResolutionSize:
void GLView::setDesignResolutionSize(float width, float height, ResolutionPolicy resolutionPolicy){ CCASSERT(resolutionPolicy != ResolutionPolicy::UNKNOWN, "should set resolutionPolicy"); if (width == 0.0f || height == 0.0f) { return; } _designResolutionSize.setSize(width, height); _resolutionPolicy = resolutionPolicy; updateDesignResolutionSize(); }
看起来就是设定了一下我们传入的东西,然后update一下,点开updateDesignResolutionSize()看一下:
void GLView::updateDesignResolutionSize(){ if (_screenSize.width > 0 && _screenSize.height > 0 && _designResolutionSize.width > 0 && _designResolutionSize.height > 0) { _scaleX = (float)_screenSize.width / _designResolutionSize.width; _scaleY = (float)_screenSize.height / _designResolutionSize.height; if (_resolutionPolicy == ResolutionPolicy::NO_BORDER) { _scaleX = _scaleY = MAX(_scaleX, _scaleY); } else if (_resolutionPolicy == ResolutionPolicy::SHOW_ALL) { _scaleX = _scaleY = MIN(_scaleX, _scaleY); } else if ( _resolutionPolicy == ResolutionPolicy::FIXED_HEIGHT) { _scaleX = _scaleY; _designResolutionSize.width = ceilf(_screenSize.width/_scaleX); } else if ( _resolutionPolicy == ResolutionPolicy::FIXED_WIDTH) { _scaleY = _scaleX; _designResolutionSize.height = ceilf(_screenSize.height/_scaleY); } // calculate the rect of viewport float viewPortW = _designResolutionSize.width * _scaleX; float viewPortH = _designResolutionSize.height * _scaleY; _viewPortRect.setRect((_screenSize.width - viewPortW) / 2, (_screenSize.height - viewPortH) / 2, viewPortW, viewPortH); // reset director's member variables to fit visible rect auto director = Director::getInstance(); director->_winSizeInPoints = getDesignResolutionSize(); director->createStatsLabel(); director->setGLDefaultValues(); }}
看起来是根据设计分辨率和屏幕大小,然后根据所选策略,计算了缩放的因子,然后修改分辨率,那么这个问题大概也就能明白了,我们在设定屏幕大小之前就使用了它,自然会出现这个问题,因为之前的屏幕大小不是这样的,最后来看一下setFrameSize这个函数:
void GLView::setFrameSize(float width, float height){ _designResolutionSize = _screenSize = Size(width, height);}
这个函数把屏幕分辨率和设计分辨率都进行了设定,因此像最开始那么写,设计分辨率也变得不对了,好坑。。。人生艰难啊
0 0
- Cocos2d-x 中setFrameSize 和 setDesignResolutionSize的一个问题
- 关于 Cocos2d-x 中使用 setFrameSize 后 MenuItem 失效
- cocos2d-x多分辨率适配方案:setDesignResolutionSize(完美)
- cocos2d-x多分辨率适配方案:setDesignResolutionSize(完美)
- cocos2d-x多分辨率适配方案:setDesignResolutionSize使用
- cocos2d-x多分辨率适配方案:setDesignResolutionSize使用
- cocos2d-x多分辨率适配方案:setDesignResolutionSize使用
- cocos2d-x多分辨率适配方案:setDesignResolutionSize使用
- cocos2d-x多分辨率适配方案:setDesignResolutionSize详解
- 关于cocos2d-x中弧度和角度的转换问题
- Cocos2d-x使用中遇到的问题
- cocos2d-x 3.1中一个内存不释放问题
- Cocos2d-x-3.5 配合VS2013运用过程中新建文件出现的一个问题
- 创建一个quick-cocos2d-x工程和关于sublime text的插件QuickDev的一个小问题
- Cocos2d-x中问题labelWithString
- setDesignResolutionSize 到竖屏下面就缩放尺寸不对的问题
- cocos2d-x中各种诡异BUG的一个原因
- Cocos2d-X的一个示例
- c语言之一维数组
- (魔塔案例)写游戏步骤:
- Google团队技术体验:从容器和Kubernetes看现代云计算的发展轨迹
- 追赶法解线性方程组
- C/C++程序中致命的内存分配问题
- Cocos2d-x 中setFrameSize 和 setDesignResolutionSize的一个问题
- 向802.11ac迁徙 不得不说的好处(1)
- c++拷贝构造函数、赋值运算符=重载、深拷贝与浅拷贝
- PL/SQL语法之if结构
- [NOI2010]超级钢琴 解题报告
- 数据挖掘贝叶斯(Bayes)算法java实现 带注释详解
- Android Animations动画使用详解
- 【LightOJ】Assassin`s Creed (II) (缩点,传递闭包,二分图匹配,最小路径覆盖)
- java中关于时间的计算