[RESOLU][SWIFT]Problème de placement avec Sprite Kit
Draken
Membre
EDIT : Ce message a été déplacé d'un autre post, pour créer un nouveau sujet.
Bon, reste encore quelques petites bugs, notamment un truc avec SpriteKit dont je me suis aperçu il y a quelques jours : le texte d'un SKLabel n'est pas affiché à la bonne position sur l'écran, comme le montre l'exemple suivant :
J'affiche deux sprites à la même position, l'un contenant du texte et l'autre un rectangle rouge.
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
self.backgroundColor = SKColor.whiteColor()
// LABEL SANS SUSHIS
let myLabel = SKLabelNode(fontNamed:"AmericanTypewriter")
myLabel.text = "Sushis Power !";
myLabel.fontColor = UIColor.blueColor()
myLabel.fontSize = 60;
myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));
self.addChild(myLabel)
// ROTATION
myLabel.runAction(SKAction.repeatActionForever(
SKAction.rotateByAngle(CGFloat(M_PI/2), duration:2)))
// FOND ROUGE - POSITION ET TAILLE IDENTIQUE AU SKLABEL
let myFond = SKSpriteNode(color: UIColor.redColor(), size:myLabel.frame.size)
myLabel.addChild(myFond)
}
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Méfie-toi du placement avec Sprite Kit. Notamment l'anchor point peut être différent selon le type de sprite (flagrant avec les sprites shapes).
Je me suis aperçus du problème en tentant de créer des sprites à partir des caractères Emoji.
Le visage est un SKSpriteNode normal, fabriqué à partir d'une image png. Le coeur est un emoji affiché dans un SKLabelNode.
Euh .. une légende urbaine prétend qu'on peut résoudre les problèmes en lisant la documentation. Aussi étonnant que cela puisse paraitre, c'est parfois vrai.
Magique !
C'est surprenant que le centrage du texte dans le SKLabelNode ne soit pas l'option par défaut.
Est-ce qu'il ya une option antialiasing avec SpriteKit ?
Parce que là , le bord du fond du texte supporte mal la rotation.
On peut préciser le mode de filtrage des textures pour chaque sprite. Par défaut c'est du rapide pas beau (SKTextureFilteringMode.Nearest).
La copie d'écran viens du simulateur d'iPhone 4. L'effet d'escalier est moins visible en taille réelle.
Ceci dis, c'est juste un test sans rapport avec une situation en vrai. La texture de fond est un rectangle rouge, brut de décoffrage, l'idéal pour avoir des effets d'escaliers en rotation. Si je devais faire une rotation sur un object rectangulaire dans un jeu, je mettrais un dégradé sur les bords avec le canal alpha, pour casser l'escalier.
A titre d'exemple j'ai utilisé SpriteKit pour afficher en rotation un sprite rectangulaire, provenant de la collection d'Emoji d'iOS. L'effet d'escalier n'est pas visible sur les bords.
En utilisant un SKShapeNode à la place d'un SKSpriteNode, on obtient un véritable antialiasing sur le rectangle de couleur en rotation.
J'envisage de faire un renderer pour dessiner des tiles de cartes (comme Apple Map).
Je me demande si SpriteKit ne serait pas un bon compromis entre OpenGL et CoreGraphics.
C'est surtout un gros tas d'ennuis en perspective.
Pourquoi pas Core Animation ? Si c'est pour afficher rapidement des bitmaps, les CALayers sont appropriées.
Tu as un exemple de tiles en SpriteKit ici : http://www.spritekitdesigner.com
Et le source d'un petit jeu avec des tiles sur le site Apple pour développeur :
https://developer.apple.com/library/mac/samplecode/Adventure-Swift/Introduction/Intro.html#//apple_ref/doc/uid/TP40014639-Intro-DontLinkElementID_2
Non c'est pour dessiner des routes, des immeubles, des lacs, noms de rues, etc.
Donc principalement des formes géométriques et du texte.
Sprite Kit est mauvais pour dessiner du texte (manque de contrôle) et aussi des formes géométriques (pas pratique, positionnement aléatoire).
Ouais... bon autant utiliser OpenGL avec les bonnes librairies quoi, ou alors rester sur CoreAnimation.