我在屏幕上有9个块(BlockView只是视图的子类,有一些属性可以跟踪事物),我想在每个块的顶部添加一个烟雾粒子发射器,以添加一些从顶部上升的烟雾每个街区。我创建一个视图来保持块和粒子发射器,并将块放在子视图前面,使块位于前面。然而,这导致我的设备(iphone 6)难以置信地延迟并且很难用平移手势移动块。
SmokeParticles.sks:3的出生率(最大设置为0),10的生命周期(100范围),代码中设置的位置范围。
我为每个视图添加粒子发射器的代码如下(我对粒子发射器不是很好,所以任何建议都值得赞赏!:D)
- (void)addEffectForSingleBlock:(BlockView *)view
{
CGFloat spaceBetweenBlocksHeight = (self.SPACE_TO_WALLS * self.view.frame.size.height + self.SPACE_BETWEEN_BLOCKS*self.view.frame.size.width + self.WIDTH_OF_BLOCK*self.view.frame.size.height) - (self.HEIGHT_OF_BLOCK*self.view.frame.size.height + self.SPACE_TO_WALLS * self.view.frame.size.height);
view.alpha = 1.0;
CGRect frame2 = [view convertRect:view.bounds toView:self.view];
UIView * viewLarge = [[UIView alloc] initWithFrame:frame2];
[self.view addSubview:viewLarge];
CGRect frame1 = [view convertRect:view.bounds toView:viewLarge];
view.frame = frame1;
[viewLarge addSubview:view];
SKEmitterNode *burstNode = [self particleEmitterWithName:@"SmokeParticles"];
CGRect frame = CGRectMake(view.bounds.origin.x-self.SPACE_BETWEEN_BLOCKS*self.view.frame.size.width, view.bounds.origin.y-self.SPACE_BETWEEN_BLOCKS_HEIGHT, view.bounds.size.width+self.SPACE_BETWEEN_BLOCKS*self.view.frame.size.width, view.bounds.size.height/2);
SKView *skView = [[SKView alloc] initWithFrame:frame];
[viewLarge addSubview:skView];
SKScene *skScene = [SKScene sceneWithSize:skView.frame.size];
[skScene addChild:burstNode];
[viewLarge bringSubviewToFront:view];
[burstNode setParticlePositionRange:CGVectorMake(skView.frame.size.width/5, skView.frame.size.height/100.0)];
skView.allowsTransparency = YES;
skScene.backgroundColor = [UIColor clearColor];
skView.backgroundColor = [UIColor clearColor];
[skView presentScene:skScene];
[burstNode setPosition:CGPointMake(skView.frame.size.width/2, -skView.frame.size.height*0.25)];
}
答案 0 :(得分:0)
我意识到这是一个老问题,但我最近学到了一些可能对其他人有所帮助的东西,并决定在这里分享,因为它是相关的(我认为)。
我假设您的BlockView是UIView
的子类(如果不是,这对您没有帮助,抱歉)。视图每帧执行许多不必要的计算(例如,每个视图检查是否有人点击它)。在创建游戏时,您应该使用尽可能少的UIViews(这就是为什么所有其他评论者建议您只使用一个SKView
并使每个块成为SKSpriteNode
,这不是视图的原因。但是,如果您需要使用其他类型的对象,或者您不想使用SpriteKit(或用于3D对象的SceneKit),请尝试在单个CALayers
内使用UIView
(例如,一个案例)您希望使用CALayers
代替SpriteKit,以增加与旧版iOS版本的向后兼容性,因为SpriteKit需要iOS 7)。
先生。 John Blanco在他的View vs. Layers (including Clock Demo)中很好地解释了CALayer方法。