随机渲染的精灵节点......需要帮助

时间:2016-02-12 14:53:18

标签: ios swift sprite-kit swift2

这是我在这里发表的第一篇文章,我无法找到与此类问题类似的其他问题的答案。

所以,问题是,我正在开发一款游戏,但它在模拟器上以及我的iOS设备上的这个项目表现得非常奇怪。 Sprite节点有时会出现,有时则不会出现。它就像一个随机的。我看到屏幕上的节点计数器正在添加它们,但我没有看到精灵。我在didMoveToView方法中添加了2个sprite,还有1个SKNode,它应该作为容器层,用于将Sprite保存在名为全局范围内声明的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

2 个答案:

答案 0 :(得分:2)

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

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

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

它们出现和消失的原因是因为精灵套件可能会在不同的帧上以不同的顺序绘制它们 - 没有位置设置,它随机呈现它们的顺序。

答案 1 :(得分:0)

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