2015-04-26 1 views
0

Im создает искровой эффект для бомбы, которая вращается и прокручивается по экрану с помощью SKEmitterNode. Я пришел к тому, что я не могу правильно позиционировать искровой эффект. Я могу заставить SKEmitterNode и spriteNode перемещаться по экрану вместе с искровым эффектом, расположенным в центре бомбы, в то время как бомбу вращается. Эффект, который я хочу достичь, - это искра, расположенная правильно в конце фитиля на бомбе, когда бомбу вращается.конкретное позиционирование SKEmitterNode от класса к основной сцене

Первая часть кода из myScene:

MCBomb *_multiUp = [MCBomb spriteNodeWithImageNamed:@"MultiShotPowerUp"];  
[_mainLayer addChild:_multiUp]; 

// Create spark. 
NSString *bombSparkPath = [[NSBundle mainBundle] pathForResource:@"BombSpark" ofType:@"sks"]; 
SKEmitterNode *_bombSpark = [NSKeyedUnarchiver unarchiveObjectWithFile:bombSparkPath]; 
_bombSpark.targetNode = _mainLayer; 
[_mainLayer addChild:_bombSpark]; 
_multiUp.spark = _bombSpark; 

Следующие два фрагмента кода являются из класса .m

-(void)updateSpark { 
if (self.spark) { 
    self.spark.position = self.position; 
} 

и .h

@interface MCBomb : SKSpriteNode 
@property (nonatomic) SKEmitterNode *spark; 
-(void)updateSpark; 

As скоро, когда я добавлю CGPointMake в микс, например self.spark.position = CGPointMake(0.9, 0.9);

Когда вызываемый spriteNode плавает по экрану, а SKEmitterNode появляется в нижнем левом углу, статическом.

Или, если я что-то вроде:

self.spark.position = CGPointMake (self.size.width +50 , self.size.height + 400); 

SKEmitterNode статичен в своем новом положении и spriteNode плавает по экрану. Или, если я это сделать:

self.spark.position = CGPointMake (self.size.width +50 , self.size.height + 400); 
    self.position = self.spark.position; 

я как spriteNode и EmitterNode статическими в там новом положении.

Как вы можете видеть, В моем расстройстве я сжимаю соломинку! Позиционирование является экстремальным только для аффекта, я все еще участвую и могу сделать некоторые советы о том, как получить правильный аффект.

Ниже приведен полный класс, пожалуйста, см новый комментарий:

-(void)spawnMultiShotPowerUp { 
// Setting up Texture Atlas. 
SKTextureAtlas *atlas = [SKTextureAtlas atlasNamed:@"Parts"]; 

MCBomb *_multiUp = [MCBomb spriteNodeWithImageNamed:@"MultiShotPowerUp"]; 
_multiUp.name = @"multiUp"; 
_multiUp.position = CGPointMake(-_multiUp.size.width, randomInRange(150, self.size.height -100)); 
_multiUp.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:16.0]; 
_multiUp.physicsBody.categoryBitMask = mCMultiUpCategory; 
_multiUp.physicsBody.collisionBitMask = 0; 
_multiUp.physicsBody.velocity = CGVectorMake(10, randomInRange(-40, 40)); 
_multiUp.physicsBody.angularVelocity = M_PI; 
_multiUp.physicsBody.linearDamping = 0.0; 
_multiUp.physicsBody.angularDamping = 0.0; 
[_mainLayer addChild:_multiUp]; 

// Create spark. 
NSString *bombSparkPath = [[NSBundle mainBundle] pathForResource:@"BombSpark" ofType:@"sks"]; 
SKEmitterNode *_bombSpark = [NSKeyedUnarchiver unarchiveObjectWithFile:bombSparkPath]; 
_bombSpark.targetNode = _mainLayer; 
_bombSpark.position = CGPointMake(20, 0); 
_multiUp.spark = _bombSpark; 
[_multiUp addChild:_bombSpark]; 

}

+0

Вы не должны редактировать ответ, чтобы развернуть свой вопрос или задать дополнительный вопрос.Если мой ответ предоставил ответ на ваш вопрос, проверьте его как правильное. Если вы хотите расширить свой вопрос, в пределах его первоначального объема, отредактируйте свой вопрос. Если у вас есть другой вопрос, вы должны задать другой вопрос, а не изменить его, чтобы включить его. – sangony

+0

Отмечено, извинения. – Coxy

+0

Эффект искра влияет на изменения, Искра теперь кружит бомбу, как луна вокруг земли! Я не могу разместить узел в правильном положении, когда бомба случайно попадает в сцену, если она движется вверх, расстояние между двумя узлами увеличивается, уменьшается и уменьшается, настолько, что узел бомбы уходит со дна страницы искры практически в точном правильном месте? Я редактировал свой оригинальный вопрос, добавив полный класс. Пожалуйста, объясните это странное поведение. – Coxy

ответ

0

У вас есть эти два узла, который вы создаете:

MCBomb *_multiUp = [MCBomb spriteNodeWithImageNamed:@"MultiShotPowerUp"];  
[_mainLayer addChild:_multiUp]; 

// Create spark. 
NSString *bombSparkPath = [[NSBundle mainBundle] pathForResource:@"BombSpark" ofType:@"sks"]; 
SKEmitterNode *_bombSpark = [NSKeyedUnarchiver unarchiveObjectWithFile:bombSparkPath]; 
_bombSpark.targetNode = _mainLayer; 
[_mainLayer addChild:_bombSpark]; 

но вы добавляете вашу искру mainLayer, который не подходит для того, что вы пытаетесь сделать. Вам нужно добавить искру в качестве ребенка к своей бомбе, а не к mainLayer.

[_multiUp addChild:_bombSpark]; 

Имейте в виду, что позиционирование _bombSpark теперь изменилось, потому что это ребенок _multiUp. Это означает, что позиция 0bombSpark равна центральному положению узла _multiUp.

Добавить позицию в _bombSpark так:

_bombSpark.position = CGPointMake(20,0); 

Это ставит искру 20 пунктов вверх от центра _multiUp. Играйте с точными координатами x, y до тех пор, пока не получите их там, где они должны быть.