本文主要是介绍Cocos2d-x自适应Android屏幕分辨,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
ndroid下分辨率太多,不太可能为每种分辨率做一套资源,目前一般来说比较流行的是320*480, 800*400, 854*400。当然现在720P的也出来了,但至少目前不是主流机型^_^.
对于不支持的分辨率,我希望的是能够按照屏幕大小按比例缩放,即有了下面的代码。
1:ViewAutoScale
写了一个ViewAutoScale函数,如下:
#include "ViewAutoScale.h"
USING_NS_CC;
bool IsMatchDisplay(int w, int h, CCSize& size )
{
return (w==size.width && h==size.height) || (h==size.width && w==size.height);
}
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
int ViewAutoScale(cocos2d::CCEGLView* view,
void* title,
int width,
int height,
cocos2d::CCSize* supportDisplay,
int displays,
int defaultWidth,
int defaultHeight)
{
if(view == NULL)
{
return -1;
}
for (int i=0; i < displays; i++)
{
if (IsMatchDisplay(width, height, supportDisplay[i]))
{
view->Create((LPCTSTR)title, width, height);
return i+1;
}
}
view->Create((LPCTSTR)title, defaultWidth, defaultHeight);
view->setScreenScale(min((float)width/ defaultWidth, (float)height/ defaultHeight));
view->resize(width, height);
view->centerWindow();
return 0;
}
#endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
int ViewAutoScale(cocos2d::CCEGLView* view,
void* title,
int width,
int height,
cocos2d::CCSize* supportDisplay,
int displays,
int defaultWidth,
int defaultHeight)
{
if(view == NULL)
{
return -1;
}
for (int i=0; i < displays; i++)
{
if (IsMatchDisplay(width, height, supportDisplay[i]))
{
return i+1;
}
}
view->create(defaultWidth, defaultHeight);
return 0;
}
#endif
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
int ViewAutoScale(cocos2d::CCEGLView* view,
void* title,
int width,
int height,
cocos2d::CCSize* supportDisplay,
int displays,
int defaultWidth,
int defaultHeight)
{
return 0;
}
#endif
2:使用方法
(1) windows
修改AppDelegate.cpp文件:
bool AppDelegate::initInstance()
{
bool bRet = false;
do
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
CCSize sSupportDisplay[]={CCSize(480, 320), CCSize(1024, 768)};
// Initialize OpenGLView instance, that release by CCDirector when application terminate.
// The HelloWorld is designed as HVGA.
CCEGLView * pMainWnd = new CCEGLView();
CC_BREAK_IF(! pMainWnd);
if (ViewAutoScale(pMainWnd, TEXT("Pyramid"),
g_winWidth,
g_winHeight,
sSupportDisplay,
sizeof(sSupportDisplay)/sizeof(CCSize),
480, 320) < 0)
{
return false;
}
#endif // CC_PLATFORM_WIN32
其中g_winWidth和g_winHeight为参数传递进来的窗口大小,这样在windows上可任意设定窗口大小,改成对应值即可。
(2) Android
修改jni/helloworld/main.cpp文件:
void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thiz, jint w, jint h)
{
cocos2d::CCSize sSupportDisplay[]={cocos2d::CCSize(480, 320)};
if (!cocos2d::CCDirector::sharedDirector()->getOpenGLView())
{
cocos2d::CCEGLView *view = &cocos2d::CCEGLView::sharedOpenGLView();
view->setFrameWidthAndHeight(w, h);
// if you want to run in WVGA with HVGA resource, set it
ViewAutoScale(view,
NULL,
w,
h,
sSupportDisplay,
sizeof(sSupportDisplay)/sizeof(CCSize),
480, 320);
....
3:说明
(1) ViewAutoScale里我偷懒了,发现没有找到匹配分辨率时,就选择默认的分辨率。稍微改一下可以匹配最接近的分辨率
(2)目前实现的是等比缩放,资源按照目前屏幕大小适配。如果想实现铺满整个屏幕,修改如下:
windows下直接修改ViewAutoScale:
将view->setScreenScale(min((float)width/ defaultWidth, (float)height/ defaultHeight)); 修改为:
view->setScreenScale(max((float)width/ defaultWidth, (float)height/ defaultHeight));
android 下需要修改cocos2dx代码,在文件platform\android\CCEGLView_android.cpp 的void CCEGLView::create(int width, int height)中,修改如下:
// calculate the factor and the rect of viewport
m_fScreenScaleFactor = MAX((float)m_sSizeInPixel.width / m_sSizeInPoint.width,
(float)m_sSizeInPixel.height / m_sSizeInPoint.height);
这篇关于Cocos2d-x自适应Android屏幕分辨的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!