Cocos 2 d-xマルチ解像度適合完全解析

6940 ワード

原文の住所:http://www.tairan.com/archives/4809
Cococos 2 d-x 2.0.4から、Cocococos 2 d-xは自分のマルチ解像度サポートプランを提出し、以前のretina関連設定インターフェースを廃棄し、design reolution概念を提出しました。以下の関連インターフェースがあります。
CCEGLView::sharedOpenGLView()->setDesignResolutionSize() //           CCDirector::sharedDirector()->setContentScaleFactor() //       CCFileUtils::sharedFileUtils()->setResourceDirectory() //deprecated CCFileUtils::sharedFileUtils()->setSearchPaths() //       CCEGLView::sharedOpenGLView()->getFrameSize() //      CCDirector::sharedDirector()->getWinSize() //      CCDirector::sharedDirector()->getVisibleSize() //            CCDirector::sharedDirector()->getVisibleOrigin() //           
cococos 2 d-2.1 beta 3-x-2.5.1から、CCFileUtils::shared FileUtils()->sets Resource Directory()は、新しいインターフェースCCFileUtils:shared FileUtils()->set Search Pathsに置き換えられます。
Cocos 2 d-x 2.1.3から、2種類のResolutionPolicy(kResolution FixedHeight、kResolution Fixedwidth)を新たに加入しました。全部で5つのモードです。
公式はMulti_にあります。reolution_supportとMechannism_of_loading_レスキューに紹介があります。
本論文では、エンジン使用者の観点からCococos 2 d-xのマルチ解像度適合技術を分析する。
Retinaからdesign reolutionまで
Cocos 2 d-x 2.0.4前にRetinaという概念がありましたが、これはcocococos 2 d-iphoneから来た概念です。
cococococos 2 d-iphoneはRetina iphoneデバイスをサポートするために、-hdなどのサフィックスを使って、iphoneとRetine iphoneの画像リソースを区別します。ゲームを設計する時は、本格的なpixel座標系ではなく、point座標系を使います。この点とiOS nativeアプリケーション開発によって提案されたpoint概念は、コードを修正することなく640で実行できます。×960の設備は走る前に320×480のプログラムは、画像だけがぼやけて見えますが、@2 xの画像を入れると、iOSが@2 xの画像を自動的にロードし、Retna iphoneのサポートを実現します。
point座標系は、一定の範囲で多解像度サポートの問題を解決できます。しかし、iphone 5、ipad 3が出たら、iOSは全部で5つの解像度が必要です。universalのプログラムを作ると、かなり苦しいです。point座標系は完全に問題を解決することができず、android上の解像度状況はより複雑である。
design resolutionはpoint座標系から進化してきた概念であるべきで、遮蔽装置の分解能を目的として、精霊座標はdesign resolution上に配置されているが、この目標を実現するのは簡単ではない。Cocos 2 d-xは関連するインターフェースのセットと5つの解像度適応戦略を提供しています。どちらの戦略が必要ですか?
リソース解像度、設計解像度、画面解像度
Resources width以下はRW、Resources height以下はRHと略して書きます。
Design width以下はDW、Design height以下はDHと略して書きます。
Sreen width以下はSWと略し、Sreen height以下はSHと略します。
SDKのsamplesにハローCppプロジェクトがあります。マルチ解像度スキームの使用方法を示した。以下はハローCppのアプリMacros.hで構成は基本的に同じですが、幅の高い数値を交換して、縦画面のゲームを例にします。
Cococos 2 d-xイメージには次の2つのロジックがあります。解像度を設計して、画面に解像度レイアウトを設計します。
下図のように:
インターフェースsetContectScaleFactor()とset Search Paths()は最初の変換過程を制御している。set Design ResolutionSize()は第二のプロセスを制御します。二つの過程を結合して,最終的な表示効果に影響した。
リソース解像度から設計解像度まで
SetSearch Paths()は現在のスクリーン解像度に応じて適切な設定をする必要があります。ハローCppは簡単なセットを示していますが、最適ではないかもしれません。
setContectScaleFactor()は、画像をスクリーンに表示するスケーリング係数を決定しましたが、このインターフェースのパラメータは、リソースピクチャの幅、高さをスクリーンより広く、より高いものではありません。Cococos 2 d-xエンジンの設計は、ゲーム開発者が直接スクリーンに注目するのをブロックしようとしています。だから、この因子は資源が広く、設計解像度よりも高いです。
setContectScaleFactor()は通常2つの方法でパラメータを設定します。RH/DHまたはRW/DWは、異なる因子選択が異なるスケーリング負の効果を持つ。まず一枚の図を見てください。高度比をコンテンツのスケーリング係数として使用して、背景リソースの垂直方向が設計解像度範囲内のすべての表示を保証します。
幅比をコンテンツスケーリング因子として用いて,背景リソースの水平方向の設計解像度範囲内のすべての表示を保証した。
設計解像度からスクリーン解像度まで
set DesignResolutionSize(DW,DH,resolution Policy)は三つのパラメータがあり、設計解像度が広く、設計解像度が高く、解像度が高い策略があります。前の二つはよく分かります。複雑な点は解像度戦略の選択にあります。
まず、kResolutionExact Fit、kResolutionNoBorder、kResolutionShowAllの3つの状況を見にきて、2.1.3新規加入の戦略は後で分析します。3つの戦略の設計解像度はいずれも着信値であり、内部は修正しない。
まず図を見ます
kResoloution ShowAll
スクリーンの幅、高さ、それぞれの解像度、幅、高計算スケーリング係数は、より小さい(小さい)ものを、幅、高スケーリング係数として採用します。デザインエリアがすべて画面に表示されることを保証していますが、黒縁があるかもしれません。
kResoloution Exact Fit
スクリーンの幅と設計幅の比はX方向のスケーリング係数として、スクリーンの高さはY方向のスケーリング係数として設計されています。デザインエリアは完全にスクリーンに敷き詰められていますが、画像が引き伸ばされる可能性があります。
kResoloution NoBorder
スクリーンの幅、高さ、それぞれの解像度、幅、高計算スケーリング係数は、幅、高さのスケーリング係数としてより多く(大きい)をとる。デザインエリアは常に一つの方向にスクリーンを敷き詰め、もう一つの方向は一般的にスクリーンエリアを超えています。
KResoloution NoBorderは、以前の公式推薦で使用されたスキームです。彼は画像を引き伸ばしていません。一方の方向にスクリーンをいっぱい張っていますが、2.1.3新しく追加された2つの戦略はkResolution NoBorderの地位を揺り動かすことになります。
KResoloution FixedhtとkResolution FixedWidthはいずれも内部で設計解像度を修正して、画面の解像度が設計解像度まで伸びずに画面に敷き詰められます。図のように:
kResoloution Fixediht
導入された設計解像度の高さをそのままにして、画面解像度に応じて設計解像度の幅を修正します。
kResoloution Fixedth
導入された設計解像度の幅をそのままにして、画面解像度に応じて設計解像度の高さを修正します。
二つの過程を結び付ける
第1のプロセスは2つの場合があり、第2のプロセスは5つの場合があり、1つの解像度で10つの可能なスキームの組み合わせがある。どのように自分の必要なものを選びますか?犠牲効果ですか?それとも犠牲部分表示領域ですか?
ここでは選択者が一方向を犠牲にした表示領域を例に挙げ,結果は二つの過程を示している。私のゲームの中では、背景図の高さは全部表示する必要がありますが、広い方向は縮小できます。
この目的を実現するには、二つの過程が幅の広い方向で縮小されることを保証する必要があります。
  • 第1のプロセスは、setContectScaleFactor(RH/DH)
  • を選択する。
  • 第二のプロセスには二つの選択があります。kResolutionNoBorderとkResolutionFixediht
  • 両者の違いを説明するためには、Visible OriginとVisible Sizeを結合する必要があります。図を見る
    kResolutionNoBorderの場合、設計解像度は可視領域ではなく、我々のレイアウトの精霊はVisible OriginとVisible Sizeに基づいて判断処理を行う必要があります。
    kResoloution Fixedihtは違っています。設計解像度は可視領域で、Visible Originはいつも(0,0)getVisible Size()=get WinSize()、kResolution Fixedihtは同じ目的を達成しましたが、コードを簡略化しました。
    kResoloution FixedihtとkResolutionFixedthはkResolution NoBorderの進化で、新しいプロジェクトではすぐにこの2つの方法を使うことを提案します。
    結び目
    kResoloution Fixediht
    高い方向に対応しているので、幅が広い方向でカットできるゲームは、セットコンテントScreat Factor(RH/DH)と組み合わせて使います。
    kResoloution Fixedth
    幅広い方向に対応しているので、方向性の高いカットが可能なゲームは、セットコンテントScreFactor(RW/DW)と組み合わせて使用します。
    tip:AppMacs.hの中の幅の高さを正しく設定して、横画面のゲームと縦画面のゲームの違いに注意します。