2013-12-21 38 views
7

我试图让它成为我在玩家移动时跟随玩家的粒子。我试图复制的效果就像当你在网站上时,他们有一些随鼠标移动的对象。我试图通过让粒子移动玩家的数量来做到这一点,但它并没有重现预期的效果。有什么建议么?我的代码:用SKEmitterNode和SpriteKit中的粒子创建一条轨迹

声明颗粒

NSString *myParticlePath = [[NSBundle mainBundle] pathForResource:@"trail" ofType:@"sks"]; 
self.trailParticle = [NSKeyedUnarchiver unarchiveObjectWithFile:myParticlePath]; 
self.trailParticle.position = CGPointMake(0,0); 
[self.player addChild:self.trailParticle]; 

Move方法

-(void)dragPlayer: (UIPanGestureRecognizer *)gesture { 

     if (gesture.state == UIGestureRecognizerStateChanged) { 

       //Get the (x,y) translation coordinate 
       CGPoint translation = [gesture translationInView:self.view]; 

       //Move by -y because moving positive is right and down, we want right and up 
       //so that we can match the user's drag location (SKView rectangle y is opp UIView) 
       CGPoint newLocation = CGPointMake(self.player.position.x + translation.x, self.player.position.y - translation.y); 
       CGPoint newLocPart = CGPointMake(self.trailParticle.position.x + translation.x, self.trailParticle.position.y - translation.y); 

       //Check if location is in bounds of screen 
       self.player.position = [self checkBounds:newLocation]; 
       self.trailParticle.position = [self checkBounds:newLocPart]; 
       self.trailParticle.particleAction = [SKAction moveByX:translation.x y:-translation.y duration:0]; 
       //Reset the translation point to the origin so that translation does not accumulate 
       [gesture setTranslation:CGPointZero inView:self.view]; 

     } 

    } 

回答

11

试试这个:

1)如果你的发射是在场景,使用这个发射器的属性targetNode和设置为场景。这意味着,颗粒不会发射器的孩子,但你的场景应该留下痕迹..

不知道这是正确的(我做它在C#):

self.trailParticle.targetNode = self; // self as Scene 

还有一些额外的:

2)我认为你可以,而附上您的发射器self.player为孩子这么它将与您的播放器一起,并自动移动,然后就没有必要这样:

self.trailParticle.position = [self checkBounds:newLocPart]; 
self.trailParticle.particleAction = [SKAction moveByX:translation.x y:-translation.y duration:0]; 
+2

targetNode是我所需要的。谢谢。 –

0

在更新循环中检查您的播放器是否沿着X轴移动。 然后在每次发生这种情况时创建一个精灵节点。在这个例子中你的球员名称为“player1” 这里的关键是你的粒子必须在出生率附近的粒子列中有最大值。打击代码适合我。

-(void)update:(CFTimeInterval)currentTime { 
// Find your player 
SKNode* Mynode = (SKSpriteNode *)[self childNodeWithName:@"player1"]; 

// Check if our player is moving. Lower the number if you are not getting a trail. 
if (Mynode.physicsBody.velocity.dx>10| 
Mynode.physicsBody.velocity.dy>10| 
Mynode.physicsBody.velocity.dx<-10| 
Mynode.physicsBody.velocity.dy<-10){  


// Unpack your particle 
NSString *myParticlePath = [[NSBundle mainBundle] pathForResource:@"trail" ofType:@"sks"]; 

//Create your emitter 
SKEmitterNode *myTrail = [NSKeyedUnarchiver unarchiveObjectWithFile:myParticlePath]; 

// This ensures your trail doesn't stay forever . Adjust this number for different effects 
myTrail.numParticlesToEmit=10; 

// The length of your trail - higher number, longer trail. 
myTrail.particleLifetime = 2.0; 

//Set the trail position to the player position 
myTrail.position=Mynode.position; 

//Add the trail to the scene 
[self addChild:myTrail]; 
} 

}