Ios 从类到主场景的SKEmitterNode的特定定位

Ios 从类到主场景的SKEmitterNode的特定定位,ios,objective-c,sprite-kit,skspritenode,skemitternode,Ios,Objective C,Sprite Kit,Skspritenode,Skemitternode,我正在为一个炸弹创造一种火花效果,它使用SKEmitterNode在屏幕上旋转和滚动。我已经到了一个关键点,因为我不能正确定位火花效应。我可以让SKEmitterNode和spriteNode在屏幕上移动,当炸弹旋转时,火花效应位于炸弹中心。我希望达到的效果是,当炸弹旋转时,火花正确地定位在炸弹芯的末端 第一段代码来自myScene: MCBomb *_multiUp = [MCBomb spriteNodeWithImageNamed:@"MultiShotPowerUp"]; [_m

我正在为一个炸弹创造一种火花效果,它使用SKEmitterNode在屏幕上旋转和滚动。我已经到了一个关键点,因为我不能正确定位火花效应。我可以让SKEmitterNode和spriteNode在屏幕上移动,当炸弹旋转时,火花效应位于炸弹中心。我希望达到的效果是,当炸弹旋转时,火花正确地定位在炸弹芯的末端

第一段代码来自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;
接下来的两段代码来自class.m

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

@interface MCBomb : SKSpriteNode
@property (nonatomic) SKEmitterNode *spark;
-(void)updateSpark;
一旦我在混合物中加入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];

}

您有两个正在创建的节点:

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 addChild:_bombSpark];
请记住,bombSpark的定位现在已经改变,因为它是multiUp的一个孩子。这意味着_bombSpark的位置0,0等于_multiUp节点的中心位置

向_bombSpark添加一个位置,如下所示:

_bombSpark.position = CGPointMake(20,0);

这使得火花从多向上的中心向上20点。反复使用精确的x、y坐标值,直到你找到它必须在的位置。

你不应该编辑答案来展开你的问题或提出其他问题。如果我的回答回答了你的问题,请检查是否正确。如果您希望在原始范围内扩展问题,请编辑您的问题。如果你有其他问题,你应该问另一个问题,而不是编辑你当前的问题来包含它。火花影响行为已经发生了巨大的变化,火花现在围绕着炸弹旋转,就像月球绕着地球旋转一样!我无法将节点放置在正确的位置,当炸弹随机进入场景时,如果它向上移动,两个节点之间的距离会增加,向下,然后减小,以至于炸弹节点从页面底部移动时,火花实际上处于正确的位置?我已经编辑了我的原始问题,并添加了完整的类。请解释这种奇怪的行为。试着去掉行_bombSpark.targetNode=\u mainLayer;看看会发生什么。是的,在你最初的回答之后,我试过了,但行为还是一样的。唯一改变的是,火花更密集,就像它的复制品一样,一个接一个。