5

我正在使用 SpriteKit 的 Particle Emitter 系统在背景中构建一个移动的星域,玩家的飞船位于屏幕中央。

当玩家触摸屏幕的某个区域时,我会计算角度并动画玩家精灵转向该方向。

然而,当我将它应用于星域时,星域绘制的整个矩形都会旋转。然而,我想要的是让单个粒子简单地开始朝着新的方向移动。

这就是旋转一张满是点的整张纸和仅仅让这些​​点移向一个新角度之间的区别。那有意义吗?

到目前为止,当玩家正确旋转但星域“像整张纸一样旋转”时,这是我目前所拥有的:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    // Choose one of the touches to work with
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];
    CGPoint center = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));

    CGPoint offset = rwSub(location, center);

    SKEmitterNode *starfield = (SKEmitterNode *)[self childNodeWithName:@"starfield"];

    SKSpriteNode *player = (SKSpriteNode *)[self childNodeWithName:@"player"];

    SKAction *rotateNode = [SKAction rotateToAngle: (CGFloat)atan2(offset.y, offset.x) duration:0.5  shortestUnitArc:TRUE];
    [player runAction: rotateNode];

    SKAction *rotateStarfieldNode = [SKAction rotateToAngle: (CGFloat)(atan2(offset.y, offset.x) - M_PI_2) duration:0.5  shortestUnitArc:TRUE];
    [starfield runAction: rotateStarfieldNode];
}
4

3 回答 3

0

您可能需要更改SKEmitterNode'particleRotation属性(https://developer.apple.com/library/iOS/documentation/SpriteKit/Reference/SKEmitterNode_Ref/Reference/Reference.html#//apple_ref/occ/instp/SKEmitterNode/particleRotation

于 2013-12-11T07:49:25.780 回答
0

你需要调整emissionAngle如下:

[starField setEmissionAngle:(atan2(offset.y, offset.x) - M_PI_2)];
于 2013-12-25T05:25:46.653 回答
0

您可能应该做的是拥有一个particleField节点或其他东西并将其用作targetNode您拥有的发射器。(另外,也将发射器放在此作为子节点)。这particleField将只是一个标准SKNode而不是发射器。它将有一个发射器作为子级,所有粒子也将是子级。

如果您愿意,可以将其视为“粒子层”。

现在你有一个“拥有”所有粒子和发射器等的节点......

粒子的位置和粒子的方向都取决于这个particleField节点的位置。

现在您可以旋转particleField并移动它等...(或缩放它等...),所有粒子都会随之移动。

于 2017-06-19T08:27:55.217 回答