0

我在屏幕上有 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)];
}
4

1 回答 1

0

我意识到这是一个老问题,但我最近学到了一些可能对其他人有帮助的东西,并决定在这里分享它,因为它是相关的(我认为)。

我假设你的 BlockView 是一个子类UIView(如果不是,这对你没有帮助,抱歉)。视图每帧都会执行许多不必要的计算(例如,每个视图都会检查是否有人点击了它)。在创建游戏时,您应该尽可能少地使用 UIView(这就是为什么所有其他评论者都建议您只使用一个SKView并让每个 Block a SKSpriteNode,这不是一个视图)。但是,如果您需要使用其他类型的对象,或者您不想使用 SpriteKit(或用于 3D 对象的 SceneKit),请尝试CALayers在单个对象中使用UIView(例如,您更愿意使用CALayers而不是 SpriteKit 的一种情况是增加与旧 iOS 版本的向后兼容性,因为 SpriteKit 需要 iOS 7)。

John Blanco 先生在他的View vs. Layers(包括时钟演示)中很好地解释了 CALayer 方法。

于 2015-09-08T22:44:24.973 回答