web-dev-qa-db-fra.com

Gérer différentes résolutions d'appareils iOS dans SpriteKit

Je joue avec SpriteKit dans Xcode 6, iOS 8 beta 5. Tout est parfaitement organisé et fonctionne parfaitement sur le simulateur de l'iPhone 4S, cependant lors du passage au 5S, les éléments en bas de l'écran sont coupés.

À ma connaissance, le coin inférieur gauche de l'écran de l'iPhone devrait être CGPoint (0, 0), mais après avoir vérifié l'emplacement en imprimant les coordonnées sur la console, le point le plus bas du coin gauche sur lequel je pouvais cliquer était autour (5, 44). Y a-t-il quelque chose qui ne va pas dans ma configuration de scène qui cause cela?

Aucune modification n'a été apportée au fichier GameViewController et même après avoir supprimé le fichier GameScene, le problème persiste.

Quelqu'un peut-il au moins me diriger dans la bonne direction avec cela?

50
Sawyer05

Ajouter le code suivant le fera résoudre votre problème (le code est en Swift):

scene.scaleMode = SKSceneScaleMode.ResizeFill

Maintenant, si vous voulez savoir pourquoi cela résout votre problème, quel est votre problème et comment gérer plusieurs résolutions - je vous suggère de continuer à lire.

Trois éléments peuvent avoir un impact sur la position des nœuds dans votre scène.

1) Point d'ancrage
Assurez-vous que le point d'ancrage de votre scène est réglé sur (0,0) en bas à gauche. Par défaut, le point d'ancrage de la scène commence à (0,0), donc je suppose que cela ne cause pas le problème.

2) Taille
Vérifiez la taille de votre scène. Je fais généralement correspondre la taille de ma scène à la taille de l'appareil (c'est-à-dire iPad, iPhone 4 pouces, iPhone 3,5 pouces), puis je place un autre calque dans la scène pour stocker mes nœuds. Cela me permet de faire un effet de défilement pour les appareils avec des résolutions plus petites, mais cela dépend bien sûr de votre jeu. Je suppose que la taille de votre scène pourrait être réglée sur 320, 480, ce qui pourrait causer des problèmes de positionnement sur votre iPhone 5s.

3) Mode échelle
Le mode échelle a un effet énorme sur le positionnement des nœuds dans votre scène. Assurez-vous de définir le mode d'échelle sur quelque chose qui a du sens pour votre jeu. Le mode échelle entre en jeu lorsque la taille de votre scène ne correspond pas à la taille de la vue. Le but du mode échelle est donc de faire savoir à Sprite Kit comment gérer cette situation. Je suppose que la taille de la scène est définie sur 320 480 et que la scène est mise à l'échelle pour correspondre à la vue de l'iPhone 5, ce qui entraînera des problèmes de positionnement identiques à ceux que vous avez décrits. Vous trouverez ci-dessous les différents modes d'échelle que vous pouvez définir pour votre scène.

SKSceneScaleMode.AspectFill

Le facteur d'échelle de chaque dimension est calculé et le plus grand des deux est choisi. Chaque axe de la scène est mis à l'échelle par le même facteur de mise à l'échelle. Cela garantit que toute la zone de la vue est remplie, mais peut entraîner le recadrage de certaines parties de la scène.


SKSceneScaleMode.AspectFit

Le facteur d'échelle de chaque dimension est calculé et le plus petit des deux est choisi. Chaque axe de la scène est mis à l'échelle par le même facteur de mise à l'échelle. Cela garantit que la scène entière est visible, mais peut nécessiter une boîte aux lettres dans la vue.


SKSceneScaleMode.Fill

Chaque axe de la scène est mis à l'échelle indépendamment de sorte que chaque axe de la scène correspond exactement à la longueur de cet axe dans la vue.


SKSceneScaleMode.ResizeFill

La scène n'est pas mise à l'échelle pour correspondre à la vue. Au lieu de cela, la scène est automatiquement redimensionnée afin que ses dimensions correspondent toujours à celles de la vue.


Conclusion
Il semble que vous souhaitiez supprimer la mise à l'échelle de votre scène, de cette façon, vos positions dans la scène correspondront aux positions réelles dans la vue. Vous pouvez soit définir la taille de votre scène pour correspondre à la taille de la vue, auquel cas aucune mise à l'échelle n'aura lieu. Ou vous pouvez définir le mode d'échelle de votre scène sur ResizeFill, ce qui fera toujours correspondre la taille de la scène à la taille de votre vue et ne mettra rien à l'échelle. En général, je resterais à l'écart de toute mise à l'échelle et ajusterais plutôt l'interface et la taille de la scène pour mieux s'adapter à chaque appareil. Vous pouvez également ajouter un zoom et/ou un défilement pour permettre aux appareils avec des résolutions plus petites d'atteindre le même champ de vue.


Mais que faire si je veux mettre ma scène à l'échelle?
. réponse ici


Informations supplémentaires
Voir la réponse ici pour un exemple de code montrant comment je dispose les nœuds de façon dynamique.

Voir la réponse ici pour plus de détails sur la mise à l'échelle pour prendre en charge plusieurs appareils.

113
Epic Byte

Si vous souhaitez conserver la taille de votre scène (généralement souhaitée lorsque vous travaillez avec un système de taille et de coordonnées fixe), vous souhaiterez peut-être ajouter un remplissage de chaque côté de votre scène. Cela supprimerait la boîte aux lettres et préserverait toute la physique et la dynamique de votre application sur n'importe quelle plate-forme.

J'ai créé un petit cadre pour aider à cela:

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

Juste:

  1. Téléchargez le fichier Zip pour le référentiel
  2. Ouvrez le sous-dossier "SceneSizer"
  3. Faites glisser le "lego block" SceneSizer.framework dans votre projet
  4. Assurez-vous que le Framework dans Embedded et pas seulement lié
  5. Importez le Framework quelque part dans votre code import SceneSizer

Et vous avez terminé, vous pouvez maintenant appeler la classe sizer avec: SceneSizer.calculateSceneSize(#initialSize: CGSize, desiredWidth: CGFloat, desiredHeight: CGFloat) -> CGSize

2
Tokuriku

Au cas où, essayez de faire CMD + 1, ça a marché pour moi. Certains éléments ont été supprimés car ils n'étaient tout simplement pas affichés dans Simulator - j'insiste là-dessus, ce n'est qu'une fonctionnalité de simulateur (et un bug si vous me le demandez, des heures perdues pour résoudre ce problème). Les vues CMD + 2, CMD + 3 peuvent parfois masquer des parties de la scène.

0