Comment pouvez-vous créer une lueur autour d'un sprite par SKEffectNode
J'ai un SKSpriteNode
que j'aimerais avoir une lueur bleue autour des bords pour mettre en évidence des fins. Je suppose que j'aurais besoin de faire de mon sprite d'un enfant d'un SKEffectNode
et puis créer, appliquer un filtre de quelque sorte.
Mise à JOUR : j'ai étudié de ce fait une avec la réponse choisie, et découvert que SKEffectNode
a un important impact sur la performance, même si vous l'avez configuré pour shouldRasterize
et "pas de filtre" n'est pas définie. Ma conclusion est que si votre jeu exige plus de 10 objets en mouvement à un moment, ils ne peuvent pas impliquer un SKEffectNode
même si pixellisé.
Ma solution impliquera probablement pré-rendus de l'éclat des images/animations, comme SKEffectNode ne va pas le couper pour mes besoins.
Si quelqu'un a de l'intelligence, comme rien de ce que je suis absent, je serais heureux d'avoir tout ce que vous savez!
Je suis accepter une réponse, car elle ne permet d'obtenir ce que j'ai demandé, mais je voulais ajouter ces notes à ceux qui cherchent à aller dans cette voie, de sorte que vous pouvez être au courant de certains des problèmes avec l'utilisation de SKEffectNode
.
- J'ai essayé quelques petites choses, mais je n'ai pas trouvé de solution - Ne peut pas obtenir EffectNode de "course" une image.
Vous devez vous connecter pour publier un commentaire.
@rickster la réponse est grande. Depuis j'ai peu de rep, je ne suis apparemment pas permis d'ajouter ce code dans un commentaire de son. J'espère que ce n'est pas pause stackoverflow règles de la bienséance. Je n'essaie pas de userp son représentant en quelque sorte.
Voici le code qui fait ce qu'il décrit dans sa réponse:
En-tête:
Mise en œuvre:
En cours d'utilisation:
Vous pouvez créer un effet de lumière dans le Cœur de l'Image par la création d'un
CIFilter
sous-classe qui se compose de plusieurs filtres intégrés. Un tel filtre impliquerait des mesures comme celles-ci:CIColorMatrix
pour créer une version monochrome de l'image d'entrée.CIAffineTransform
+CIGaussianBlur
).CISourceOverCompositing
).Une fois que vous avez un
CIFilter
sous-classe qui fait tout cela, vous pouvez l'utiliser avec unSKEffectNode
pour obtenir en temps réel lueur autour de l'effet du nœud enfants. Ici, il est en cours d'exécution dans le "Sprite Kit de Jeu" Xcode modèle sur un iPad 4:J'ai eu cette opérationnel en quelques minutes par le mur de soutènement de la coutume classe de filtre utilisé pour un effet similaire dans la Scène de la Trousse de présentation de la WWDC 2013 -- le saisir à partir de la WWDC Exemple de Code package à developer.apple.com/downloads, et de regarder pour la
ASCGlowFilter
classe. (Si vous souhaitez utiliser ce code sur iOS, vous aurez besoin de changer laNSAffineTransform
partie à utiliserCGAffineTransform
à la place. J'ai aussi remplacé lacenterX
etcenterY
propriétés avec uninputCenter
paramètre de typeCIVector
donc Sprite Kit peut centrer automatiquement l'effet sur le sprite.)J'ai dit "en temps réel" de l'éclat? Yup! C'est l'abréviation de "vraiment mange de temps PROCESSEUR". Avis dans la capture d'écran, il n'est plus fixé à 60 fps, même avec un seul vaisseau, et avec le logiciel OpenGL ES rendu sur le Simulateur iOS, il fonctionne en diaporama vitesse. Si vous êtes sur Mac, vous avez probablement silicone de rechange... mais si vous voulez faire dans votre jeu, garder certaines choses à l'esprit:
shouldRasterize
àYES
sur l'effet le nœud doit aider beaucoup. (En fait, dans ce cas, vous pourriez obtenir une certaine amélioration par la rotation de l'effet nœud au lieu de l'image-objet à l'intérieur.)Vous pouvez utiliser un
SKShapeNode
derrière le sprite et de définir une lueur à l'aide de c'estglowWidth
etstrokeColor
propriétés. Si vous avez la taille et la position de la droite, cela devrait vous donner l'apparence d'une lueur. Cela ne veut pas vous donner de nombreuses options de personnalisation, mais j'imagine que c'est beaucoup plus facile que d'utiliser unCIFilter
avec unSKEffectNode
qui est probablement la logique de l'option que vous avez pour ce.SKShapeNode
. Je voudrais attacher avec un joint fixe ou quelque chose de similaire, et d'éteindre son physique de sorte qu'il suit le sprite de coeur - laissez-le sprite de gérer la physique et les collisions.SKEffectNode
avecshouldRasterize
propriété définie àYES
, la performance est très sympathique.