Xcode,SpriteKit:旋转整个场景,编辑数组内精灵的属性

问题描述 投票:0回答:2

我正在使用Xcode,SpriteKit来创建游戏。 2个问题:

1)每当调用函数时我都需要旋转整个场景:

- (void)mouseClick {
  // RotateWholeScene somehow
}

我知道通过改变它的zrotation旋转精灵,但改变scene.zrotation不起作用。

此外,场景中的某些东西需要保持在相同的位置,如得分等。

我更喜欢它,如果有一种方法可以旋转整个场景,就像摄像机视图已经改变一样,因为有计算(如坠落的物体),如果不需要改变它们会更容易做在代码中。

2)现在程序每帧都创建一个精灵,并将精灵放入一个数组(我在开始时声明)。

NSMutableArray *SomeArray = [NSMutableArray arrayWithObjects: nil];

后来在代码中:

- (void)CalledEachFrame {
  [self addChild: SomeSprite];
  [SomeArray addObject: SomeSprite];
}

在代码的其他地方,我需要:

- (void)AlsoCalledEachFrame {
  for (int i; i < X; i++) {
    SomeArray[i].position = A;
  }
}

这(和其他几个尝试)不起作用,我收到一个错误:

***编辑:我的坏。在图像中,我展示了,我将位置设置为整数而不是CGPoint。然而,即使我放了CGPoint而不是那些99,也会出现同样的错误。

objective-c sprite-kit
2个回答
0
投票

你在这里一次问两个问题。我应该劝阻这一点。不过,这里有:

1)我遇到了类似的问题,我对这个问题的解决方案是将场景节点和hud节点分别放在SKScene子类的单独子节点中,如下所示:

@interface SKSceneSubclass : SKScene 

// ...

@property (strong, nonatomic, readonly) SKNode *sceneContents;
@property (strong, nonatomic, readonly) SKNode *hud;

@end

在场景初始化器中,我将:

- (instancetype)initWithSize:(CGSize)size {
    if (self = [super initWithSize:size]) {
      self.sceneContents = [SKNode new];
      [self addChild:self.sceneContents];

      self.hud = [SKNode new];
      [self addChild:self.hud];
      self.hud.zPosition = 20.f; // ensures the hud on top of sceneContents

      // your custom stuff
      // ...
    }

    return self;
  }

这要求您决定添加子节点哪个节点(sceneContents或hud)将是其父节点。

  [self.sceneContents addChild:newSprite];
  [self.hud addChild:someCoolHudButton];

然后,您可以在sceneContents节点上运行[SKAction rotateByAngle:angle duration:duration]。 hud及其子女不会受到影响。我目前正在使用这种方法来移动和缩放sceneContents,同时拥有一个行为正常的静态HUD。

2)问题是您没有告诉编译器您正在访问的项目是SKNode对象,因此编译器不允许您访问position属性。如果您确定只有数组只包含SKNodes或其子类,请使用forin迭代器方法。

for (<#type *object#> in <#collection#>) {
  <#statements#>
}

在你的情况下,它看起来像这样。

CGPoint newPosition = CGPointMake(x, y);
for (SKNode *node in SomeArray) {
  node.position = newPosition;
}

0
投票

您可以使用以下代码手动旋转视图:

CGAffineTransform transform = CGAffineTransformMakeRotation(-0.1); // change value to desires angle
self.view.transform = transform;
© www.soinside.com 2019 - 2024. All rights reserved.