Y a-t-il une raison pour laquelle une SKTexture
semble ignorer l' .scale
d'une image lorsqu'elle est construite via textureWithImage:
J'ai une ressource d'image disponible, "[email protected]"
Lorsque j'essaie de créer une texture en créant une UIImage en premier:
UIImage* image = [UIImage imageNamed:@"retina_image"]; SKTexture* texture_image = [SKTexture textureWithImage:image]; NSLog(@"image size %@, scale %f", NSSsortingngFromCGSize(image.size), image.scale); NSLog(@"texture from image, size %@", NSSsortingngFromCGSize(texture_image.size));
J'ai le résultat suivant:
image size {50, 50}, scale 2.000000 texture from image, size {100, 100}
Alors que je m'attendrais à get
image size {50, 50}, scale 2.000000 texture from image, size {50, 50}
Comme la taille de l'image (en points) est 50×50
C'est aussi ce que vous obtenez lorsque vous construisez directement la texture avec la ressource:
SKTexture* texture_named = [SKTexture textureWithImageNamed:@"retina_image"]; NSLog(@"texture named, size %@", NSSsortingngFromCGSize(texture_named.size));
donne la sortie suivante (comme prévu):
texture named, size {50, 50}
Cela suggère que SKTexture
ignore la propriété d'échelle lors de la détermination de sa propre taille lorsqu'elle est construite à partir d'une image, tout en respectant correctement l'échelle lorsqu'elle est construite à partir du nom d'image.
Est-ce que ce comportement est attendu?
(évidemment dans mon vrai code je crée le UIImage que je veux utiliser dans une texture par programmation et non via imageNamed)
Edit: Ceci est un bug (confirmé) dans SpriteKit, corrigé dans iOS8
Je l'ai trouvé aussi et je crois que c'est un bug. Je ne sais pas comment Apple va rectifier cela, car il pourrait briser le code existant.
Ma solution consiste à lire l'échelle de l'UIImage et à définir l'échelle de SKSpriteNode sur 1.0 / scale. Vous devez le faire pour les échelles x et y du SKSpriteNode.
De pommes doc d' UIImage
Sur un périphérique exécutant iOS 4 ou version ultérieure , le comportement est identique si l'écran du périphérique a une échelle de 1,0. Si l' écran a une échelle de 2.0 , cette méthode search d' abord un file image avec le même nom de file avec un suffixe @ 2x ajouté . Par exemple, si le nom du file est un button, il search d'abord le button @ 2x. S'il trouve un 2x, il charge cette image et définit la propriété scale de l'object UIImage returnné à 2.0. Sinon, il charge le nom de file non modifié et définit la propriété scale sur 1.0. Consultez le Guide de programmation d'applications iOS pour plus d'informations sur la prise en charge d'images avec différents facteurs d'échelle.
Mais selon textureWithImageNamed:
Le nouvel object de texture est initialisé avec le nom du file image, puis le contrôle revient immédiatement à votre jeu. Sprite Kit charge et prépare datatables de texture lorsque votre jeu le nécessite.
Lors du chargement des données de texture, Sprite Kit search dans le regroupement d' applications un file image avec le nom de file spécifié . Si un file image correspondant ne peut pas être trouvé, Sprite Kit search la texture dans tous les Atlas de texture stockés dans l'set de l'application. Si l'image spécifiée n'existe nulle part dans l'set, Sprite Kit crée une image de texture d'espace réservé.
De la textureWithImageNamed:
ci-dessus textureWithImageNamed:
et SKTexture
ne se soucie pas de la mise à l'échelle avec le périphérique (image rétine).
J'ai le même comportement avec des textures d'atlas créées à partir d'un dictionary. Sur iOS 8.3
Comment forcer SKTextureAtlas à partir d'un dictionary pour ne pas modifier la taille des textures?