【问题标题】:specific positioning of SKEmitterNode from a class to main sceneSKEmitterNode从类到主场景的具体定位
【发布时间】:2015-04-26 14:50:02
【问题描述】:

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

}

【问题讨论】:

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

标签: ios objective-c sprite-kit skspritenode skemitternode


【解决方案1】:

您正在创建这两个节点:

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 坐标值进行调整,直到您到达它必须在的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2015-05-19
    相关资源
    最近更新 更多