4

サイズ480*320のデバイスに cocos2dx を使用して Android ビルドを作成しましたが、正常に動作しますが、同じビルドをサイズ640*480の別の Android デバイスに配置すると、スケーリングの問題が発生します....

次のコードを使用して自動的にサイズを変更していますが、機能していません。

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

6 に答える 6

4

まず、貼り付けたコードは 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;
}

また、この詳細な説明のマルチ解像度サポートも参照して、理解を深めてください。

于 2014-02-04T21:56:54.733 に答える
3

引き延ばしを意識していない場合は、これを行います。すべてのデバイスで動作します。

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 のカスタム レイアウトですべてを設計する必要があります。

2 倍の解像度 (640X960) をお勧めします。これにより、品質が低下せず、すべての種類のデバイスで鮮明に表示されますが、ストレッチ ルックの欠点が存在します。

複数の方法で複数の解像度を考慮したい場合は、複数のグラフィックスと複数のレイアウトを作成する必要があります。ここでも、Cocos Builder がこれを行うための最良の方法になります。

つまり、iPhone 5 の場合は diff になり、iPad と標準の 480X320 の場合は diff になります。これを行うには、フレーム サイズにチェックを入れて、それぞれのビューを選択します。

CCSize frameSize = pDirector->getOpenGLView()->getFrameSize();
于 2013-03-19T09:20:41.607 に答える
1

You should experience some cutting at each side. This is done because is how best the compatibility mode match the screen res of 480x320. The others option are leaving some part of the height out or stretch the image (at cost of some performance (?) ).

The first can be easy done one the CCEGLView::create method, you can change the MIN to MAX in the scalefactor formula and its done, but this probably will breake all y position of your sprites :P

于 2012-09-13T22:29:50.363 に答える
1
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);
  .....
}
于 2013-09-03T03:21:54.837 に答える
0

解像度を確認し、画面サイズを変更します: (この例は縦長のゲームです)

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でも同じです。

于 2015-09-16T18:53:35.377 に答える