[RESOLU][SWIFT]Problème de placement avec Sprite Kit

DrakenDraken Membre
février 2015 modifié dans Objective-C, Swift, C, C++ #1

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)

}


Mots clés:

Réponses

  • CéroceCéroce Membre, Modérateur

    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).


  • DrakenDraken Membre
    février 2015 modifié #3

    Je me suis aperçus du problème en tentant de créer des sprites à  partir des caractères Emoji.



    class GameScene: SKScene {

    let visageHeureux = "\u{1F603}"
    let unCoeur = "\u{1F496}"

    override func didMoveToView(view: SKView) {

    self.backgroundColor = SKColor.whiteColor()

    // SKSPRITENODE "CLASSIQUE" AVEC UNE IMAGE
    let sprite = SKSpriteNode(imageNamed: "visage_01")
    sprite.position = CGPointMake(200, 200)
    addChild(sprite)
    let spriteFond = SKSpriteNode(color: UIColor.redColor(), size:sprite.frame.size)
    sprite.addChild(spriteFond)

    // SPRITE SKLABELNODE avec EMOJI
    let coeur = SKLabelNode(fontNamed:"AmericanTypewriter")
    coeur.text = unCoeur
    coeur.fontSize = 96
    coeur.position = CGPointMake(300, 200)
    addChild(coeur)
    let labelFond = SKSpriteNode(color: UIColor.redColor(), size:coeur.frame.size)
    coeur.addChild(labelFond)

    }
    }


    Le visage est un SKSpriteNode normal, fabriqué à  partir d'une image png. Le coeur est un emoji affiché dans un SKLabelNode.


     


     


     


  • DrakenDraken Membre
    février 2015 modifié #4

    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.



    coeur.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center

    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.


  • DrakenDraken Membre
    février 2015 modifié #6

    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.



    let tableauBateau = "\u{1F6A2}"
    let bateau = SKLabelNode()
    bateau.text = tableauBateau
    bateau.fontSize = 256
    bateau.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center
    bateau.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));
    bateau.runAction(SKAction.repeatActionForever(
    SKAction.rotateByAngle(CGFloat(M_PI/2), duration:2)))
    addChild(bateau)


  • DrakenDraken Membre
    février 2015 modifié #7

    En utilisant un SKShapeNode à  la place d'un SKSpriteNode, on obtient un véritable antialiasing sur le rectangle de couleur en rotation.



    override func didMoveToView(view: SKView) {

    self.backgroundColor = SKColor.whiteColor()

    // LABEL SUSHIS
    let myLabel = SKLabelNode(fontNamed:"AmericanTypewriter")
    myLabel.text = "Sushis Power !";
    myLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center
    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 - SKShapeNode
    // POSITION ET TAILLE IDENTIQUE AU SKLABEL
    let rectRouge = SKShapeNode(rectOfSize: myLabel.frame.size)
    rectRouge.fillColor = UIColor.redColor()
    myLabel.addChild(rectRouge)

    }



  • 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éroceCéroce Membre, Modérateur
    février 2015 modifié #9


    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.


  • DrakenDraken Membre
    février 2015 modifié #10


    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.




    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




  • 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.




     


    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.

  • CéroceCéroce Membre, Modérateur

    Sprite Kit est mauvais pour dessiner du texte (manque de contrôle) et aussi des formes géométriques (pas pratique, positionnement aléatoire).




  • 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.

Connectez-vous ou Inscrivez-vous pour répondre.