Comment ajouter des effets de particules à une application iOS qui n'est pas un jeu utilisant iOS 7 SpriteKit Particle?

j'ai besoin d'ajouter un effet de particules de pluie à mon application, j'ai eu du mal à trouver des moyens d'exécuter cette idée.

j'ai essayé de suivre ce tutoriel D'approche CALayer:Lien mais je ne suis pas tout à fait sûr si c'est la meilleure approche, compte tenu de la nouvelle émission de particules iOS 7 SpriteKit disponible en Xcode 5.

j'ai déjà créé le .sks fichier et il est dans ma hiérarchie, mais je suis toujours incapable de l'ajouter à mon storyboard / projet.

cela étant dit, Comment puis-je ajouter une particule de SpriteKit (sks) à ma vue? Je ne suis pas du tout familier avec les scènes, la superposition , etc dans le cadre de SpriteKit car je ne suis pas un développeur de jeux. J'ai besoin de plus de détails et des exemples de code possible afin que je puisse trouver cela merci

mise à jour: J'ai suivi la direction donnée dans une réponse d'un collègue député: AyatollahAndy, s'il vous plaît voir sa réponse ci-dessous. Bien que j'ai été capable d'afficher l' SKScene dans mon view l'application s'écrase lorsqu'un événement tactile est reçu. Je reçois le texte suivant: enter image description here

Merci

33
demandé sur san 2013-10-27 21:09:40

6 réponses

Créer un SKScene dans votre UIView pour ajouter un SKEmitterNode effet de particule.

Une façon de faire:

1.Dans storyboard (ou programmatically si vous préférez) ajouter un objet View au dessus de la vue existante et le redimensionner à vos besoins.

2.Modifier la classe de la nouvelle vue SKView

3.Dans votre contrôleur de vue .h fichier de créer une propriété pour l' SKView:

@property IBOutlet SKView *skView;

4.Lien de l' SKView sur votre storyboard au skView de la propriété.

5.Créer une nouvelle classe, sous-classement SKScene. MyScene.h va ressembler à ça:

#import <SpriteKit/SpriteKit.h>
@interface MyScene : SKScene
@end

MyScene.m ci-dessous contient du code pour créer un effet de particule quand et où le SKView est touché.

#import "MyScene.h"

@implementation MyScene

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {
        /* Setup your scene here */

        self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];
        SKLabelNode *myLabel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];
        myLabel.text = @"Hello, World!";
        myLabel.fontSize = 30;
        myLabel.position = CGPointMake(CGRectGetMidX(self.frame),
                                   CGRectGetMidY(self.frame));

        [self addChild:myLabel];
    }
    return self;
}

//particle explosion - uses MyParticle.sks
- (SKEmitterNode *) newExplosion: (float)posX : (float) posy
{
    SKEmitterNode *emitter =  [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"MyParticle" ofType:@"sks"]];
    emitter.position = CGPointMake(posX,posy);
    emitter.name = @"explosion";
    emitter.targetNode = self.scene;
    emitter.numParticlesToEmit = 1000;
    emitter.zPosition=2.0;
    return emitter;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    /* Called when a touch begins */

    for (UITouch *touch in touches) {
        CGPoint location = [touch locationInNode:self];
        //add effect at touch location
        [self addChild:[self newExplosion:location.x : location.y]];
    }
}

-(void)update:(CFTimeInterval)currentTime {
    /* Called before each frame is rendered */
}

@end

6.Dans votre contrôleur de vue principale, incluez votre classe de scène:

#import "MyScene.h"

et ajoutez le code pour viewDidLoad, pour initialiser le SKView:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Configure the SKView
    SKView * skView = _skView;
    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];
}

Vous devriez alors avoir un travail SKScene au sein de votre principal UIView.

50
répondu AndyOS 2013-11-04 15:47:02

2018

C'est maintenant très facile avec moderne Xcode.

1. Dans Xcode, Cliquez pour créer un nouveau

"SpriteKit De Particules Fichier"

il y aura un seul .sks fichier.

(Ne choisissez "Fichier système de particules SceneKit". Choisissez "Fichier De Particules SpriteKit".)

cliquez une fois sur le .sks fichier. Remarquez les nombreux contrôles sur le droit.

enter image description here

les particules vont bouger, c'est un aperçu vivant. Tout ce qui peut être fait avec des particules, vous pouvez le faire. C'est comme utiliser des particules dans un moteur de jeu, sauf que la performance est 18 milliards de fois Meilleure.

2. Toute ordinaire UIView, n'importe où vous voulez:

@IBOutlet weak var teste: UIView! // totally ordinary UIView

3. Suffit d'utiliser le code suivant pour le lien:

la table de codes suivante mettra votre nouveau système de particules, à l'intérieur, le "teste" UIView ordinaire:

import SpriteKit ...


let sk: SKView = SKView()
sk.frame = teste.bounds
sk.backgroundColor = .clear
teste.addSubview(sk)

let scene: SKScene = SKScene(size: teste.bounds.size)
scene.scaleMode = .aspectFit
scene.backgroundColor = .clear

let en = SKEmitterNode(fileNamed: "SimpleSpark.sks")
en?.position = sk.center

scene.addChild(en!)
sk.presentScene(scene)

Ajouter ce que vous voulez.

Si vous voulez un mousseux bouton, l'ajouter à un bouton.

si vous voulez que l'écran entier douche des arcs-en-ciel, ajoutez-le à une vue plein écran.

C'est facile.


exemple d'utilisation du fichier de particules SpriteKit:

Dites que vous voulez une rafale des étincelles, qui fourchues.

Réglez le max à 50...

enter image description here

astuce-si votre effet "finit" (ce n'est pas une boucle), il semble que vous pouvez simplement vous débarrasser du SKScene une fois terminé. Comme ceci:

    ...
    scene.addChild(en!)
    sk.presentScene(scene)

    delay(1.5) { sk.removeFromSuperview() }

cette ligne de code à la fin semble tout nettoyer.


BTW si vous voulez des idées fantastiques pour les systèmes de particules, une grande idée est de cliquer sur L'unité "asset store", où divers particule artistes acheter et vendre des systèmes de particules. Leur travail vous donnera de grandes idées.

enter image description here

il suffit de cliquer sur "particules" dans la liste à droite; regardez les vidéos. (des exemples Novateurs .)


Remarque! Apple vont faire en sorte que vous pouvez très simplement faire un SKView dans storyboard, et sélectionnez le .sks scène. Cependant ..

enter image description here

... il ne fonctionne pas encore! Vous avez donc besoin du fragment de code ci-dessus.

21
répondu Fattie 2018-06-13 17:40:56

vous pouvez ajouter SKView comme sous-vue dans votre hiérarchie UIKit. Une fonction comme le suivant, vous permettant de créer une UIImageView à l'effet qu'un sous-vue, et puis vous pouvez l'ajouter à votre écran principal. Assurez-vous de faire le lien avec SpriteKit.

UIImageView *NewEffectUIImageViewWithFrame(CGRect frame)
{
    UIImageView *tempView = [[UIImageView alloc] initWithFrame:frame];

    SKView *skView = [[SKView alloc] initWithFrame:CGRectMake(0.0, 0.0, frame.size.width, frame.size.height)];
    [tempView addSubview:skView];

    SKScene *skScene = [SKScene sceneWithSize:skView.frame.size];
    skScene.scaleMode = SKSceneScaleModeAspectFill;
    skScene.backgroundColor = [UIColor clearColor];

    SKEmitterNode *emitter =  [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"SparkParticle" ofType:@"sks"]];
    emitter.position = CGPointMake(frame.size.width*0.5,0.0);

    [skScene addChild:emitter];
    [skView presentScene:skScene];

    return tempView;
}

En fin de compte, si vous avez besoin d'un émetteur, il peut être plus facile de créer un CAEmitterLayer et d'ajouter qu'en tant que sous-couche pour votre UIView à la place. Bien sûr, cela signifie que vous devez programmatiquement créer le CAEmitterLayer et ne peut pas utilisez l'éditeur de particules Xcode cool...

7
répondu MoFlo 2014-02-10 01:53:45

en fait il y a un moyen d'ajouter des particules sans les cellules de CAEmitterCells de SpriteKit - CoreAnimation.

ainsi vous pouvez facilement ajouter des particules dans votre uivi. Si vous voulez jouer avec les paramètres et obtenir le code facilement, obtenir cette application ( Particule X).

il supporte également SpriteKit donc si vous voulez jouer ou concevoir des particules sur la route et obtenir immédiatement le code pour elle, cette application est la solution.

ps. Si vous havent avis je suis le développeur de l'application - il fait pour l'utiliser moi-même lors de la conception d'application et de jeux. :)

3
répondu GeneCode 2015-08-18 08:04:18

voici une approche totalement différente de l'approche à essayer. Mon pote m'a donné cette façon cool de partir. En utilisant CAEmitterCell. Tous en code! On dirait que vous besoin d'une étincelle.Image png.

extension UIView {
    final public func ignite() {
        let emitter = CAEmitterLayer()
        emitter.frame = self.bounds
        emitter.renderMode = kCAEmitterLayerAdditive
        emitter.emitterPosition = self.center
        self.layer.addSublayer(emitter)

        let cell = CAEmitterCell()
        let bundle = Bundle.init(for: UIColor.self)
        let image = UIImage(named: "spark", in: bundle, compatibleWith: traitCollection)

        cell.contents = image?.cgImage
        cell.birthRate = 1500
        cell.lifetime = 5.0
        cell.color = UIColor(red: 1.0, green: 0.5, blue: 0.1, alpha: 1).cgColor
        cell.alphaSpeed = -0.4
        cell.velocity = 50
        cell.velocityRange = 250
        cell.emissionRange = CGFloat.pi * 2.0

        emitter.emitterCells = [cell]
    }
}

Profiter.

2
répondu Fattie 2017-04-03 02:05:47

vous ne pouvez pas utiliser les effets de particules dans UIView directement.

SKEmitterNode doit être dans un arbre de noeuds défini par une scène de noeuds (