Taille de l'image de fond jeu Sprite Kit

Je viens de commencer un nouveau projet Sprite Kit pour apprendre à l'utiliser. J'ai regardé et lu beaucoup de tutoriels mais aucun tutoriel n'a de réponse à ma question / problème.

Je veux créer une application juste pour mon iPhone 5S. Donc, la taille de l'écran est 1136×640. J'ai créé une image de fond 1136×640 pour mon application. Mais quand j'ajoute l'image à mon application, c'est waaay à gros! Le simulateur iOS affiche simplement le milieu de l'image.

Quelqu'un peut-il me dire quelle taille d'écran dois-je utiliser et pourquoi?

Merci beaucoup!

Voici le code que j'ai copié à partir d'un tutoriel. Le code se trouve dans le file myScene.m dans la méthode initWithSize

SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground"]; background.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame)); [self addChild:background]; 

EDITER :

J'ai cherché sur google et j'ai trouvé ceci:

La méthode viewDidLoad doit être modifiée avec "viewWillLayoutSubviews".

Voici cette méthode:

  - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; // Configure the view. SKView * skView = (SKView *)self.view; skView.showsFPS = YES; skView.showsNodeCount = YES; // Create and configure the scene. SKScene * scene = [MyScene sceneWithSize:CGSizeMake(skView.bounds.size.width*2,skView.bounds.size.height*2)]; scene.scaleMode = SKSceneScaleModeAspectFill; // Present the scene. [skView presentScene:scene]; } 

Au début, la ligne scene = MySceneWithSize était:

 SKScene * scene = [MyScene sceneWithSize:skView.bounds.size]; 

Mais alors c'était juste la moitié de la taille de l'écran de l'iPhone 5 (568×320). Donc j'ai dû doubler la taille. Est-ce que quelqu'un sait pourquoi?

La réponse courte à votre problème immédiat:

 background.size = self.frame.size; 

La longue réponse, et la discussion sur d'autres methods …

La scène fonctionne en unités logiques, pas en pixels physiques (comme mentionné dans d'autres publications).

1 unité logique est généralement 1 pixel sur un kit plus ancien et 2 pixels sur un kit / iPad plus récent. Cela peut-être 4 pixels dans 5 ans.

Travailler dans des unités logiques vous protège contre les changements de taille dans le futur, et est supposé aider le programmeur – bien que cela perturbe souvent les débutants.

Le moyen le plus simple d'get une image pour remplir la scène actuelle est de définir sa taille en «unités logiques», quelle que soit sa taille d'origine.

C'est mieux que d'utiliser SKActions (parce que l'user pourrait finir par les voir, et tout calcul basé sur les dimensions du nœud ne peut pas être compté jusqu'à ce que l'action soit terminée), et c'est mieux que la mise à l'échelle. les dimensions de l'image originale.

Vous pouvez le faire via la propriété size, ou via une action si vous voulez vraiment faire une animation.

Dans la scène tout simplement ….

 -(void)didMoveToView:(SKView *)view { [super didMoveToView:view]; SKSpriteNode* background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground"]; background.size = self.frame.size; background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); [self addChild:background]; } 

Alternativement, si votre image fonctionne bien, comme c'est le cas, sur des résolutions plus élevées, vous pouvez renommer votre image en [email protected], l'append à votre projet et vous n'aurez probablement pas besoin de le resize du tout, mais vous aurez aussi besoin pour le réduire de 50% pour les périphériques de résolution inférieure, et enregistrez-le comme myBackground.png.

Je fixe toujours la taille d'une image imscope exactement aux unités logiques que je veux (ou un pourcentage des dimensions de l'écran) pour préserver ma santé mentale.

J'ai trouvé que si une image n'est pas la même taille que le nœud que vous cherchez à créer, le dimensionnement devient un peu drôle (par exemple en utilisant une image rétine sur un appareil non-rétine ou un nom d'image incorrect). Vous pouvez mettre à l'échelle l'image à remplir si vous créez la texture à partir de l'image et définissez la texture et la taille du nœud en utilisant quelque chose comme ceci:

 SKTexture *backgroundTexture = [SKTexture textureWithImageNamed:@"MyImage.png"]; SKSpriteNode *background = [SKSpriteNode spriteNodeWithTexture:backgroundTexture size:self.view.frame.size]; background.position = (CGPoint) {CGRectGetMidX(self.view.frame), CGRectGetMidY(self.view.frame)}; [scene addChild:background]; 

Je ne suis pas sûr à 100% si cela réglera votre problème ou non, mais cela pourrait valoir la peine.

Cette ligne renvoie la taille en points, pas en pixels. Ceci est fait parce que différents appareils ont des résolutions différentes, mais auront les mêmes tailles en points. Sur les appareils non rétiniens, 1 point correspond à 1 pixel et sur les appareils rétiniens, 1 point correspond à deux pixels. C'est pourquoi vous obtenez cette taille de

 SKScene * scene = [MyScene sceneWithSize:skView.bounds.size]; 

Vous ne voulez pas doubler la taille de la scène puisque ce sera juste notre limite de l'écran, invisible.

Avez-vous essayé d'append "@ 2x" à la fin du nom de votre image?

Je fais essentiellement comme les réponses ci-dessus mais je vais de l'avant et définissez la largeur et la hauteur directement de sorte que je n'ai pas à vous soucier si elle est réglée correctement ou non, bien sûr, je devrais également vérifier s'il y avait un iPhone4 pour une solution complète.

 - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; // Configure the view. SKView * skView = (SKView *)self.view; if (!skView.scene) { skView.showsFPS = YES; skView.showsNodeCount = YES; CGSize tmpSize; tmpSize.width = 640; tmpSize.height = 1136; // Create and configure the scene SKScene * scene = [CreationScene sceneWithSize:tmpSize]; scene.scaleMode = SKSceneScaleModeAspectFill; // Present the scene. [skView presentScene:scene]; } } 

Cela a fonctionné pour moi. Est-ce correct de faire?

 //Set background image. SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground.png"]; background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); background.xScale = 0.5; background.yScale = 0.5; [self addChild:background]; 

Solution:

Placez ce code dans votre ViewWillLayoutSubviews à la place dans viewDidLoad du UIViewController qui charge l'image-object.

  - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; // Configure the view. SKView * skView = (SKView *)self.view; if (!skView.scene) { skView.showsFPS = YES; skView.showsNodeCount = YES; // Create and configure the scene. SKScene * scene = [MyScene sceneWithSize:skView.bounds.size]; scene.scaleMode = SKSceneScaleModeAspectFill; // Present the scene. [skView presentScene:scene]; } } 

Explication: Cela crée la scène avec une taille comme limites de la vue. Cependant, lorsque viewDidLoad est appelé, c'est avant que la vue ne soit ajoutée à la hiérarchie de vue et qu'elle n'a donc pas encore répondu aux modifications de disposition. Les limites de vue ne sont peut-être pas encore correctes, et ce n'est probablement pas le meilleur moment pour commencer la scène.

Cette réponse est copiée de: http://www.raywenderlich.com/42699/spritekit-tutorial-for-beginners Le crédit va à Ray :).

J'ai utilisé le même code dans mon SKScene comme vous, mais sans cette solution, Ray a proposé dans le UIViewController qui présente la scène que cela ne fonctionnerait pas.

J'ai utilisé et sprite pour le fond.

  double escalax = self.size.width/ sprite.size.width ; double escalay = self.size.height/ sprite.size.height ; SKAction *mostrar = [SKAction scaleXTo:escalax y:escalay duration:0]; 

J'espère que cela aide!

J'ai le même problème avec toi. Après plusieurs jours à googler et essayer, j'ai finalement eu la key de ce problème. Vous pouvez essayer de changer votre scene.scaleMode plusieurs fois, jusqu'à ce que vous obteniez la taille avec laquelle vous êtes satisfait. Je viens de find ça hier soir, donc si vous voulez en savoir plus, voici un lien

https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKScene_Ref/Reference/Reference.html#//apple_ref/doc/uid/TP40013024-CH1-DontLinkElementID_3