• Cocos2d-x的屏幕适配


    今天颇经过一番周折,算是弄明白了点儿cocos2d-x的屏幕适配,记之。

    一切都从TestCpp开始,我在里面加了点儿自己的demo,跑起来发现如果窗口大小是原始480*320,那么跑起来没问题,可是窗口放大成1024*768,那么原始的demo都是按比例缩放,但我自己写的就还是原大小,导致了比例不对。开始以为是自己新写的某个类的问题,后来发现我在一个CCMenu里面加了多个MenuItem,一半用的现有资源,他们是对的,一半用的自己的新资源,他们是错的。这就没道理了,经过同事提醒,才发现诡异问题的根本原因是TestCpp准备了两套资源,除了我加的普通资源,还有个文件夹hd,里面放的是原始资源两倍大的高清资源,在高分辨率下,使用的是那套高清资源,我的新增资源因为只有一套,所以就不对了。

    我们梳理了这部分代码,理解如下:

    1.在pc上,main代码中,设置了eglView->setFrameSize(480, 320);这个setFrameSize是窗口大小的设置,最后viewport变换,设置到的就是这个尺寸。在ios的代码里面没有这一行,这是因为设备的framesize是根据设备本身的分辨率直接获取的,而不是设置的。

    2.在appDelegate中,通过常量设置了designSize = CCSizeMake(480, 320);这是一个定值,就是页面进行设计时候的尺寸,比如如果我们有ccb,那么这个就是我们ccb设计时候的尺寸。

    3.CCEGLView::sharedOpenGLView()->setDesignResolutionSize(designSize.width, designSize.height, kResolutionNoBorder);这句话就把设计的尺寸给设了进去(还有适配策略,在此略过),只要designsize是固定的并且在此设置,那么不管窗口尺寸通过上面的framesize怎么变化,cocos2d-x都会自己对整个画面进行缩放从而使所有的ui都等比例的变换,在不同设备看到不同效果。

    4.我之所以遇到问题,是因为中间还有一段

        if (screenSize.height > 320)

        {

            CCSize resourceSize = CCSizeMake(960, 640);

            CCFileUtils::sharedFileUtils()->setResourceDirectory("hd");

            pDirector->setContentScaleFactor(resourceSize.height/designSize.height);

        }

    大分辨率时我们进入了这一段。这里可以看到有个新的resourceSize,这个就是高清资源设计时所根据的尺寸,简单的说,和designSize一除就可以发现,是2倍。然后CCTexture2D等在getContentSize的时候会通过CC_CONTENT_SCALE_FACTOR宏将获得的资源尺寸除以这个值,也就是说原本400*300的资源,在高清下变成了800*600,然后除以2,又变回了400*300,从而可以适配在原来的ui中,正常显示。
  • 相关阅读:
    获取程序的当前启动路径
    SuspendLayout,ResumeLayout,Layout,PerformLayout
    序列化反序列化的简单例子
    简单的异步编程入门例子
    ClickOnce的更新策略
    ubuntu update(国内升级源)
    为AptGet设置代理
    如何启用 Ubuntu 中的 root 帐号
    The Great Tunnel Debate: PBT vs TMPLS
    Traffic engineering for Ethernet: PBT vs. TMPLS
  • 原文地址:https://www.cnblogs.com/unionfind/p/3182921.html
Copyright © 2020-2023  润新知