Подтвердить что ты не робот

Как добавить эффекты частиц в приложение iOS, которое не является игрой с помощью iOS 7 SpriteKit Particle?

Мне нужно добавить эффект дождевой частицы в мое приложение, у меня было трудное время, чтобы найти способы реально выполнить эту идею.

Я попытался выполнить этот учебник по подходу CALayer: Ссылка, но я не совсем уверен, что это лучший подход, учитывая новый iOS 7 SpriteKit Излучатель частиц доступен в Xcode 5.

Я уже создал файл .sks и это в моей иерархии, но я все еще не могу добавить его в свою раскадровку/проект.

С учетом сказанного Как я могу добавить часть SpriteKit Particle (sks) в мое представление? Я вообще не знаком со сценами, расслоением и т.д. В среде SpriteKit, поскольку я не разработчик игры. Мне нужна самая подробная информация и примерный код, чтобы я мог понять это.

UPDATE: Я следил за направлением, предоставленным в ответ со стороны члена SO: AyatollahAndy, см. Его ответ ниже. Хотя я смог отобразить SKScene в моем view, приложение вылетает, когда получено какое-либо событие касания. Я получаю следующее: enter image description here

Спасибо

4b9b3361

Ответ 1

Создайте SKScene в UIView, чтобы добавить эффект частицы SKEmitterNode.

Один из способов сделать это:

1. В раскадровке (или программно, если хотите) добавьте объект View поверх существующего View и измените его размер в соответствии с вашими потребностями.
2. Измените класс нового представления на SKView
3.В вашем файле контроллера .h создайте свойство для SKView:

@property IBOutlet SKView *skView;

4. Поместите SKView на раскадровку в свойство skView.
5. Создайте новый класс, подклассифицируя SKScene. MyScene.h будет выглядеть так:

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

MyScene.m ниже содержит код для создания эффекта частиц всякий раз, когда и где бы ни коснулся SKView.

#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. В вашем основном контроллере представления укажите свой класс сцены:

#import "MyScene.h"

и добавьте код для просмотраDidLoad для инициализации 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];
}

Затем вы должны иметь рабочий SKScene в своем основном UIView.

Ответ 2

Примечание

Для XCode9 в конце 2017 года это становится еще проще. Они сделали так, что вы можете просто добавить SKView в раскадровку, а затем выбрать файл .sks

введите описание изображения здесь

Однако, похоже, на данный момент это действительно не работает, так что теперь просто продолжайте, как показано ниже!


2017

Обратите внимание, что вышеупомянутые ответы очень устарели.

Это очень легко сделать сейчас.

Вы используете встроенный редактор частиц WYSIWYG от Apple.

У вас есть обычный UIView где угодно:

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

В Xcode нажмите, чтобы создать новый

Файл частиц SpriteKit

он будет одним файлом .sks.

(Не выбирайте "Файл системных файлов SceneKit". Выберите "Файл частиц SpriteKit".)

Нажмите один раз в файле .sks. Обратите внимание на множество элементов управления справа.

введите описание изображения здесь

Частицы будут действительно перемещаться, т.е. это "живой предварительный просмотр".

Все, что можно сделать с помощью частиц, вы можете это сделать. Это похоже на использование частиц в игровом движке, за исключением производительности в 18 миллиардов раз лучше.

Следующая панель кода добавит вашу новую систему частиц внутри обычного UIView teste:

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)

Добавьте это ко всему, что хотите.

Если вы хотите сверкающую кнопку, добавьте ее к кнопке.

Если вы хотите, чтобы весь экран ливневал радугой, добавьте его в любое представление, которое будет большим.

Это легко.


Предположим, что вам нужен только пакет искры, который заканчивается.

В визуальном редакторе просто установите max, чтобы сказать 50...

введите описание изображения здесь

Если вы это сделаете, кажется, вы можете просто избавиться от SKScene, когда закончите.

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

    delay(1.5) { sk.removeFromSuperview() }

Добавление одной строки кода в конец, кажется, очищает все.


Кстати, если вы хотите фантастические идеи для систем частиц, отличная идея - щелкнуть на "хранилище активов" Unity, где различные художники-частицы покупают и продают системы частиц. Их работа даст вам отличные идеи.

введите описание изображения здесь

Просто нажмите "частицы" в списке справа; смотреть видео. (Например эта чувак-ссылка действительно новаторская.)

Ответ 3

Вы можете добавить SKView в качестве подчиненного объекта в своей иерархии UIKit. Функция, подобная приведенной ниже, будет работать, позволяя вам создать UIImageView с эффектом как подвью, а затем вы можете добавить это в свой основной вид. Обязательно связывайтесь с 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;
}

В конце концов, если все, что вам нужно, это эмиттер, может быть проще создать CAEmitterLayer и добавить это как подуровень в ваш UIView. Конечно, это означает, что вы должны программно создать CAEmitterLayer и не можете использовать классный редактор частиц Xcode...

Ответ 4

На самом деле есть способ добавить частицы без SpriteKit - CoreAnimation CAEmitterCells.

Таким образом вы можете легко добавлять частицы в свой UIView. Если вы хотите поиграть с параметрами и легко получить код, получите это приложение (Particle X).

Он также поддерживает SpriteKit, поэтому, если вы хотите поиграть или обработать частицы на ходу и сразу получить код для этого, это приложение является решением.

пс. Если вы этого не заметите, я разработчик приложения - заставил его использовать его самостоятельно при разработке приложений и игр.:)

Ответ 5

Здесь подход совершенно другой подход, чтобы попытаться. Мой приятель дал мне этот классный путь. Используя CAEmitterCell. Все в коде! Похоже, вам нужно изображение spark.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]
    }
}

Enjoy.

Ответ 6

Вы не можете напрямую использовать эффекты частиц внутри UIView.

SKEmitterNode должен находиться в дереве node, определенном с помощью сцены node (SKScene). Сцена node запускает цикл анимации, который отображает содержимое дерева node для отображения. UIView является статическим, не будет работать для него.

Однако вы, вероятно, можете создать сцену внутри своего UIView, но я никогда не пытался это сделать.