cocos2dx安卓自适应屏幕

Android下分辨率太多,不太可能为每种分辨率做一套资源,目前一般来说比较流行的是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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
參考了一下NeHe 的教程, 在 cocos2d-x 2.0 上可以做點小手腳在 Windows 上全屏顯示! 參考了一下NeHe 的教程, 在 cocos2d-x 2.0 上可以做點小手腳在 Windows 上全屏顯示! 主要修改兩個檔案: CCEGLView.h CCEGLView.cpp 它們在工程里的位置是 libcocos2d->platform->win32 先打開 CCEGLView.h 在 public: 底下加上一個新功能: void setFullScreen(bool flag); 另外在 private: 里加上一個新變數: bool m_bFullScreen; 接下來是 CCEGLView.cpp: 在 Constructor 加上 m_bFullScreen 的初始值: CCEGLView::CCEGLView() : m_bCaptured(false) , m_hWnd(NULL) , m_hDC(NULL) , m_hRC(NULL) , m_lpfnAccelerometerKeyHook(NULL) , m_bFullScreen(false) 再加上我們的 setFullScreen(): void CCEGLView::setFullScreen(bool flag) { m_bFullScreen = flag; } 然後在 Create() 里, 把CreateWindowEx() 那段改成下邊這樣: /////////////// FULLSCREEN HACK - BEGIN DWORD dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style DWORD dwStyle = WS_CAPTION | WS_POPUPWINDOW | WS_MINIMIZEBOX; // Window Style if (m_bFullScreen) { DEVMODE dmScreenSettings; // Device Mode memset(&dmScreenSettings;,0,sizeof(dmScreenSettings)); // Makes Sure Memory's Cleared dmScreenSettings.dmSize=sizeof(dmScreenSettings); // Size Of The Devmode Structure dmScreenSettings.dmPelsWidth = w; // Selected Screen Width dmScreenSettings.dmPelsHeight = h; // Selected Screen Height dmScreenSettings.dmBitsPerPel = 32; // Selected Bits Per Pixel dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; // Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar. if (ChangeDisplaySettings(&dmScreenSettings;,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL) { // If The Mode Fails, Offer Two Options. Quit Or Use Windowed Mode. if (MessageBox(NULL, L"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?",L"cocos2d-x",MB_YESNO|MB_ICONEXCLAMATION)==IDYES) { setFullScreen(false); // back to windowed mode } else { // Pop Up A Message Box Letting User Know The Program Is Closing. MessageBox(NULL,L"Program Will Now Close.",L"ERROR",MB_OK|MB_ICONSTOP); return FALSE; // Return FALSE } } else // yeah! we are in fullscreen { dwExStyle = WS_EX_APPWINDOW; dwStyle=WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; //ShowCursor(FALSE); RECT rect; rect.left=(long)0; // Set Left Value To 0 rect.right=(long)w; // Set Right Value To Requested Width rect.top=(long)0; // Set Top Value To 0 rect.bottom=(long)h; // Set Bottom Value To Requested Height AdjustWindowRectEx(&rect;, dwStyle, FALSE, dwExStyle); // Adjust To True Requested Size } } /////////////// FULLSCREEN HACK - END // create window m_hWnd = CreateWindowEx( dwExStyle, // Extended Style For The Window kWindowClassName, // Class Name wszBuf, // Window Title dwStyle, // Defined Window Style 0, 0, // Window Position 0, // Window Width 0, // Window Height NULL, // No Parent Window NULL, // No Menu hInstance, // Instance NULL ); CC_BREAK_IF(! m_hWnd); 基本上這樣已搞定. 最後在我們自己項目的 main.cpp 里選擇全屏即可: AppDelegate app; CCEGLView& eglView = CCEGLView::sharedOpenGLView(); eglView.setFullScreen(true); eglView.setViewName("Hello Tests"); eglView.setFrameSize(1920, 1080); 要注意事項: - eglView.setFullScreen(true) 一定要在 eglView.setViewName("xxx") 前面. - eglView.setFrameSize(1920, 1080) 設定的大小, 一定要是顯卡可以支持的. - 不能再用CCDirector::sharedDirector()->enableRetinaDisplay(true)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值