سؤال

لقد قمت بإنشاء نظام Android باستخدام cocos2dx للجهاز ذي الحجم 480*320 وهو يعمل بشكل جيد ولكن عندما أضع نفس البنية في جهاز Android آخر بحجمه 640*480 تحدث مشكلة القياس....

أستخدم الكود التالي لتغيير الحجم تلقائيًا، لكنه لا يعمل:

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);
هل كانت مفيدة؟

المحلول

أولًا، الكود الذي قمت بلصقه هو من ملف main.cpp والذي لا يلعب دورًا عند تجميع التطبيق لنظام Android أو Windows Phone أو iOS.هذا الملف مخصص لمشروع win32.

الآن ، من أجل التحجيم التلقائي للتطبيق ، يجب على الوظيفة في AppDelegate.cpp تعيين دقة التصميم وكذلك السياسة.أستخدم سياسة ExactFit لأنها تعمل على توسيع التطبيق لملء مساحة الشاشة بأكملها وتعمل على كل شيء على Android وWindows وiOS (لقد قمت بتطوير التطبيقات واختبارها):

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

يجب عليك أيضا إلقاء نظرة على هذا الشرح التفصيلي لدعم الدقة المتعددة لفهمها بشكل أفضل.

نصائح أخرى

إذا لم تكن واعيًا بشأن المظهر الممتد، فافعل ذلك.وسوف تعمل على جميع الأجهزة.

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

ملحوظة:الإعداد أعلاه مخصص للمناظر الطبيعية، إذا كنت في حاجة إليه للصورة العمودية، فما عليك سوى عكس القيم مثل pEGLView->setDesignResolutionSize(640, 960, kResolutionExactFit)

الشيء الذي يجب أن تفهمه هنا هو أن كل شيء ستصممه على إحداثيات 640X960 وkResolutionExactFit سيصلح الأشياء كما تناسب الشاشة.للقيام بذلك بسهولة أكبر يجب عليك استخدام Coocos Builder http://cocosbuilder.com/ وتصميم كل شيء على تخطيط مخصص 640X960

أوصي بدقة مزدوجة (640 × 960) لأنه بهذه الطريقة لن تنخفض الجودة وستبدو واضحة على جميع أنواع الأجهزة، ولكن عيب المظهر الممتد سيكون موجودًا.

إذا كنت تريد النظر في دقة متعددة بطرق متعددة، فيجب عليك إنشاء رسومات متعددة وتخطيطات متعددة، مرة أخرى سيكون Cocos Builder هو أفضل طريقة للقيام بذلك.

على سبيل المثال، سيكون الأمر مختلفًا بالنسبة إلى iPhone 5، وبالنسبة إلى iPad والمعيار 480X320، سيكون الأمر مختلفًا.للقيام بذلك، يمكنك وضع علامات على حجم الإطار لتحديد العرض المناسب.

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

يجب أن تواجه بعض القطع في كل جانب.يتم ذلك لأن وضع التوافق يتطابق بشكل أفضل مع دقة الشاشة البالغة 480 × 320.الخيار الآخر هو ترك جزء من الارتفاع للخارج أو تمديد الصورة (على حساب بعض الأداء (؟) ).

الأول يمكن القيام به بسهولة CCEGLView::create الطريقة، يمكنك تغيير MIN إلى MAX في صيغة عامل القياس ويتم ذلك، ولكن من المحتمل أن يؤدي هذا إلى كسر كل شيء y موضع العفاريت الخاصة بك :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);
  .....
}

التحقق من الدقة وإجراء تغييرات على حجم الشاشة:(هذا المثال هو لعبة صورة)

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

أنا أستخدم cocos2dx V3 لكن الفكرة هي نفسها بالنسبة لـ V2.

لقد استخدمت سياسة الدقة التالية في لعبة 3Match الخاصة بي في 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top