vzm*_*vzm 34 objective-c uiview ios sprite-kit skemitternode
我需要在我的应用程序中添加雨粒子效果,我一直很难找到实际执行这个想法的方法.
我尝试按照这个CALayer方法教程:链接, 但我不太确定这是否是最好的方法,考虑到Xcode 5中提供的新的iOS 7 SpriteKit粒子发射器.
我已经创建了.sks文件并且它在我的层次结构中,但我仍然无法将其添加到我的故事板/项目中.
话虽如此,我究竟如何在我的视图中添加SpriteKit粒子(sks)?我对SpriteKit框架中的场景,分层等并不熟悉,因为我不是游戏开发人员.我需要尽可能多的细节和示例代码,以便我能够解决这个问题
更新:我已按照SO成员答案中提供的指示:AyatollahAndy,请参阅下面的答案.虽然我能够SKScene在view收到任何触摸事件时显示我的应用程序崩溃.我得到以下内容:
谢谢
And*_*yOS 50
SKScene在您的创建中UIView添加SKEmitterNode粒子效果.
一种方法:
1.在故事板中(或者以编程方式,如果您愿意)在现有视图的顶部添加View对象,并根据需要调整其大小.
2.将新视图的类更改为SKView
3.在视图控制器.h文件中为SKView:创建属性:
@property IBOutlet SKView *skView;
Run Code Online (Sandbox Code Playgroud)
4.将SKView故事板上的链接链接到skView属性.
5.创建一个新类,子类化SKScene.MyScene.h看起来像:
#import <SpriteKit/SpriteKit.h>
@interface MyScene : SKScene
@end
Run Code Online (Sandbox Code Playgroud)
下面的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
Run Code Online (Sandbox Code Playgroud)
6.在主视图控制器中,包括您的场景类:
#import "MyScene.h"
Run Code Online (Sandbox Code Playgroud)
并向viewDidLoad添加代码以初始化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];
}
Run Code Online (Sandbox Code Playgroud)
然后你应该SKScene在你的主要工作UIView.
Fat*_*tie 32
现代Xcode现在非常容易.
它将是一个.sks文件.
(千万不能选"SceneKit粒子系统文件",选择"SpriteKit粒子文件".)
单击.sks文件一次.请注意右侧的许多控件.
粒子实际上会移动,这是一个活生生的预览.任何可以通过粒子完成的事情,你都可以做到.就像在游戏引擎中使用粒子一样,性能要好180亿倍.
@IBOutlet weak var teste: UIView! // totally ordinary UIView
Run Code Online (Sandbox Code Playgroud)
下面的代码将把你的新粒子系统放在普通的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)
Run Code Online (Sandbox Code Playgroud)
将此添加到您想要的任何内容.
如果您想要一个闪亮的按钮,请将其添加到按钮.
如果您希望整个屏幕淋浴彩虹,请将其添加到全屏视图.
就这么简单.
假设你想要一阵火花,结束.
将最大值设置为50 ...
提示 - 如果你的效果"完成"(即,它不是一个循环),似乎你可以简单地摆脱SKScene完成时.像这样:
...
scene.addChild(en!)
sk.presentScene(scene)
delay(1.5) { sk.removeFromSuperview() }
Run Code Online (Sandbox Code Playgroud)
最后一行代码似乎可以清理所有内容.
顺便说一句,如果你想要关于粒子系统的奇妙想法,那么一个好主意是点击Unity"资产商店",各种粒子艺术家买卖粒子系统.他们的工作会给你很好的想法.
只需点击右侧列表中的"粒子"即可; 观看视频.(创新的例子.)
注意!Apple将会制作它,以便您可以非常简单地在故事板中制作SKView,并选择.sks场景.然而......
......它还没有用!所以你需要上面的代码片段.
小智 7
您可以在您的UIKit层次结构中添加SKView作为子视图.如下所示的函数可以使用,允许您创建一个具有子视图效果的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;
}
Run Code Online (Sandbox Code Playgroud)
最后,如果你需要的只是一个发射器,那么创建一个CAEmitterLayer并将其作为子层添加到你的UIView 可能更容易.当然,这意味着你必须以编程方式创建CAEmitterLayer并且不能使用酷炫的Xcode粒子编辑器......
| 归档时间: |
|
| 查看次数: |
20843 次 |
| 最近记录: |