【问题标题】:Sprite Nodes rendering randomly...HELP neededSprite 节点随机渲染...需要帮助
【发布时间】:2016-02-12 14:53:18
【问题描述】:

这是我在这里的第一篇文章,我找不到与其他类似问题相关的答案。

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

【问题讨论】:

  • 所有答案都注明,检查 zPositions 人。

标签: ios swift sprite-kit swift2


【解决方案1】:

最有可能是 zPositioning。将角色精灵的zPosition 设置在背景层之上。

SpriteKit 渲染精灵而不关心 z 顺序,以提高速度。如果您希望它是特定的,则需要设置 z 顺序。

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

它们出现和消失的原因是因为 sprite kit 可能在不同帧上以不同的顺序绘制它们 - 如果没有设置位置,它们的渲染顺序是随机的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 2021-05-10
      • 1970-01-01
      • 2012-06-24
      • 2012-05-10
      • 2015-01-25
      • 1970-01-01
      • 2011-06-11
      • 2014-11-30
      相关资源
      最近更新 更多