web-dev-qa-db-fra.com

Taille de l'image d'arrière-plan Jeu de kit Sprite

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 uniquement pour mon iPhone 5S. La taille de l'écran est donc de 1136x640. J'ai créé une image de fond 1136x640 pour mon application. Mais quand j'ajoute l'image à mon application, son waaay à grand! Le simulateur iOS affiche simplement le milieu de l'image.

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

Merci beaucoup!

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

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

    [self addChild:background];

MODIFIER :

J'ai recherché sur google et 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 scène = la ligne MySceneWithSize était:

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

Mais ce n'était alors que la moitié de la taille de l'écran de l'iPhone 5 (568x320). J'ai donc dû doubler la taille. Est-ce que quelqu'un sait pourquoi?

30
Mike_NotGuilty

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

background.size = self.frame.size;

La réponse longue et discussion sur d'autres méthodes ...

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

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

Travailler dans des unités logiques vous protège des changements de taille à l'avenir et est censé aider le programmeur - bien que cela déroute souvent les débutants.

Le moyen le plus simple d'obtenir 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 (car l'utilisateur peut finir par les voir, et aucun calcul basé sur les dimensions du nœud ne peut être fiable tant que l'action n'est pas terminée), et c'est mieux que la mise à l'échelle car la mise à l'échelle nécessite que vous sachiez les dimensions originales de l'image.

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

Dans la scène 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, telle quelle, sur des résolutions plus élevées, vous pouvez renommer votre image en [email protected], l'ajouter à votre projet et vous n'aurez probablement pas besoin de redimensionner du tout, mais vous aurez également besoin pour le réduire de 50% pour les périphériques de résolution inférieure et l'enregistrer sous myBackground.png.

Je règle toujours la taille d'une image importée sur exactement les unités logiques que je veux (ou un pourcentage des dimensions de l'écran) pour préserver ma santé mentale.

29
GilesDMiddleton

J'ai trouvé que si une image n'est pas de la même taille que le nœud que vous cherchez à créer, le dimensionnement devient un peu drôle (par exemple, utiliser une image rétine sur un appareil non-rétine ou une dénomination d'image incorrecte). 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ésoudra votre problème ou non, mais cela pourrait valoir le coup.

9
James Jones

Cette ligne renvoie la taille en points, pas en pixels. Cela est dû au fait que différents appareils ont des résolutions différentes, mais auront la même taille en points. Sur les dispositifs non rétiniens, 1 point est égal à 1 pixel et sur les dispositifs rétiniens, 1 point est égal à deux pixels. C'est pourquoi vous obtenez cette taille

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

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

8
Dvole

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

7
user2763173

Je fais essentiellement les réponses ci-dessus, mais je vais de l'avant et je règle directement la largeur et la hauteur afin de ne pas avoir à me soucier de savoir s'il est réglé 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];
    }
}
3
Glen Zenfar

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!

Solution:

Mettez ce code dans votre viewWillLayoutSubviews à la place dans le viewDidLoad de l'UIViewController qui charge le Sprite.

  - (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 ait été ajoutée à la hiérarchie des vues et par conséquent, elle n'a pas encore répondu aux modifications de mise en page. Par conséquent, les limites de la vue ne sont peut-être pas encore correctes, et ce n'est probablement pas le meilleur moment pour démarrer la scène.

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

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

2
MB_iOSDeveloper

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];
2
Jason

J'ai le même problème avec toi. Après plusieurs jours à googler et à essayer, j'ai finalement obtenu la clé de ce problème. Vous pouvez essayer de changer votre scene.scaleMode plusieurs fois, jusqu'à ce que vous obteniez la taille qui vous convient. Je viens de trouver ç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_

1
Alfred