cocos2dx 一套资源做完美分辨率适配(不拉伸无黑边全屏显示)

//首先声明一下:
//本文章完全原创,转载请说明出处。
//原文地址:http://blog.csdn.net/u012858622/article/details/21962535
//废话不多说啦直接上代码。
class GameWinSize
{
    static GameWinSize* mSize;
    GameWinSize();

public:

    static GameWinSize* init();

    double scale; //除背景 以外 其他的都用它缩放(具体看情况)

    double bgScale; //背景用它缩放(具体看情况)

    double map_x_sub; //tile map 用到的 一个让 map保持在屏幕中间的 参数 用法 后面介绍

    double map_y_sub;//tile map 用到的 一个让 map保持在屏幕中间的 参数 用法 后面介绍

};

 
#include "GameWinSize.h"

GameWinSize* GameWinSize::mSize=NULL;

GameWinSize* GameWinSize::init()
{
    if (mSize==NULL)
    {
        mSize= new GameWinSize();

        CCSize size =CCDirector::sharedDirector()->getWinSize();

	//我的资源分辨率是 960*640 宽高比是 3:2  所以用这判断(建议用高清图)

        if((size.width/size.height)>=3.0f/2.0f)
        {
	//除背景 以外 其他的都用它缩放(具体看情况)
 	double scale_= size.height/640;mSize->scale=scale_;
	//背景用它缩放(具体看情况)
	double scale_b= size.width/960;mSize->bgScale=scale_b;
	} 
	else 
	{
	//除背景 以外 其他的都用它缩放(具体看情况)
	double scale_= size.width/960;mSize->scale=scale_;
	//背景用它缩放(具体看情况)
 	double scale_b= size.height/640;mSize->bgScale=scale_b; 
	}
 	mSize->map_x_sub=(size.width/mSize->scale-960)/2.0*mSize->scale;
	mSize->map_y_sub=(size.height/mSize->scale-640)/2.0*mSize->scale;
    } 
        return mSize;
}
GameWinSize::GameWinSize()
{
}
 
用法:
CCSize size=CCDirector::sharedDirector()->getWinSize();
//背景 
    CCSprite * bgsp =CCSprite::create("***");

    bgsp->setPosition(ccp(size.width/2,size.height/2));

    //背景缩放就用 bgScale  一切都应该根据当时的情况而定 

    bgsp->setScale(GameWinSize::init()->bgScale);

//----------------------

    //其他 的

    CCSprite * sp = CCSprite::create("***");

    sp->setPosition(ccp(size.width/2,size.height/2));

    //不是背景缩放就用 scale   一切都应该根据当时的情况而定  

    sp->setScale(GameWinSize::init()->scale);




//位置很重要

//如 在屏幕中间用不用 乘 GameWinSize::init()->scale 如果 挨着左边或者右边 的话 x坐标就不用 乘 GameWinSize::init()->scale 如果挨着上边或者下边 的话 y坐标就不用 乘 GameWinSize::init()->scale   具体怎么设置 请根据你想要的效果设定(小弟能力有限目前还没把他和 cocos2dx 引擎结合在一起,如果有大神的话 还请指点)


   CCSprite * sp = CCSprite::create("***");

//设置位置相当重要


    sp->setPosition(ccp(500*GameWinSize::init()->scale,130*GameWinSize::init()->scale)); 

    sp->setScale(GameWinSize::init()->scale);


//tile map 用法 :


    CCTMXTiledMap* tileMap=CCTMXTiledMap::create(“***”);

    tileMap->setAnchorPoint(ccp(0.5,0.5));

    tileMap->setPosition(size.width/2,size.height/2);

    tileMap->setScale(GameWinSize::init()->scale);
// 注意 从tilemap 里获取的 动对象 或者其他 的 东西  x坐标要加上map_x_sub, y坐标要加上map_y_sub

    group = tileMap->objectGroupNamed("Objects");

    CCArray* objects =group->getObjects();

    CCObject* pObj = NULL;

    CCARRAY_FOREACH(objects, pObj)
    {

        dict=(CCDictionary*)pObj;

        if (!dict)
	{
	break;
	}

       	int x = ((CCString*)dict->objectForKey("x"))->intValue();

        x*=GameWinSize::init()->scale;

        x+=GameWinSize::init()->map_x_sub;

       	int y = ((CCString*)dict->objectForKey("y"))->intValue();

        y*=GameWinSize::init()->scale;

        y+=GameWinSize::init()->map_y_sub;

        int width = ((CCString*)dict->objectForKey("width"))->intValue();

        width*=GameWinSize::init()->scale;

        int height = ((CCString*)dict->objectForKey("height"))->intValue();

        height*=GameWinSize::init()->scale;

        }

 }
//嘿嘿 这就可以了   这个 方法 完全可以做到 所有显示屏 完美适配 (无黑边不拉伸 全屏显示)用这个做的项目已经 上线 (由于是 从 我的分辨率适配系统里浓缩出来的有可能有错误 还请 发现者 及时指出 )这个 还没能喝 cocos2dx 引擎结合起来 用起来 有点麻烦(不过很灵活)还请各位大神把他完善了 嘿嘿。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 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(▭, 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、付费专栏及课程。

余额充值