屏幕自适应分辨率_skybeauty_新浪博客

屏幕适配有几种方案,一般情况下采取FIXED_HEIGHT或者是FIXED_WIDTH具体如下:

enum class ResolutionPolicy

{

    // The entire application is visible in the specified area without trying to preserve the original aspect ratio.

    // Distortion can occur, and the application may appear stretched or compressed.

    EXACT_FIT,

    // The entire application fills the specified area, without distortion but possibly with some cropping,

    // while maintaining the original aspect ratio of the application.

    NO_BORDER,

    // The entire application is visible in the specified area without distortion while maintaining the original

    // aspect ratio of the application. Borders can appear on two sides of the application.

    SHOW_ALL,

    // The application takes the height of the design resolution size and modifies the width of the internal

    // canvas so that it fits the aspect ratio of the device

    // no distortion will occur however you must make sure your application works on different

    // aspect ratios

    FIXED_HEIGHT,

    // The application takes the width of the design resolution size and modifies the height of the internal

    // canvas so that it fits the aspect ratio of the device

    // no distortion will occur however you must make sure your application works on different

    // aspect ratios

    FIXED_WIDTH,


    UNKNOWN,

 

};


具体实现代码如下:

void GLViewProtocol::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();

    }

 

}



#include "AppDelegate.h"

#include "CCLuaEngine.h"

#include "SimpleAudioEngine.h"

#include "cocos2d.h"

#include "Runtime.h"

#include "ConfigParser.h"


using namespace CocosDenshion;


USING_NS_CC;

using namespace std;


AppDelegate::AppDelegate()

{

}


AppDelegate::~AppDelegate()

{

    SimpleAudioEngine::end();

}


bool AppDelegate::applicationDidFinishLaunching()

{

#if (COCOS2D_DEBUG>0)

    initRuntime();

#endif

    // initialize director

   auto director = Director::getInstance();

auto glview = director->getOpenGLView();

if(!glview) {

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 )

    #include "../proj.win32/SimulatorWindow.h"

   auto viewSize = ConfigParser::getInstance()->getInitViewSize();

    glview = createSimulator( "helloWorld", viewSize.width, viewSize.height );

#else

    glview = GLView::createWithRect("helloWorld", Rect(0,0,960,640), 0.7);

    director->setOpenGLView(glview);

#endif

}

#ifdef COCOS2D_RETINA_DISPLAY

   float scaleFactor = 1.5;

#else

   float scaleFactor = 1;

#endif

    director->setContentScaleFactor(scaleFactor);

//    FileUtils::getInstance()->addSearchPath("res");

//    FileUtils::getInstance()->addSearchPath("lua");

   int designHeight = 640;

int designWidth = 960;

   float hwRatio = (float)(designHeight)/designWidth;

   float screenHWRation = glview->getFrameSize().height / glview->getFrameSize().width;

   if(screenHWRation >= hwRatio)

    {

        glview->setDesignResolutionSize(designWidth, designHeight, ResolutionPolicy::FIXED_WIDTH);

    }

   else

    {

        glview->setDesignResolutionSize(designWidth, designHeight, ResolutionPolicy::FIXED_HEIGHT);

    }


    // turn on display FPS

    director->setDisplayStats(true);


    // set FPS. the default value is 1.0/60 if you don't call this

    director->setAnimationInterval(1.0 / 30);



   auto engine = LuaEngine::getInstance();

    ScriptEngineManager::getInstance()->setScriptEngine(engine);

    

    engine->executeString( "cc.FileUtils:getInstance():addSearchPath("res")" );

    engine->executeString( "cc.FileUtils:getInstance():addSearchPath("lua")" );

    

#if (COCOS2D_DEBUG>0)

    if (startRuntime())

       return true;

#endif


    

   if (engine->executeScriptFile("Main.lua")) {

        return false;

    }


    return true;

}


// This function will be called when the app is inactive. When comes a phone call,it's be invoked too

void AppDelegate::applicationDidEnterBackground()

{

    Director::getInstance()->stopAnimation();


    SimpleAudioEngine::getInstance()->pauseBackgroundMusic();

}


// this function will be called when the app is active again

void AppDelegate::applicationWillEnterForeground()

{

    Director::getInstance()->startAnimation();


    SimpleAudioEngine::getInstance()->resumeBackgroundMusic();

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值