2016-02-12 26 views
0

这是我在这里的第一篇文章,我找不到与其他类似问题有关的答案。雪碧节点随机渲染......需要帮助

所以,问题是,我正在开发一款游戏,但它在模拟器上和我的iOS设备上的这个项目上表现得非常怪异。 Sprite节点有时出现,有时不出现。这就像一个随机的。我看到屏幕上的节点计数器正在添加它们,但我没有看到精灵。我有2个精灵在didMoveToView方法添加和1个SKNode应表现为容器层用于保持精灵上命名为mainLayer在全球范围内声明的背景的顶部:

var mainLayer = SKNode() 
var character:SKSpriteNode! 
var didShoot:Bool! 

override func didMoveToView(view: SKView) { 

self.addChild(mainLayer) 

let background = SKSpriteNode(imageNamed: "bg") 
background.position = CGPoint(x:self.frame.midX, y:self.frame.midY) 
background.size = self.view!.bounds.size 
background.anchorPoint = CGPoint(x:0.5, y:0.5) 
background.blendMode = SKBlendMode.Replace 
self.addChild(background) 

character = SKSpriteNode(imageNamed: "character") 
     character.position = CGPoint(x:self.frame.midX, y:0.0) 

mainLayer.addChild(character) 

} 


override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    didShoot = true 

} 


override func didSimulatePhysics() { 

if didShoot 
     { 
      shoot() 
      didShoot = false 
     } 

    mainLayer.enumerateChildNodesWithName("bullet") { (node, stop) -> Void in 
     if !CGRectContainsPoint(self.frame, node.position) 
     { 
      node.removeFromParent() 
     } 
    } 
} 



shoot() 
{ 

let bullet = SKSpriteNode(imageNamed: "bullet") 
/* 
positioning, physics bodies, etc...this works... 
*/ 
bullet.name = "bullet" 
mainLayer.addChild(bullet) 
} 

物理学中,定位在场景中效果很好,因为当我触摸屏幕时,屏幕上的节点数会增加,但每次运行应用程序时都看不到它们,除了始终存在的背景之外。所以我必须在我的iOS设备或我的模拟器上重新启动游戏几次,最终他们会开始出现,并且在游戏过程中他们会在某个时间点消失并再次出现......任何想法?我正在使用XCode 7.2.1和Swift 2.1.1

+0

作为所有的答案注意,检查zPositions男人。 – TheCodingArt

回答

2

这是zPositioning最有可能的。将角色精灵的zPosition设置为高于背景图层。

SpriteKit渲染精灵而不关心z顺序,以获得速度。如果你想让它成为特定的东西,你需要设置z顺序。

mainLayer.zPosition = 1 //z position of 1. if bg is 0, main will be on top 

它们出现和消失的原因是因为精灵套件可以在不同的帧不同的顺序绘制它们 - 无位置设定,其随机的顺序,他们在得到呈现

0

如果我在看。这是正确的,可能会发生一些事情。第一个问题是你的背景是在你的mainLayer后面绘制的。这是因为你的zPosition是相同的,所以它会迭代并绘制它添加的顺序(mainLayer,background)。现在,您的背景节点大小是添加到场景中时视图的大小,但根据您的缩放模式,场景大小可能会发生变化,因此您可以使视图大于原始大小,从而允许精灵被绘制在背景之外,从而出现。 您也正在使用SKBlend.Replace。这意味着源将替换目标像素。由于背景是在顶部绘制的,它会清除底下的任何东西。