【问题标题】:How do I get the screen density using Cocos2d-x?如何使用 Cocos2d-x 获取屏幕密度?
【发布时间】:2013-06-01 23:55:04
【问题描述】:

在花了一两年时间学习如何使用 iOS 进行编码后,我最近决定开始进行 Android 开发。现在我正在尝试将我的 Cocos2d-iphone 代码移植到 Cocos2d-x 上,我完全不知道如何处理所有不同的图像密度。现在,我正在为 480x800 编码,我正在尝试弄清楚如何自动选择要使用的图像密度。我认为(尽管我可能错了)对于原生 java,你为 hdpi、ldpi、mdpi 等创建子目录,设备将自动选择要使用的文件。但是,根据 Wenderlich 的页面 (http://www.raywenderlich.com/33752/cocos2d-x-tutorial-for-ios-and-android-space-game),您不应该使用 Resources 文件夹中的子目录。那么我如何找出设备使用的密度?

我尝试过使用 int

getResources().getDisplayMetrics().density;

但我最终得到一个错误,说“getResources”没有在这个范围内声明。我需要做什么才能让 Cocos2d-x 查找正确的图像并适当地缩放它?

【问题讨论】:

    标签: android eclipse cocos2d-x


    【解决方案1】:

    至少从 Cocos2d-x 版本 2.0.4 开始,您可以为 Resources 文件夹创建单独的子目录,并选择在运行时使用哪一个。如果没有找到资源,Cocos2d-x 会自动回退到 Resource 文件夹而不是你设置的子目录。这在 Cocos2d-x wiki 中都有描述 here。

    例如,你可以这样做

    const CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    // Landscape
    if( winSize.height < winSize.width) {
        if( winSize.width >= 1536 ) {
            // iPad Retina here.
            CCFileUtils::sharedFileUtils()->setResourceDirectory( "iPadRetina" );
        } else {
            // Some lower resolution tablet stuff.
            CCFileUtils::sharedFileUtils()->setResourceDirectory( "lowResTablet" );
        }
    }
    // Portrait
    else {
        if ( winSize.width >= 720 ) {
            // Phones like Galaxy Nexus.
            CCFileUtils::sharedFileUtils()->setResourceDirectory( "720" );
        } else if ( winSize.width >= 640 ) {
            // iPhone retina
            CCFileUtils::sharedFileUtils()->setResourceDirectory( "iPhoneRetina" );
        } else {
            // Low res phone.
            CCFileUtils::sharedFileUtils()->setResourceDirectory( "lowResPhone" );
        }
    }
    

    您从AppDelegate::applicationDidFinishLaunching() 函数中调用上述代码来告诉Cocos2d-x 使用正确的资源子目录。假设您已将目录“iPhoneRetina”设置为您的资源目录。那么当你这样做时

    CCSprite *sprite = CCSprite::create( "cookie.png" );
    

    Cocos2d-x 将首先查找文件“iPhoneRetina/cookie.png”。如果在那里找不到它,它会在放弃之前在资源文件夹的根目录中查找“cookie.png”。

    祝您移植顺利! :)

    -- 编辑 DPI --
    在 Cocos2d-x 的较新版本中显然有一个函数CCDevice::getDPI()(建议使用 cmets 用户),我在 2.1.3 版本中找到了它。但是,除非您绝对需要所有东西都以相同的物理尺寸出现,否则我建议您让事物的真实尺寸浮动一点,并专注于匹配 1:1 的分辨率。如果您开始缩放事物,它们会看起来很模糊。此外,我不认为在不同的屏幕尺寸下相同的分辨率是常见的。例如,我知道有几种物理尺寸的全高清屏幕,但我认为所有纵向屏幕都非常接近,所有平板屏幕也是如此。

    我不知道,您当然可以制作一个应用程序中元素的物理屏幕尺寸非常重要的应用程序。一个测量应用程序,您可以在其中将东西放在屏幕上并以厘米或其他东西为单位进行测量。如果是这种情况,那么屏幕大小当然是重中之重,您可能需要查看 CCDevice::getDPI() 函数。

    【讨论】:

    • 感谢您的信息。我觉得你回答了我的问题,但我理解得太慢了。我今天早些时候阅读了该页面,但不明白密度如何与该代码相匹配。如何处理两台设备“分辨率”相同但密度不同的情况?
    • 我想澄清一下,我认为我的“正常”分辨率文件夹中需要多个图像。我会添加 ldpi、hpdi 和 mdpi 作为后缀,查看屏幕密度,设置比例因子并选择要加载的文件。我是不是想太多了?
    • 有CCDevice::getDPI(),可以从DPI推断Device Independent Pixel的密度或大小。
    • 密度在某些情况下非常重要。例如,如果您想制作一个非常小的按钮并确保其尺寸(以厘米为单位)足够大以方便轻按,则必须考虑 DPI,因为您必须知道像素如何转换为绝对测量单位(例如厘米)。
    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多