替换(背景)节点会在屏幕上显示奇怪的结果/节点

时间:2014-07-27 00:26:16

标签: ios sprite-kit skspritenode

我试图通过SpriteKit for iOS进入游戏开发者,我正在阅读 Ray Wenderleich 的一本名为 iOS游戏教程的书。

现在我正在开发平台游戏,但是当我尝试做一些不在书中的事情时,我得到了一些奇怪的结果。

基本上我有一个功能正常的平台游戏,它从JSON文件加载级别,并在背景层中布置砖块/节点。我希望有多个楼层,所以当用户在游戏中跳过一个门户时,会加载一个新的楼层/楼层并将其放置在完全相同的位置(所有楼层都是相同的大小) 。

我没想到我会遇到任何麻烦,因为当用户跳过门户网站时收到通知真的很容易。而且我已经开始加载一个级别,所以此时加载另一个级别并替换原来的级别不应该很难。

然而,事实证明这非常困难。 当游戏加载时我会调用此方法:

- (void)createWorld {
  _bgLayer = [self createScenery:[NSNumber numberWithInteger:1]];

  _worldNode = [SKNode node];
  [_worldNode addChild:_bgLayer];
  [self addChild:_worldNode];

  self.anchorPoint = CGPointMake(0.5, 0.5);
  _worldNode.position = CGPointMake(-_bgLayer.layerSize.width / 2, -_bgLayer.layerSize.height / 2);
}

这会从JSON文件初始化一个级别(第1层),该文件基本上只是一个32x32个节点,它们彼此相邻,形成一个映射。然后创建worldNode,将bgLayer添加到worldNode,然后将其添加到屏幕。稍后它会将worldNode集中在屏幕上。 worldNode是玩家移动时移动的节点,bgLayer始终是静止的。

当用户跳过门户网站时,我会调用此方法:

- (void)goingUp {
  if (_isChangingFloor) return;  
  _isChangingFloor = YES;

  [_bgLayer removeFromParent];
  _bgLayer = nil;
  [_worldNode removeFromParent];
  _worldNode = nil;

  _bgLayer = [self createScenery:[NSNumber numberWithInteger:0]];
  _worldNode = [SKNode node];
  [_worldNode addChild:_bgLayer];
  [self addChild:_worldNode];

  _worldNode.position = CGPointMake(-_bgLayer.layerSize.width / 2, -_bgLayer.layerSize.height / 2);
}

这种方法并不总是这样#34;因为我认为我可以用新的替换bgLayer。这不起作用,所以现在我尝试重置所有内容,以复制开始时createWorld方法中发生的事情。但是,这也不起作用......

这是我跳过门户后得到的结果: enter image description here

正如您所看到的,屏幕上有1个节点,但调试信息表明有446个。我相信这是整个楼层的节点总数,但只有90-100左右应该一次可见。我已尝试在关卡中添加/删除节点,这会增加/减少此数字。

所以你们都可能理解,我真的很困惑。当我跳过门户网站时,为什么不用新的背景替换旧背景? JSON文件本身并没有什么问题,因为我已经尝试在开始时加载floor0,并且工作正常。当我最初加载游戏时,为什么跳过门户网站的行为不一样?这有什么不同?为什么在屏幕上只显示446个节点时,屏幕上只有1个节点?为什么屏幕上只有1个节点?

我已经被困在这几天了,我真的很感激能让我更接近解决方案的任何帮助。提前谢谢!

2 个答案:

答案 0 :(得分:0)

我认为你应该检查_bgLayer的zposition它每次删除时都会有更高的索引并添加它可能会重新解决你的问题

答案 1 :(得分:0)

我看到你的场景在屏幕中间有一个锚点 应点头你的世界节点位置是CGPointZero让世界成为场景的中心吗?

_worldNode.position = CGPointZero;

而不是

 _worldNode.position = CGPointMake(-_bgLayer.layerSize.width / 2, -_bgLayer.layerSize.height / 2);