0

我使用 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;

接下来的两段代码来自 .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 时,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];

}

4

1 回答 1

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 的子项。这意味着 _bombSpark 的位置 0,0 等于 _multiUp 节点的中心位置。

像这样向 _bombSpark 添加一个位置:

_bombSpark.position = CGPointMake(20,0);

这使得火花从 _multiUp 的中心向上 20 点。玩弄精确的 x,y 坐标值,直到你把它带到它必须在的地方。

于 2015-04-26T17:27:23.883 回答