谈一谈Cocos2d-x中的某些“大小”

这里说的“大小”,包括了以下一些内容:

(1).窗口的大小

(2).分辨率的大小

(3).影幕的大小

(4).视口的大小

(5).裁剪区域的大小

我们先来看(1),窗口的大小

窗口的大小,即是Windows窗体大小。我们以HelloCpp为例,打开main.cpp,。找到这两句代码:

源码copy to clipboard打印

  1. <SPAN style="FONT-FAMILY: SimSun; FONT-SIZE: 14px">CCEGLView* eglView = CCEGLView::sharedOpenGLView();
  2. eglView->setFrameSize(960, 640 );</SPAN>
CCEGLView* eglView = CCEGLView::sharedOpenGLView();
eglView->setFrameSize(960, 640 );

这里取得了Opengl视窗类CCEGLView单件实例指针返回给指针变量eglView,并调用其setFrameSize函数设置一个所谓的Frame大小。这个大小是神马东西?进去看看!

进入到CCEGLView.cpp的相应函数:

源码copy to clipboard打印

  1. <SPAN style="FONT-SIZE: 14px">void CCEGLView::setFrameSize(float width,
    float height)
  2. {
  3. //我们在这里看到调用了Create函数,这里传入的width,height就是要创建的窗口的大小。
  4. Create((LPCTSTR)m_szViewName, (int)width, (int)height);
  5. //后面调用基类的setFrameSize,一会儿再分析,暂略过。
  6. CCEGLViewProtocol::setFrameSize(width, height);
  7. }</SPAN>
void CCEGLView::setFrameSize(float width, float height)
{
    //我们在这里看到调用了Create函数,这里传入的width,height就是要创建的窗口的大小。
Create((LPCTSTR)m_szViewName, (int)width, (int)height);
//后面调用基类的setFrameSize,一会儿再分析,暂略过。
    CCEGLViewProtocol::setFrameSize(width, height);
}

看一下Create函数:

源码copy to clipboard打印

  1. <SPAN style="FONT-SIZE: 14px">bool CCEGLView::Create(LPCTSTR pTitle,
    int w, int h)
  2. {
  3. bool bRet =
    false;
  4. do
  5. {
  6. //这里通过判断m_hWnd是否有效来确保只Create一次,不允许创建多个窗体。
  7. CC_BREAK_IF(m_hWnd);
  8. //
  9. HINSTANCE hInstance = GetModuleHandle( NULL );
  10. WNDCLASS wc; //窗口类信息结构
  11. //填充信息结构
  12. wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
  13. wc.lpfnWndProc = _WindowProc;
  14. wc.cbClsExtra = 0;
  15. wc.cbWndExtra = 0;
  16. wc.hInstance = hInstance;
  17. wc.hIcon = LoadIcon( NULL, IDI_WINLOGO );
  18. wc.hCursor = LoadCursor( NULL, IDC_ARROW );
  19. wc.hbrBackground = NULL;
  20. wc.lpszMenuName = NULL;
  21. wc.lpszClassName = kWindowClassName;
  22. //注册窗口类
  23. CC_BREAK_IF(! RegisterClass(&wc) && 1410 != GetLastError());
  24. //取得电脑屏幕大小矩形
  25. RECT rcDesktop;
  26. GetWindowRect(GetDesktopWindow(), &rcDesktop);
  27. //将窗口标题多字节转宽字符。
  28. WCHAR wszBuf[50] = {0};
  29. MultiByteToWideChar(CP_UTF8, 0, m_szViewName, -1, wszBuf,
    sizeof(wszBuf));
  30. // 使用注册过的窗口类创建窗口
  31. m_hWnd = CreateWindowEx(
  32. WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, // Extended Style For The Window
  33. kWindowClassName, // Class Name
  34. wszBuf, // Window Title
  35. WS_CAPTION | WS_POPUPWINDOW | WS_MINIMIZEBOX, // Defined Window Style
  36. 0, 0, // Window Position
  37. 0, // Window Width
  38. 0, // Window Height
  39. NULL, // No Parent Window
  40. NULL, // No Menu
  41. hInstance, // Instance
  42. NULL );
  43. //通过窗口句柄有效性判断确保创建成功才能继续
  44. CC_BREAK_IF(! m_hWnd);
  45. //重点函数,调整窗口大小
  46. resize(w, h);
  47. //初始化OpenGL
  48. bRet = initGL();
  49. //返回成功判断
  50. CC_BREAK_IF(!bRet);
  51. //保存单件实例指针
  52. s_pMainWindow = this;
  53. bRet = true;
  54. } while (0);
  55. //返回成败
  56. return bRet;
  57. }</SPAN>
bool CCEGLView::Create(LPCTSTR pTitle, int w, int h)
{
    bool bRet = false;
    do
{
			//这里通过判断m_hWnd是否有效来确保只Create一次,不允许创建多个窗体。
        		CC_BREAK_IF(m_hWnd);
			//
			HINSTANCE hInstance = GetModuleHandle( NULL );
			WNDCLASS  wc;       //窗口类信息结构

			//填充信息结构
			wc.style          = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
			wc.lpfnWndProc    = _WindowProc;
			wc.cbClsExtra     = 0;
			wc.cbWndExtra     = 0;
			wc.hInstance      = hInstance;
			wc.hIcon          = LoadIcon( NULL, IDI_WINLOGO );
			wc.hCursor        = LoadCursor( NULL, IDC_ARROW );
			wc.hbrBackground  = NULL;
			wc.lpszMenuName   = NULL;
			wc.lpszClassName  = kWindowClassName;
			//注册窗口类
			CC_BREAK_IF(! RegisterClass(&wc) && 1410 != GetLastError());        

			//取得电脑屏幕大小矩形
			RECT rcDesktop;
			GetWindowRect(GetDesktopWindow(), &rcDesktop);
			//将窗口标题多字节转宽字符。
			WCHAR wszBuf[50] = {0};
			MultiByteToWideChar(CP_UTF8, 0, m_szViewName, -1, wszBuf, sizeof(wszBuf));

			// 使用注册过的窗口类创建窗口
			m_hWnd = CreateWindowEx(
				WS_EX_APPWINDOW | WS_EX_WINDOWEDGE,    // Extended Style For The Window
				kWindowClassName,                                    // Class Name
				wszBuf,                                                // Window Title
				WS_CAPTION | WS_POPUPWINDOW | WS_MINIMIZEBOX,        // 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);
	   //重点函数,调整窗口大小
        resize(w, h);
        //初始化OpenGL
        bRet = initGL();
	   //返回成功判断
        CC_BREAK_IF(!bRet);
        //保存单件实例指针
        s_pMainWindow = this;
        bRet = true;
    } while (0);
    //返回成败
    return bRet;
}

创建窗口时并没有用到w和h,所以只有继续看重点函数才能知道窗口大小是怎么设置的。

源码copy to clipboard打印

  1. <SPAN style="FONT-SIZE: 14px">void CCEGLView::resize(int width,
    int height)
  2. {
  3. //窗口句柄有效性判断
  4. if (! m_hWnd)
  5. {
  6. return;
  7. }
  8. //获取窗口的客户区大小矩形,这个客户区其实就是咱们OpenGL视窗的实际大小,不包含一般窗口的菜单,边框,状态栏等部分。
  9. RECT rcClient;
  10. GetClientRect(m_hWnd, &rcClient);
  11. //如果当前窗口的客户区部分大小与参数width,height相同,直接返回
  12. if (rcClient.right - rcClient.left == width &&
  13. rcClient.bottom - rcClient.top == height)
  14. {
  15. return;
  16. }
  17. // 否则重新设置客户区大小矩形变量的值。
  18. rcClient.right = rcClient.left + width;
  19. rcClient.bottom = rcClient.top + height;
  20. //此函数将使窗口的整体大小(即如果有则包含菜单栏,边框,底部状态栏和客户可视区的整个窗口的大小)按照
  21. 指定的客户区大小rcClient和窗口样式来自动调整,确保了客户区就是rcClient指定大小。其中GetWindowLong用来获取当前窗口的
  22. 样式,GWL_STYLE为基本样式信息,GWL_EXSTYLE为扩展栏式信息。返回窗口的整体大小再传给rcClient。
  23. AdjustWindowRectEx(&rcClient, GetWindowLong(m_hWnd, GWL_STYLE),
    false,
  24. GetWindowLong(m_hWnd, GWL_EXSTYLE));
  25. // 设置窗口的显示位置并应用rcClient做为窗口的大小。
  26. SetWindowPos(m_hWnd, 0, 0, 0, rcClient.right - rcClient.left,
  27. rcClient.bottom - rcClient.top, SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOOWNERZORDER
  28. | SWP_NOZORDER);
  29. }
  30. </SPAN>
void CCEGLView::resize(int width, int height)
{
//窗口句柄有效性判断
    if (! m_hWnd)
    {
        return;
    }

    //获取窗口的客户区大小矩形,这个客户区其实就是咱们OpenGL视窗的实际大小,不包含一般窗口的菜单,边框,状态栏等部分。
RECT rcClient;
    GetClientRect(m_hWnd, &rcClient);
	//如果当前窗口的客户区部分大小与参数width,height相同,直接返回
		if (rcClient.right - rcClient.left == width &&
			rcClient.bottom - rcClient.top == height)
		{
			return;
		}
		// 否则重新设置客户区大小矩形变量的值。
		rcClient.right = rcClient.left + width;
		rcClient.bottom = rcClient.top + height;
		//此函数将使窗口的整体大小(即如果有则包含菜单栏,边框,底部状态栏和客户可视区的整个窗口的大小)按照
指定的客户区大小rcClient和窗口样式来自动调整,确保了客户区就是rcClient指定大小。其中GetWindowLong用来获取当前窗口的
样式,GWL_STYLE为基本样式信息,GWL_EXSTYLE为扩展栏式信息。返回窗口的整体大小再传给rcClient。
		AdjustWindowRectEx(&rcClient, GetWindowLong(m_hWnd, GWL_STYLE), false,
                GetWindowLong(m_hWnd, GWL_EXSTYLE));

		// 设置窗口的显示位置并应用rcClient做为窗口的大小。
		SetWindowPos(m_hWnd, 0, 0, 0, rcClient.right - rcClient.left,
			rcClient.bottom - rcClient.top, SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOOWNERZORDER
                | SWP_NOZORDER);
}

好了,我们看,窗口的大小就是这么设置的。作者考虑到了不同的样式窗口对于客户区大小的影响,故做了相应的处理。所以我们创建指定大小的窗口时其实真正的意思是创建一个指定客户区大小的窗口。

我们再来看 (2),分辨率的大小和 (3),影幕的大小 (4),视口的大小

分辨率:即是屏幕上图像的精细度,在Cocos2d-x中其大小为屏幕在横向和纵向可以容纳的逻辑点数量,为了好理解,我们把它想像成投影机的分辨率。

影幕:想想小时候看电影时用到的那块白布吧,当然也许公司会议室里也能看到它。也就是投影机用来投射画面的画布。

视口:其实就是上面说的投影机投影出来的影片画面所占的矩形。它如果大于影幕的大小,那么你就不能看到完整的影片画面。如果小于影幕的大小。你就可以在它显示的区域里看到影片画面。

我们现在看一下刚才略过的代码:CCEGLViewProtocol::setFrameSize(width,height);

进入CCEGLViewProtocol.cpp中相应函数定义:

源码copy to clipboard打印

  1. <SPAN style="FONT-SIZE: 14px">void CCEGLViewProtocol::setFrameSize(float width,
    float height)
  2. {
  3. //这里使用参数对两个变量进行了赋值,第一个就是分辨率大小。第二个就是影幕的大小。
  4. m_obDesignResolutionSize = m_obScreenSize = CCSizeMake(width, height);
  5. }
  6. </SPAN>
void CCEGLViewProtocol::setFrameSize(float width, float height)
{
    //这里使用参数对两个变量进行了赋值,第一个就是分辨率大小。第二个就是影幕的大小。
    m_obDesignResolutionSize = m_obScreenSize = CCSizeMake(width, height);
}

双击“m_obDesignResolutionSize”,按下Ctrl+F,在弹出查找对话框里对当前文档CCEGLViewProtocol.cpp中查找全部使用。

点击第一个查找结果,看一下所在函数setDesignResolutionSize,这个函数是用来设置分辨率大小的。前两个参数无疑就是设置分辨率横向纵向的像素数量的。最后一个参数resolutionPolicy我们必须了解一下,进入ResolutionPolicy的定义:

源码copy to clipboard打印

  1. enum ResolutionPolicy
  2. {
  3. // 扩展填充模式:这里等于是直接设置投影机的分辨率。如果这个分辨率与画布大小的比例失调,就会出现失真。
  4. kResolutionExactFit,
  5. // 低调整模式:这个吧,是按照设置的分辨率在横纵方向上最低值调整视口大小,使投影机投影出来的影片画面所占的矩形在
  6. 画布上所对应的相应方向上与最低值一致。
  7. kResolutionNoBorder
  8. // 高调整模式:与上面恰恰相反,按照设置的分辨率在横纵方向上最高值调整视口大小,使投影机投影出来的影片画面所占的
  9. 矩形在画布上所对应的相应方向上与最高值一致。同时这个矩形的另一个方向按最低值进行裁剪,区域外部分填充黑色。
  10. kResolutionShowAll,
  11. //无效值
  12. kResolutionUnKnown,
  13. };
enum ResolutionPolicy
{
    // 扩展填充模式:这里等于是直接设置投影机的分辨率。如果这个分辨率与画布大小的比例失调,就会出现失真。
    kResolutionExactFit,
    // 低调整模式:这个吧,是按照设置的分辨率在横纵方向上最低值调整视口大小,使投影机投影出来的影片画面所占的矩形在
    画布上所对应的相应方向上与最低值一致。
    kResolutionNoBorder
    // 高调整模式:与上面恰恰相反,按照设置的分辨率在横纵方向上最高值调整视口大小,使投影机投影出来的影片画面所占的
    矩形在画布上所对应的相应方向上与最高值一致。同时这个矩形的另一个方向按最低值进行裁剪,区域外部分填充黑色。
    kResolutionShowAll,
    //无效值
    kResolutionUnKnown,
};

这个枚举归结为“分辨率模式”。是不是有点迷糊,得,我们在继续下面的函数之前,先以例子来说明一下:

打开HelloLua工程的AppDelegate.cpp,看一下这个函数:

源码copy to clipboard打印

  1. <SPAN style="FONT-SIZE: 14px">bool AppDelegate::applicationDidFinishLaunching()
  2. {
  3. // 取得显示设备的单件实例指针
  4. CCDirector *pDirector = CCDirector::sharedDirector();
  5. // 设置其使用的OpenGL视窗为单件OpenGL视窗
  6. pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
  7. //在这里设置了分辨率为480,320,与窗口客户区一致,显示模式为kResolutionShowAll。
  8. CCEGLView::sharedOpenGLView()->setDesignResolutionSize(480, 320, kResolutionShowAll);
  9. //开始高清显示模式
  10. // pDirector->enableRetinaDisplay(true);
  11. // 设置显示FPS相关
  12. pDirector->setDisplayStats(true);
  13. // 设置帧间隔时间
  14. pDirector->setAnimationInterval(1.0 / 60);
  15. // 注册LUA管理器并设置为当前使用的脚本系统
  16. CCScriptEngineProtocol* pEngine = CCLuaEngine::engine();
  17. CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);
  18. //执行hello.lua脚本启动游戏,不懂的可以参见本博主的博文“HelloLua”深入分析一文
  19. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
  20. CCString* pstrFileContent = CCString::createWithContentsOfFile("hello.lua");
  21. if (pstrFileContent)
  22. {
  23. pEngine->executeString(pstrFileContent->getCString());
  24. }
  25. #else
  26. std::string path = CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("hello.lua");
  27. pEngine->addSearchPath(path.substr(0, path.find_last_of("/")).c_str());
  28. pEngine->executeScriptFile(path.c_str());
  29. #endif
  30. return true;
  31. }
  32. </SPAN>
bool AppDelegate::applicationDidFinishLaunching()
{
    // 取得显示设备的单件实例指针
CCDirector *pDirector = CCDirector::sharedDirector();
// 设置其使用的OpenGL视窗为单件OpenGL视窗
    pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
	//在这里设置了分辨率为480,320,与窗口客户区一致,显示模式为kResolutionShowAll。
    CCEGLView::sharedOpenGLView()->setDesignResolutionSize(480, 320, kResolutionShowAll);

	//开始高清显示模式
    // pDirector->enableRetinaDisplay(true);

    // 设置显示FPS相关
    pDirector->setDisplayStats(true);

    // 设置帧间隔时间
    pDirector->setAnimationInterval(1.0 / 60);

    // 注册LUA管理器并设置为当前使用的脚本系统
    CCScriptEngineProtocol* pEngine = CCLuaEngine::engine();
    CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);
	//执行hello.lua脚本启动游戏,不懂的可以参见本博主的博文“HelloLua”深入分析一文
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    CCString* pstrFileContent = CCString::createWithContentsOfFile("hello.lua");
    if (pstrFileContent)
    {
        pEngine->executeString(pstrFileContent->getCString());
    }
#else
    std::string path = CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("hello.lua");
    pEngine->addSearchPath(path.substr(0, path.find_last_of("/")).c_str());
    pEngine->executeScriptFile(path.c_str());
#endif 

    return true;
}

我们要干点坏事,好吧。我们尝试着将其分别改为

源码copy to clipboard打印

  1. CCEGLView::sharedOpenGLView()->setDesignResolutionSize(80, 320, kResolutionExactFit);
  2. CCEGLView::sharedOpenGLView()->setDesignResolutionSize(80, 320, kResolutionNoBorder);
  3. CCEGLView::sharedOpenGLView()->setDesignResolutionSize(80, 320, kResolutionShowAll);
CCEGLView::sharedOpenGLView()->setDesignResolutionSize(80, 320, kResolutionExactFit);
CCEGLView::sharedOpenGLView()->setDesignResolutionSize(80, 320, kResolutionNoBorder);
CCEGLView::sharedOpenGLView()->setDesignResolutionSize(80, 320, kResolutionShowAll);

并进行测试。下面是测试图。

好好理解一下。

再回来看setDesignResolutionSize函数:

源码copy to clipboard打印

  1. void CCEGLViewProtocol::setDesignResolutionSize(float width,
    float height, ResolutionPolicy resolutionPolicy)
  2. {
  3. //是否使用高清模式(视网膜屏幕),高清模式不让设置分辨率。
  4. CCAssert(m_bIsRetinaEnabled == false,
    "can not enable retina while set design resolution size!");
  5. //确保分辨率显示方式有效
  6. CCAssert(resolutionPolicy != kResolutionUnKnown, "should set resolutionPolicy");
  7. //如果参数无效,直接返回。
  8. if (width == 0.0f || height == 0.0f)
  9. {
  10. return;
  11. }
  12. //在这里对变量m_obDesignResolutionSize进行了设置。
  13. m_obDesignResolutionSize.setSize(width, height);
  14. //这里计算出影幕大小与分辨率大小的比率。存放在变量m_fScaleX,m_fScaleY中。
  15. m_fScaleX = (float)m_obScreenSize.width / m_obDesignResolutionSize.width;
  16. m_fScaleY = (float)m_obScreenSize.height / m_obDesignResolutionSize.height;
  17. //如果模式是kResolutionNoBorder,按照最大影幕方式,即保证像素不失真的情况下,影幕适应分辨率
  18. //如果是低调整模式
  19. if (resolutionPolicy == kResolutionNoBorder)
  20. {
  21. //缩放值按最大
  22. m_fScaleX = m_fScaleY = MAX(m_fScaleX, m_fScaleY);
  23. }
  24. //如果是高调整模式
  25. if (resolutionPolicy == kResolutionShowAll)
  26. {
  27. //缩放值按最小
  28. m_fScaleX = m_fScaleY = MIN(m_fScaleX, m_fScaleY);
  29. }
  30. // 根据缩放值和分辨率计算视口的宽高
  31. float viewPortW = m_obDesignResolutionSize.width * m_fScaleX;
  32. float viewPortH = m_obDesignResolutionSize.height * m_fScaleY;
  33. // 设置视口位置居屏幕中间
  34. m_obViewPortRect.setRect((m_obScreenSize.width - viewPortW) / 2, (m_obScreenSize.height - viewPortH) / 2, viewPortW, viewPortH);
  35. //保存分辨率模式
  36. m_eResolutionPolicy = resolutionPolicy;
  37. //使用变量设置Opengl视口(此处屏蔽,在SetGLDefaultValues中会有设)
  38. //setViewPortInPoints(0, 0,m_obScreenSize.width, m_obScreenSize.height);
  39. // 创建FPS的文字标签
  40. CCDirector::sharedDirector()->createStatsLabel();
  41. //初始化逻辑点和像素值大小
  42. CCDirector::sharedDirector()->m_obWinSizeInPoints = CCDirector::sharedDirector()->m_obWinSizeInPixels = getSize();
  43. //对OpengGL用到的一些设置进行初始化,其中有重设投影函数,会再重置视口。
  44. CCDirector::sharedDirector()->setGLDefaultValues();
  45. }
void CCEGLViewProtocol::setDesignResolutionSize(float width, float height, ResolutionPolicy resolutionPolicy)
{
	//是否使用高清模式(视网膜屏幕),高清模式不让设置分辨率。
CCAssert(m_bIsRetinaEnabled == false, "can not enable retina while set design resolution size!");
//确保分辨率显示方式有效
    CCAssert(resolutionPolicy != kResolutionUnKnown, "should set resolutionPolicy");
    //如果参数无效,直接返回。
    if (width == 0.0f || height == 0.0f)
    {
        return;
    }
    //在这里对变量m_obDesignResolutionSize进行了设置。
    m_obDesignResolutionSize.setSize(width, height);
    //这里计算出影幕大小与分辨率大小的比率。存放在变量m_fScaleX,m_fScaleY中。
    m_fScaleX = (float)m_obScreenSize.width / m_obDesignResolutionSize.width;
    m_fScaleY = (float)m_obScreenSize.height / m_obDesignResolutionSize.height;
//如果模式是kResolutionNoBorder,按照最大影幕方式,即保证像素不失真的情况下,影幕适应分辨率
//如果是低调整模式
    if (resolutionPolicy == kResolutionNoBorder)
{
	   //缩放值按最大
        m_fScaleX = m_fScaleY = MAX(m_fScaleX, m_fScaleY);
    }
    //如果是高调整模式
    if (resolutionPolicy == kResolutionShowAll)
{
	    //缩放值按最小
        m_fScaleX = m_fScaleY = MIN(m_fScaleX, m_fScaleY);
    }

    // 根据缩放值和分辨率计算视口的宽高
    float viewPortW = m_obDesignResolutionSize.width * m_fScaleX;
    float viewPortH = m_obDesignResolutionSize.height * m_fScaleY;
	// 设置视口位置居屏幕中间
    m_obViewPortRect.setRect((m_obScreenSize.width - viewPortW) / 2, (m_obScreenSize.height - viewPortH) / 2, viewPortW, viewPortH);
    //保存分辨率模式
    m_eResolutionPolicy = resolutionPolicy;
    //使用变量设置Opengl视口(此处屏蔽,在SetGLDefaultValues中会有设)
    //setViewPortInPoints(0, 0,m_obScreenSize.width, m_obScreenSize.height);
// 创建FPS的文字标签
CCDirector::sharedDirector()->createStatsLabel();
//初始化逻辑点和像素值大小
CCDirector::sharedDirector()->m_obWinSizeInPoints = CCDirector::sharedDirector()->m_obWinSizeInPixels = getSize();
//对OpengGL用到的一些设置进行初始化,其中有重设投影函数,会再重置视口。
    CCDirector::sharedDirector()->setGLDefaultValues();
}

现在大家明白我为什么将(2),(3),(4)并在一起说了。它们其实是有机结合的。相辅相成,缺一不可。

我们最后来看一下:(5),裁剪区域的大小:

裁剪区域:如果对Opengl显示窗口设定裁剪区域,则裁剪区域外的像素将不会显示。

我们仍然在HelloLua工程中进行说明:

在函数AppDelegate::applicationDidFinishLaunching()中我们在

源码copy to clipboard打印

  1. CCEGLViewProtocol* tpCCEGLView = (CCEGLViewProtocol*) CCEGLView::sharedOpenGLView();
  2. CCEGLView::sharedOpenGLView()->setDesignResolutionSize(80, 320, kResolutionShowAll);
CCEGLViewProtocol*	tpCCEGLView = (CCEGLViewProtocol*) CCEGLView::sharedOpenGLView();

CCEGLView::sharedOpenGLView()->setDesignResolutionSize(80, 320, kResolutionShowAll);

后面增加代码:

源码copy to clipboard打印

  1. //设定裁剪显示区域
  2. tpCCEGLView->setScissorInPoints(100,100,100,100);
  3. //开启裁剪检测
  4. glEnable(GL_SCISSOR_TEST);
//设定裁剪显示区域
tpCCEGLView->setScissorInPoints(100,100,100,100);
	//开启裁剪检测
glEnable(GL_SCISSOR_TEST);

运行测试:

可以看到,我们对画面进行了裁剪。从屏幕100,100位置起的大小为宽100,高100的区域被设为了裁剪显示区域,其它部分均被裁切掉了。

时间: 2024-11-16 02:05:29

谈一谈Cocos2d-x中的某些“大小”的相关文章

浅谈TeeChart组件在ASP中的应用

chart 浅谈TeeChart组件在ASP中的应用 由于TeeChart VCL 版本广泛应用于多种开发环境并得到很好的认可,西班牙Steema Software SL公司于1997年10月又开发了TeeChart Pro ActiveX.对于B/S的开发模式无疑是一个好消息,由于它只需安装在服务器端,客户端无需安装其他软件,只要使用通用浏览器即可显示统计图形,因此一面市更是又一次得到极大的欢迎. 下面我们结合ASP技术介绍一下TeeChart Pro V5 ActiveX组件常用属性及应用.

谈外链建设工作中的战略原则

虽然站长都不太喜欢做外链,但是你又不得不承认外链是影响甚至决定排名的关键因素,所以站长们也就只能"身不由己"的去做一些不爱做的事情了.说到底,大家都是为了混口饭吃嘛,委屈一下自己也没什么. 今天先谈一谈外链建设方面的战略原则,也就是比较宏观的一些东西.所谓战略,就代表了你在外链建设的过程中应该把握好的大方向,做到"运筹帷幄".找准了方向,再去采取具体细化的手法来进行操作,绝对比漫无目的横冲直撞要好得多.   一.外链相关度 我们都知道,外链其实就是一种网站之间的投票

浅谈java 执行jar包中的main方法_java

浅谈java 执行jar包中的main方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar 执行后总是运行指定的主方法,如果 jar 中有多个 main 方法,那么如何运行指定的 main 方法呢? 用下面的命令试试看: java -classpath ****.jar ****.****.className [args] "****.****"表示"包名": "className"表示&

[译]再谈如何安全地在 Android 中存储令牌

本文讲的是[译]再谈如何安全地在 Android 中存储令牌, 原文地址:A follow-up on how to store tokens securely in Android 原文作者:Enrique López Mañas 译文出自:掘金翻译计划 译者: lovexiaov 校对者:luoqiuyu hackerkevin 作为本文的序言,我想对读者做一个简短的声明.下面的引言对本文的后续内容而言十分重要. 没有绝对的安全.所谓的安全是指利用一系列措施的堆积和组合,来试图延缓必然发生的

谈一谈SQL Server中的执行计划缓存(下)

原文:谈一谈SQL Server中的执行计划缓存(下) 简介     在上篇文章中我们谈到了查询优化器和执行计划缓存的关系,以及其二者之间的冲突.本篇文章中,我们会主要阐述执行计划缓存常见的问题以及一些解决办法.   将执行缓存考虑在内时的流程     上篇文章中提到了查询优化器解析语句的过程,当将计划缓存考虑在内时,首先需要查看计划缓存中是否已经有语句的缓存,如果没有,才会执行编译过程,如果存在则直接利用编译好的执行计划.因此,完整的过程如图1所示. 图1.将计划缓存考虑在内的过程      

谈一谈SQL Server中的执行计划缓存(上)

原文:谈一谈SQL Server中的执行计划缓存(上) 简介     我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询优化(Optimization,有时候也被称为简化).执行(Execution).除去执行步骤外,前三个步骤之后就生成了执行计划,也就是SQL Server按照该计划获取物理数据方式,最后执行步骤按照执行计划执行查询从而获得结果.但查询

谈一谈如何让老网站在百度更新中越来越稳

摘要: 每次百度更新总会有一部分网站倒下,这让很多老站长都感觉百度无情,其实作为百度搜索引擎而言他更多的是考虑用户的利益,而对于一些老网站被降权或者被K的行为都是由于网站自 每次百度更新总会有一部分网站倒下,这让很多老站长都感觉百度无情,其实作为百度搜索引擎而言他更多的是考虑用户的利益,而对于一些老网站被降权或者被K的行为都是由于网站自身不足引起的,而想要自己的网站在百度中趋于稳定,那么就必须改变建站思路与建站方法,下面我们详细的谈一谈如何让老网站在百度更新中越来越稳. 改变外链质量应当以稳定和

浅谈:怎么在SEO中植入内容营销的基因

中介交易 SEO诊断 淘宝客 云主机 技术大厅 中国互联网环境变迁的速度绝对比房价上涨的速度快多了,但是在各种混乱.各种无节操中也不断蹦出一些新机会. 单就搜索领域而言,近一两年的变数也是够多的,导致一些比较保守的SEO从业人员和站长叫苦不迭.有多苦?看看最近卢松松发的一个笑话就知道了: 站长问科比:你为什么这么成功? 科比:你知道洛杉矶早晨4点钟是什么样子吗? 站长:知道,一般那时候我还没睡.怎么了? 科比:--没事! 科比都无语了,站长们,你们赢了.站长圈中一直流行着这种自嘲的段子,可能确实

谈一谈网络编程学习经验

建议大家去看原文:http://cloud.github.com/downloads/chenshuo/documents/LearningNetworkProgramming.pdf 1 谈一谈网络编程学习经验 陈硕 giantchen@gmail.com blog.csdn.net/Solstice weibo.com/giantchen 2012-02-13 本文谈一谈我在学习网络编程方面的一些个人经验."网络编程"这个术语的范围很广,本文指用 Sockets API 开发基于

谈一谈各种语言的“整装儿”的感觉

谈一谈各种语言的"整装儿"的感觉 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. "整装儿" 是个东北方言,意思就是很紧凑,很成型,不散乱,结构清晰, 或