0

在花了一两年时间学习如何使用 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),您不应该使用资源中的子目录文件夹。那么如何找出设备使用的密度呢?

我试过使用 int

getResources().getDisplayMetrics().density;

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

4

1 回答 1

6

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

例如,你可以做这样的事情

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()(用户在评论中建议),我在 2.1.3 版本中找到了它。但是,除非您绝对需要所有东西都以相同的物理尺寸出现,否则我建议您让事物的真实尺寸浮动一点,并专注于匹配 1:1 的分辨率。如果您开始缩放事物,它们会看起来很模糊。此外,我不认为在不同的屏幕尺寸下相同的分辨率是常见的。例如,我知道有几种物理尺寸的全高清屏幕,但我认为所有纵向屏幕都非常接近,所有平板电脑也一样。

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

于 2013-06-02T00:41:01.827 回答