我正在使用SpriteKit的粒子发射器系统在背景中构建一个移动的星形场,并将玩家的船放在屏幕的中心。
当玩家触摸屏幕区域时,我会计算角度并为玩家精灵转动该方向设置动画。
然而,当我将它应用于星形场时,星形场被绘制的整个矩形会旋转。然而,我想要的是,单个粒子只是开始朝着新的方向发展。
将整张纸旋转到整个点上并且仅使点移动到新角度之间的区别。这有意义吗?
这是我到目前为止玩家正确旋转但星球场“像一整张纸一样旋转”的内容:
-(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];
}
答案 0 :(得分:0)
您可能需要更改SKEmitterNode
的{{1}}属性(https://developer.apple.com/library/iOS/documentation/SpriteKit/Reference/SKEmitterNode_Ref/Reference/Reference.html#//apple_ref/occ/instp/SKEmitterNode/particleRotation)
答案 1 :(得分:0)
您需要按如下方式调整emissionAngle:
[starField setEmissionAngle:(atan2(offset.y, offset.x) - M_PI_2)];
答案 2 :(得分:0)
你应该做的是拥有particleField
节点或其他东西,并将其用作你所拥有的发射器的targetNode
。 (另外,也将发射器作为子节点放在此)。 particleField
只是标准SKNode
而不是发射器。它将有一个发射器作为一个孩子,所有的粒子也将是孩子。
将其视为"粒子层"如果你愿意的话。
现在你有一个拥有"拥有"的节点。所有粒子和发射器等...
粒子的位置和粒子的方向都取决于此particleField
节点的位置。
现在你可以旋转particleField
并移动它等...(或缩放它等等),所有粒子都会随之移动。