我最近决定在花了一两年的时间学习如何用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查找正确的图像并进行适当的缩放?
答案 0 :(得分:6)
至少从Cocos2d-x版本2.0.4开始,您可以创建Resources文件夹的单独子目录,并选择在运行时使用哪个子目录。如果在那里找不到资源,Cocos2d-x将自动回退到Resource文件夹而不是set子目录。这些都在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”。如果它没有找到它,它会在放弃之前在Resources文件夹的根目录中查找“cookie.png”。
祝你搬运好运! :)
- 编辑DPI -
在较新版本的Cocos2d-x(建议使用的用户)中显然有一个函数CCDevice::getDPI()
,我在版本2.1.3中找到了它。但是,除非你绝对需要以相同的物理尺寸显示所有内容,否则我建议你让实际尺寸浮动一点,并专注于匹配1:1的分辨率。如果你开始扩展东西,它们看起来会很模糊。此外,我不认为在不同的屏幕尺寸下相同的分辨率是常见的。我知道有几种物理尺寸的屏幕,例如全高清,但我认为所有的肖像都非常接近,所有的平板电脑都非常接近。
我不知道,您当然可以创建一个应用程序,其中应用程序中元素的物理屏幕大小非常重要。一个测量应用程序,你可以把东西放在屏幕上并以厘米或其他东西来衡量它们。如果是这种情况,那么当然屏幕尺寸是最重要的,你可能想要查看CCDevice::getDPI()
函数。