Question

J'ai créé une version Android en utilisant cocos2dx pour l'appareil ayant une taille 480*320 et ça fonctionne bien mais quand je mets la même version dans un autre appareil Android ayant la taille 640*480 le problème de mise à l'échelle se produit....

J'utilise le code suivant pour redimensionner automatiquement, mais cela ne fonctionne pas :

AppDelegate app;
CCEGLView& eglView = CCEGLView::sharedOpenGLView();
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);
Était-ce utile?

La solution

Tout d'abord, le code que vous avez collé est du fichier Main.CPP qui ne joue pas à une pièce lorsque vous compilez l'application pour Android ou Windows Phone ou iOS.Ce fichier est pour le projet Win32.

maintenant, Pour la mise à l'échelle automatique de l'application, la fonction dans Appdelegate.cpp doit définir la résolution de conception ainsi que la politique.J'utilise la stratégie ExactFit car elle étend l'application pour remplir la zone d'écran entière et fonctionne sur Android, Windows, iOS Tout (j'ai développé des applications et testées):

bool AppDelegate::applicationDidFinishLaunching()
{
    // initialize director
    CCDirector *pDirector = CCDirector::sharedDirector();
    pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
    // turn on display FPS
    CCEGLView::sharedOpenGLView()->setDesignResolutionSize(1200, 720, kResolutionExactFit);
    pDirector->setDisplayStats(false);

    pDirector->setAnimationInterval(1.0 / 60);

    CCScene *pScene = HelloWorld::scene();

    pDirector->runWithScene(pScene);
    return true;
}

Vous devez également jeter un coup d'œil à Cette explication détaillée du support multi-résolution pour mieux le comprendre.

Autres conseils

Si vous n'êtes pas conscient du regard étiré, faites cela. Cela fonctionnera sur tous les appareils.

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);

Remarque: Le réglage ci-dessus est destiné au paysage, si vous en avez besoin pour le portrait, inversez les valeurs telles que PeglView-> SetDesignresolutionsIser (640, 960, KRESULESolutionEcTfit)

La chose à comprendre ici est que tout ce que vous concevez sur les coordonnées de 640x960 et KRESolutionExactFit fixera les choses correspondant à l'écran. Pour ce faire, vous devez utiliser plus facilement Coocos Builder http://cocosbuilder.com/ et concevoir tout sur une disposition personnalisée de 640x960

Je recommande une double résolution (640x960) car cette façon de la qualité ne sera pas réduite et semblera nette sur tous les types d'appareils, mais l'inconvénient d'aspect étiré serait là.

Si vous souhaitez envisager de multiples résolutions de manière multiple, vous devez créer plusieurs graphismes et plusieurs dispositions, encore une fois Cocos Builder serait le meilleur moyen de le faire.

I.e pour iPhone 5 Ce serait diff et pour iPad et standard 480x320, ce serait diff. Pour ce faire, vous pouvez mettre des contrôles sur la taille de l'image pour sélectionner une vue respective.

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

Vous devriez ressentir quelques coupures de chaque côté.Ceci est fait car c'est la meilleure façon pour le mode de compatibilité de correspondre à la résolution d'écran de 480x320.Les autres options consistent à laisser une partie de la hauteur ou à étirer l'image (au prix d'une certaine performance (?) ).

La première peut être facilement réalisée CCEGLView::create méthode, vous pouvez changer le MIN en MAX dans la formule du facteur d'échelle et c'est fait, mais cela cassera probablement tout y position de vos sprites :P

bool AppDelegate::applicationDidFinishLaunching()
{
    // initialize director
    CCDirector* pDirector = CCDirector::sharedDirector();
    CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();

    pDirector->setOpenGLView(pEGLView);

    // Set the design resolution
    // iPad size
    CCPoint res = CCPoint(768,1024);
    pEGLView->setDesignResolutionSize(res.x,
                                      res.y,
                                      kResolutionNoBorder);
  .....
}

Vérifiez la résolution et apportez des modifications à la taille de l'écran: (Cet exemple est un jeu de portrait)

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);

J'utilise cocos2dx v3 mais l'idée est la même pour v2.

J'ai utilisé la politique de résolution à la suite de mon jeu 3Match Dans Appdelerate.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;
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top