问题
I am porting my cocos2d iPhone game to android using cocos2d-x. I am now facing a problem with screen resolution: I want to use one high resolution image in my game which should be supportable by all screens lower then a given resolution.
I read this nice tutorial of multiple resolution on forum . It's really helpful, but I am not achieving my solution. There is explanation of scale-factor of resource of Design Resolution & Resource Resolution.
But, in my case, it scales either height wise or width wise. Not a perfect scaling of my image. Can someone clarify why for me?
回答1:
In AppDeligate.cpp add the following lines to
bool AppDelegate::applicationDidFinishLaunching() after the glview is set.
CCEGLView *ev = CCEGLView::sharedOpenGLView();
ev->setDesignResolutionSize(480, 320, kResolutionShowAll);
480, 320 being the resolution you designed your app for. If you want portrait use 320, 480 instead. This solution will show black borders if the phone aspect ratio doesn't match the 480/320 aspect ratio.
回答2:
In AppDelegate.cpp
This is for landscape Mode
bool AppDelegate::applicationDidFinishLaunching()
{
// initialize director
director = CCDirector::sharedDirector();
EGLView = CCEGLView::sharedOpenGLView();
director->setOpenGLView(EGLView);
CCSize screenSize = EGLView->getFrameSize();
CCSize designSize = CCSizeMake(800, 480);
EGLView->setDesignResolutionSize(designSize.width,designSize.height, kResolutionExactFit);
if(screenSize.height > 480 && screenSize.height < 720 )
{
CCSize resourceSize = CCSizeMake(960, 540);
director->setContentScaleFactor(resourceSize.height/screenSize.height);
CCLog("Resolution Scale OF Karboon=%f",resourceSize.width/screenSize.width);
}
else if (screenSize.height >= 720 && screenSize.height < 800)
{
CCSize resourceSize = CCSizeMake(1280, 720);
director->setContentScaleFactor(resourceSize.height/screenSize.height);
CCLog("Resolution Scale OF NOTE=%f",resourceSize.width/screenSize.width);
}
else if(screenSize.height > 800)
{
CCSize resourceSize = CCSizeMake(1920, 1080);
director->setContentScaleFactor(resourceSize.height/screenSize.height);
CCLog("Resolution Scale OF Nexus=%f",resourceSize.width/screenSize.width);
}
else
{
director->setContentScaleFactor(1);
CCLog("Resolution Scale OF S Advance=%f");
}
return true;
}
回答3:
Here is some code that might help You make following folders in "Resource" folder
ipadhd ipad iphone
Use this code in Appdelegate.cpp in applicationdidfinishing method
CCSize screenSize = pEGLView->getFrameSize();
//set design size for iPad retina
CCSize designSize = CCSize(2048, 1536);
CCEGLView::sharedOpenGLView()->setDesignResolutionSize(designSize.width, designSize.height, kResolutionExactFit);
if (screenSize.height > 768) {
CCFileUtils::sharedFileUtils()->setResourceDirectory("ipadhd");
} else if (screenSize.height > 320) {
CCFileUtils::sharedFileUtils()->setResourceDirectory("ipad");
} else {
CCFileUtils::sharedFileUtils()->setResourceDirectory("iphone");
}
pDirector->setContentScaleFactor(screenSize.height/designSize.height)
Hope this helps.Put your images accordingly for iphone in iphone folder,ipad images in ipad folder and hd images in ipadhd folder. pDirector here is CCDirector variable.
回答4:
i followed this nice tutorial http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Multi_resolution_support
This way it worked for me. i used one high Resolution image
AppDelegate.cpp
typedef struct tagResource
{
cocos2d::CCSize size;
char directory[100];
}Resource;
static Resource smallResource = { cocos2d::CCSizeMake(320,480), "iphone" };
static Resource mediumResource = { cocos2d::CCSizeMake(768,1024), "ipad" };
static Resource largeResource = { cocos2d::CCSizeMake(1536,2048), "ipadhd" };
static cocos2d::CCSize designResolutionSize = cocos2d::CCSizeMake(640,1024);
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
CCSize frameSize = pDirector->getOpenGLView()->getFrameSize();
pEGLView->setDesignResolutionSize( designResolutionSize.width, designResolutionSize.height, kResolutionExactFit);
if ((frameSize.height > mediumResource.size.height))
{
pDirector->setContentScaleFactor(largeResource.size.height/designResolutionSize.height);
}
// if the frame's height is larger than the height of small resource size, select medium resource.
else if ((frameSize.height > smallResource.size.height))
{
pDirector->setContentScaleFactor(mediumResource.size.height/designResolutionSize.height);
}
// if the frame's height is smaller than the height of medium resource size, select small resource.
else
{
pDirector->setContentScaleFactor(smallResource.size.height/designResolutionSize.height);
}
CCDirector::sharedDirector()->setContentScaleFactor(1.f);
来源:https://stackoverflow.com/questions/17948382/multi-resolution-support-for-all-android-devices