cambio de tamaño automático en cocos2dx

He creado Android utilizando cocos2dx para el dispositivo que tiene un tamaño de 480 * 320 y funciona bien, pero cuando pongo la misma compilation en otro dispositivo Android con un tamaño de 640 * 480 , se produce el problema de escalado.

Estoy usando el siguiente código para cambiar el tamaño automáticamente, pero no funciona:

AppDelegate app; CCEGLView& eglView = CCEGLView::shanetworkingOpenGLView(); eglView.setViewName("Hello Lua"); eglView.setFrameSize(480, 320); // set the design resolution screen size, if you want to use Design Resoulution scaled to current screen, please uncomment next line. // eglView.setDesignResolutionSize(480, 320); 

En primer lugar, el código que ha pegado es del file main.cpp que no juega un papel cuando comstack la aplicación para Android o Windows Phone o iOS. Ese file es para el proyecto win32.

Ahora, para la escala automática de la aplicación, la function en AppDelegate.cpp debe establecer la resolución de layout, así como la política. Uso la política de ExactFit porque estira la aplicación para llenar el área de pantalla completa y funciona en Android, Windows, iOS, todo (he desarrollado aplicaciones y probado):

 bool AppDelegate::applicationDidFinishLaunching() { // initialize director CCDirector *pDirector = CCDirector::shanetworkingDirector(); pDirector->setOpenGLView(CCEGLView::shanetworkingOpenGLView()); // turn on display FPS CCEGLView::shanetworkingOpenGLView()->setDesignResolutionSize(1200, 720, kResolutionExactFit); pDirector->setDisplayStats(false); pDirector->setAnimationInterval(1.0 / 60); CCScene *pScene = HelloWorld::scene(); pDirector->runWithScene(pScene); return true; } 

También debería echar un vistazo a esta explicación detallada del soporte de resolución múltiple para comprenderlo mejor.

Si no eres consciente de la apariencia estirada, haz esto. Funcionará en todos los dispositivos.

 pDirector->setOpenGLView(pEGLView); CCSize frameSize = pDirector->getOpenGLView()->getFrameSize(); CCLog("%.2f and %.2f is Frame size\n",frameSize.width,frameSize.height); pEGLView->setDesignResolutionSize(960, 640, kResolutionExactFit); 

Nota: la configuration anterior es para Paisaje, si lo necesita para retrato, invierta los valores como pEGLView-> setDesignResolutionSize (640, 960, kResolutionExactFit)

Lo que hay que entender aquí es que todo lo que diseñe en las coorderadas de 640X960 y kResolutionExactFit arreglará las cosas como ajustadas a la pantalla. Para hacer esto más fácilmente, debe usar Coocos Builder http://cocosbuilder.com/ y diseñar todo en un layout personalizado de 640X960

Recomiendo una resolución doble (640X960) porque de esta forma la calidad no se networkingucirá y se verá nítida en todo tipo de dispositivos, sin embargo, el inconveniente de Stretched Look estaría allí.

Si desea considerar varias resoluciones de múltiples maneras, debe hacer múltiples charts y múltiples layouts, de nuevo Cocos Builder sería la mejor manera de hacerlo.

es decir, para el iPhone 5 sería diff y para el iPad y el estándar 480X320 sería diff. Para hacer esto, puede poner verificaciones en el tamaño del marco para seleccionar la Vista respectiva.

 CCSize frameSize = pDirector->getOpenGLView()->getFrameSize(); 

Deberías experimentar un corte en cada lado. Esto se hace porque es la mejor manera de que el modo de compatibilidad coincida con la resolución de pantalla de 480×320. La otra opción está dejando alguna parte de la altura o estirando la image (al costo de algún performance (?)).

El primero puede ser fácil de hacer con el método CCEGLView::create , puedes cambiar el MIN a MAX en la fórmula scalefactor y está hecho, pero esto probablemente romperá toda la position de tus sprites: P

 bool AppDelegate::applicationDidFinishLaunching() { // initialize director CCDirector* pDirector = CCDirector::shanetworkingDirector(); CCEGLView* pEGLView = CCEGLView::shanetworkingOpenGLView(); pDirector->setOpenGLView(pEGLView); // Set the design resolution // iPad size CCPoint res = CCPoint(768,1024); pEGLView->setDesignResolutionSize(res.x, res.y, kResolutionNoBorder); ..... } 

Compruebe la resolución y realice los cambios para el tamaño de la pantalla: (Este ejemplo es un juego de retrato)

 typedef struct tagResource { cocos2d::Size size; char directory[100]; }Resource; std::vector<std::string> searchPath; static Resource designResource = { cocos2d::Size(768, 1024), "ipad"}; static Resource smallResource = { cocos2d::Size(320, 480), "iphone"}; static Resource galax7Resource = { cocos2d::Size(600, 1024), "gt_7p" }; static Resource mediumResource = { cocos2d::Size(768, 1024), "ipad"}; static Resource galax10Resource = { cocos2d::Size(800, 1280), "gt_10p"}; static Resource fullHDResource = { cocos2d::Size(1080, 1920), "fullhd"}; static Resource largeResource = { cocos2d::Size(1536, 2048), "ipadhd"}; auto director = Director::getInstance(); auto glview = director->getOpenGLView(); glview->setDesignResolutionSize(designResource.size.width, designResource.size.height, ResolutionPolicy::EXACT_FIT); Size frameSize = glview->getFrameSize(); Resource realResource; // if the frame's height is larger than the height of medium size. if (frameSize.height > fullHDResource.size.height) { realResource = largeResource; CCLOG("largeResource"); } else if (frameSize.height > galax10Resource.size.height) { realResource = fullHDResource; CCLOG("fullHDResource"); } else if (frameSize.height > mediumResource.size.height) { realResource = galax10Resource; CCLOG("galax10Resource"); } else if (frameSize.height > smallResource.size.height) { if(frameSize.width > galax7Resource.size.width){ realResource = mediumResource; CCLOG("mediumResource"); }else { realResource = galax7Resource; CCLOG("galax7Resource"); } } else { realResource = smallResource; CCLOG("smallResource"); } director->setContentScaleFactor(MIN(realResource.size.height/designResource.size.height, realResource.size.width/designResource.size.width)); searchPath.push_back(realResource.directory); auto fileUtils = FileUtils::getInstance(); fileUtils->setSearchPaths(searchPath); 

Estoy usando cocos2dx V3, pero la idea es la misma para V2.

He utilizado la siguiente política de resolución en mi juego 3match En AppDelegate.cpp

 #define IS_LANDSCAPE #ifdef IS_LANDSCAPE static cocos2d::Size designResolutionSize = cocos2d::Size(1136,768); #else static cocos2d::Size designResolutionSize = cocos2d::Size(768,1136); #endif //========================== bool AppDelegate::applicationDidFinishLaunching() { // initialize director auto director = Director::getInstance(); auto glview = director->getOpenGLView(); if(!glview) { glview = GLViewImpl::create("My Game"); director->setOpenGLView(glview); } // turn on display FPS director->setDisplayStats(false); // set FPS. the default value is 1.0/60 if you don't call this director->setAnimationInterval(1.0 / 60); // Set the design resolution glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::NO_BORDER); register_all_packages(); // create a scene. it's an autorelease object auto scene =loading::createScene(); // run director->runWithScene(scene); return true; }