我试图通过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
方法中发生的事情。但是,这也不起作用......
这是我跳过门户后得到的结果:
正如您所看到的,屏幕上有1个节点,但调试信息表明有446个。我相信这是整个楼层的节点总数,但只有90-100左右应该一次可见。我已尝试在关卡中添加/删除节点,这会增加/减少此数字。
所以你们都可能理解,我真的很困惑。当我跳过门户网站时,为什么不用新的背景替换旧背景? JSON文件本身并没有什么问题,因为我已经尝试在开始时加载floor0
,并且工作正常。当我最初加载游戏时,为什么跳过门户网站的行为不一样?这有什么不同?为什么在屏幕上只显示446个节点时,屏幕上只有1个节点?为什么屏幕上只有1个节点?
我已经被困在这几天了,我真的很感激能让我更接近解决方案的任何帮助。提前谢谢!
答案 0 :(得分:0)
我认为你应该检查_bgLayer的zposition它每次删除时都会有更高的索引并添加它可能会重新解决你的问题
答案 1 :(得分:0)
我看到你的场景在屏幕中间有一个锚点 应点头你的世界节点位置是CGPointZero让世界成为场景的中心吗?
_worldNode.position = CGPointZero;
而不是
_worldNode.position = CGPointMake(-_bgLayer.layerSize.width / 2, -_bgLayer.layerSize.height / 2);