webentwicklung-frage-antwort-db.com.de

Umgang mit unterschiedlichen Auflösungen von iOS-Geräten in SpriteKit

Ich spiele mit SpriteKit in Xcode 6 und iOS 8 Beta 5 herum. Auf dem iPhone 4S-Simulator ist alles übersichtlich und funktioniert einwandfrei. Beim Umschalten auf das 5S werden jedoch die Elemente am unteren Rand des Bildschirms abgeschnitten.

Meines Erachtens sollte die untere linke Ecke des iPhone-Bildschirms CGPoint (0, 0) sein. Nach dem Überprüfen der Position durch Drucken der Koordinaten auf der Konsole befand sich der niedrigste Punkt der linken Ecke, auf den ich klicken konnte, in der Nähe (5, 44). Ist in meinem Szenen-Setup etwas falsch, das dies verursacht?

Es wurden keine Änderungen an der GameViewController-Datei vorgenommen, und auch nach dem Entfernen der GameScene-Datei bleibt das Problem bestehen.

Kann mich jemand damit zumindest in die richtige Richtung weisen?

50
Sawyer05

Hinzufügen des folgenden Codes wird Beheben Sie Ihr Problem (Code ist in Swift):

scene.scaleMode = SKSceneScaleMode.ResizeFill

Wenn Sie nun wissen möchten, warum dies Ihr Problem behebt, was Ihr Problem tatsächlich ist und wie Sie mit mehreren Auflösungen umgehen - ich schlage vor, Sie lesen weiter.

Es gibt drei Faktoren, die sich auf die Position von Knoten in Ihrer Szene auswirken können.

1) Ankerpunkt
Stellen Sie sicher, dass der Ankerpunkt Ihrer Szene auf (0,0) unten links eingestellt ist. Standardmäßig beginnt der Ankerpunkt der Szene bei (0,0), daher gehe ich davon aus, dass dies das Problem nicht verursacht.

2) Größe
Überprüfen Sie die Größe Ihrer Szene. Normalerweise passe ich meine Szenengröße an die Größe des Geräts an (d. H. IPad, iPhone 4 Zoll, iPhone 3,5 Zoll) und platziere dann eine weitere Ebene in der Szene, um meine Knoten zu speichern. Dadurch kann ich einen Bildlaufeffekt für Geräte mit kleineren Auflösungen ausführen, dies hängt jedoch natürlich von Ihrem Spiel ab. Meine Vermutung ist, dass Ihre Szenengröße auf 320, 480 eingestellt sein könnte, was zu Positionierungsproblemen auf Ihrem iPhone 5s führen könnte.

3) Skalierungsmodus
Der Skalierungsmodus hat einen großen Einfluss auf die Positionierung von Knoten in Ihrer Szene. Stellen Sie sicher, dass Sie den Skalierungsmodus auf etwas einstellen, das für Ihr Spiel sinnvoll ist. Der Skalierungsmodus wird aktiviert, wenn Ihre Szenengröße nicht der Größe der Ansicht entspricht. Mit dem Skalierungsmodus soll Sprite Kit wissen, wie mit dieser Situation umgegangen werden soll. Ich vermute, dass Sie die Szenengröße auf 320.480 eingestellt haben und die Szene so skaliert wird, dass sie mit der iPhone 5-Ansicht übereinstimmt, was zu Positionierungsproblemen führt, die mit den von Ihnen beschriebenen identisch sind. Nachfolgend finden Sie die verschiedenen Skalierungsmodi, die Sie für Ihre Szene einstellen können.

SKSceneScaleMode.AspectFill

Der Skalierungsfaktor jeder Dimension wird berechnet und der größere der beiden ausgewählt. Jede Achse der Szene wird mit demselben Skalierungsfaktor skaliert . Dies garantiert, dass der gesamte Bereich der Ansicht ausgefüllt ist, kann jedoch dazu führen, dass Teile der Szene beschnitten werden.


SKSceneScaleMode.AspectFit

Der Skalierungsfaktor jeder Dimension wird berechnet und der kleinere der beiden ausgewählt. Jede Achse der Szene wird mit demselben Skalierungsfaktor skaliert . Dies garantiert, dass die gesamte Szene sichtbar ist, erfordert jedoch möglicherweise ein Letterboxing in der Ansicht.


SKSceneScaleMode.Fill

Jede Achse der Szene wird unabhängig skaliert , sodass jede Achse in der Szene genau der Länge dieser Achse in der Ansicht entspricht.


SKSceneScaleMode.ResizeFill

Die Szene ist nicht entsprechend der Ansicht skaliert. Stattdessen wird die Szene automatisch in der Größe angepasst , sodass ihre Abmessungen immer mit denen der Ansicht übereinstimmen.


Fazit
Es sieht so aus, als ob Sie die Skalierung Ihrer Szene entfernen möchten. Auf diese Weise stimmen Ihre Positionen in der Szene mit den tatsächlichen Positionen in der Ansicht überein. Sie können entweder die Größe Ihrer Szene so einstellen, dass sie der Ansichtsgröße entspricht. In diesem Fall findet keine Skalierung statt. Oder Sie können den Skalierungsmodus Ihrer Szene auf ResizeFill setzen, wodurch die Größe der Szene immer der Größe Ihrer Ansicht entspricht und nichts skaliert wird. Im Allgemeinen würde ich mich von jeglicher Skalierung fernhalten und stattdessen die Benutzeroberfläche und die Szenengröße so anpassen, dass sie am besten zu jedem Gerät passen. Möglicherweise möchten Sie auch Zoom und/oder Bildlauf hinzufügen, damit Geräte mit geringerer Auflösung dasselbe Anzeigefeld erzielen.


Aber was ist, wenn ich meine Szene skalieren möchte?
Wenn Sie jedoch Ihre Szene skalieren müssen, aber dennoch möchten, dass die Positionen relativ zur Ansicht sind (dh Sie möchten, dass (0,0) auch bei ausgeschnittener Szene links unten auf dem Bildschirm angezeigt wird), sehen Sie my Antwort hier


Zusätzliche Informationen
Siehe Antwort hier für Beispielcode, der zeigt, wie ich Knoten dynamisch anlege.

Siehe Antwort hier für weitere Details zur Skalierung zur Unterstützung mehrerer Geräte.

113
Epic Byte

Wenn Sie die Größe Ihrer Szene beibehalten möchten (normalerweise gewünscht, wenn Sie mit einem festen Größen- und Koordinatensystem arbeiten), können Sie zu beiden Seiten der Szene Auffüllungen hinzufügen. Dies würde den Briefkasten entfernen und die gesamte Physik und Dynamik Ihrer App auf jeder Plattform erhalten.

Ich habe ein kleines Framework erstellt, um Ihnen dabei zu helfen:

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

Gerade:

  1. Laden Sie die Zip-Datei für das Repository herunter
  2. Öffnen Sie den Unterordner "SceneSizer"
  3. Ziehen Sie den SceneSizer.framework-Legoblock in Ihr Projekt
  4. Stellen Sie sicher, dass das Framework eingebettet und nicht nur verknüpft ist
  5. Importiere das Framework irgendwo in deinen Code import SceneSizer

Und wenn Sie fertig sind, können Sie die Sizer-Klasse jetzt mit folgendem Befehl aufrufen: SceneSizer.calculateSceneSize(#initialSize: CGSize, desiredWidth: CGFloat, desiredHeight: CGFloat) -> CGSize

2
Tokuriku

Nur für den Fall, versuchen Sie CMD + 1, arbeitete für mich. Einige der Elemente wurden abgeschnitten, weil sie einfach nicht im Simulator angezeigt wurden - ich betone dies, dies ist nur eine Simulator-Funktion (und ein Fehler, wenn Sie mich fragen, verschwendete Stunden Zeit, um dies zu lösen). In CMD + 2- und CMD + 3-Ansichten können manchmal Teile der Szene ausgeblendet werden.

0