web-dev-qa-db-ja.com

SpriteKitでさまざまなiOSデバイス解像度を処理する

Xcode 6、iOS 8 beta 5でSpriteKitをいじっています。すべてがレイアウトされ、iPhone 4Sシミュレーターで完全に動作しますが、5Sに切り替えると、画面の下部の要素が切り取られます。

IPhoneの画面の左下隅はCGPoint(0、0)でなければならないことを理解していましたが、コンソールに座標を印刷して場所を確認した後、左隅の最低点が周りにあることを確認しました(5、 44)。これを引き起こしているシーンのセットアップに何か問題がありますか?

GameViewControllerファイルには変更が加えられておらず、GameSceneファイルを削除しても問題は解決しません。

少なくともこれで私を正しい方向に向けることができますか?

50
Sawyer05

次のコードを追加will問題を修正します(コードはSwiftにあります):

scene.scaleMode = SKSceneScaleMode.ResizeFill

これで問題が解決する理由、問題が実際に何であるか、複数の解像度を処理する方法を知りたい場合は、読み続けることをお勧めします。

シーン内のノードの位置に影響を与える可能性のあるものは3つあります。

1)アンカーポイント
シーンのアンカーポイントが左下(0,0)に設定されていることを確認してください。デフォルトでは、シーンのアンカーポイントは(0,0)で始まるため、問題の原因ではないと想定しています。

2)サイズ
シーンのサイズを確認します。通常、シーンのサイズをデバイスのサイズ(iPad、iPhone 4インチ、iPhone 3.5インチ)に合わせてから、ノードを格納するためにシーンに別のレイヤーを配置します。これにより、解像度の小さいデバイスでスクロール効果を実現できますが、ゲームのコースによって異なります。私の推測では、シーンサイズは320、480に設定されている可能性があり、これがiPhone 5sの位置の問題を引き起こしている可能性があります。

3)スケールモード
スケールモードは、シーン内のノードの配置に大きな影響を与えます。スケールモードをゲームに適したものに設定してください。スケールモードは、シーンのサイズがビューのサイズと一致しないときに開始されます。スケールモードの目的は、この状況に対処する方法をSprite Kitに知らせることです。私の推測では、シーンサイズは320,480に設定されており、iPhone 5のビューに一致するようにシーンがスケーリングされているため、説明したものと同じ位置決めの問題が発生します。以下は、シーンに設定できるさまざまなスケールモードです。

SKSceneScaleMode.AspectFill

各次元のスケーリング係数が計算され、2つのうち大きい方が選択されます。シーンの各軸は、同じ倍率でスケーリングされます。これにより、ビューの領域全体が塗りつぶされますが、シーンの一部が切り取られる場合があります。


SKSceneScaleMode.AspectFit

各次元のスケーリング係数が計算され、2つのうち小さい方が選択されます。シーンの各軸は、同じ倍率でスケーリングされます。これにより、シーン全体が表示されますが、ビューでレターボックス化が必要になる場合があります。


SKSceneScaleMode.Fill

シーンの各軸は独立してスケーリングされているため、シーンの各軸はビューのその軸の長さに正確にマッピングされます。


SKSceneScaleMode.ResizeFill

シーンはビューに合わせて拡大縮小されません。代わりに、シーンは自動的にサイズ変更されるため、その寸法は常にビューの寸法と一致します。


結論
シーンのスケーリングを削除したいようです。そのようにして、シーン内の位置がビュー内の実際の位置と一致します。シーンのサイズをビューのサイズと一致するように設定できます。その場合、スケーリングは行われません。または、シーンのスケールモードをResizeFillに設定すると、常にシーンのサイズがビューのサイズに一致し、何もスケーリングされません。一般的に、私はスケーリングから離れて、代わりに各デバイスに最適なインターフェースとシーンサイズを調整します。また、ズームやスクロールを追加して、解像度の小さいデバイスで同じビューフィールドを実現できるようにすることもできます。


しかし、シーンをスケーリングしたい場合はどうすればいいですか?
。答え ここ


追加情報
ノードを動的にレイアウトする方法を示すサンプルコードについては、回答 here を参照してください。

複数のデバイスをサポートするためのスケーリングの詳細については、回答 こちら をご覧ください。

113
Epic Byte

シーンのサイズを保持する場合(通常、固定サイズと座標系を使用する場合に望ましい)、シーンの両側にパディングを追加することができます。これにより、レターボックスが削除され、任意のプラットフォームでアプリのすべての物理学とダイナミクスが保持されます。

これを支援する小さなフレームワークを作成しました。

https://github.com/Tokuriku/tokuriku-framework-stash

ただ:

  1. リポジトリのZipファイルをダウンロードします
  2. 「SceneSizer」サブフォルダーを開きます
  3. プロジェクトでSceneSizer.framework "lego block"をドラッグします
  4. 単なるリンクではなく、組み込みのフレームワークであることを確認してください
  5. コードのどこかにフレームワークをインポートします_import SceneSizer_

これで、次のようにsizerクラスを呼び出すことができます:SceneSizer.calculateSceneSize(#initialSize: CGSize, desiredWidth: CGFloat, desiredHeight: CGFloat) -> CGSize

2
Tokuriku

念のため、CMD + 1を試してみてください。一部の要素はシミュレータに表示されないために切り取られました-これは単なるシミュレータ機能です(これを解決するために時間を浪費すると言われるとバグです)。 CMD + 2、CMD + 3ビューは、シーンの一部を隠すことがあります。

0