Ios 精灵节点随机渲染…需要帮助
这是我在这里的第一篇文章,我找不到与其他类似问题相关的答案 所以,问题是,我正在开发一款游戏,但它在模拟器上的这个项目上以及在我的iOS设备上的表现非常奇怪。精灵节点有时出现,有时不出现。这就像一个随机事件。我看到屏幕上的节点计数器正在添加它们,但我没有看到精灵。我在didMoveToView方法中添加了2个精灵和1个SKNode,它们应作为容器层,用于将精灵放置在背景上,并在全局范围中声明为mainLayer:Ios 精灵节点随机渲染…需要帮助,ios,swift,sprite-kit,swift2,Ios,Swift,Sprite Kit,Swift2,这是我在这里的第一篇文章,我找不到与其他类似问题相关的答案 所以,问题是,我正在开发一款游戏,但它在模拟器上的这个项目上以及在我的iOS设备上的表现非常奇怪。精灵节点有时出现,有时不出现。这就像一个随机事件。我看到屏幕上的节点计数器正在添加它们,但我没有看到精灵。我在didMoveToView方法中添加了2个精灵和1个SKNode,它们应作为容器层,用于将精灵放置在背景上,并在全局范围中声明为mainLayer: var mainLayer = SKNode() var character:SK
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)
}
var mainLayer=SKNode()
变量字符:SKSpriteNode!
瓦尔:呸!
覆盖func didMoveToView(视图:SKView){
self.addChild(mainLayer)
let background=SKSpriteNode(图像名为:“bg”)
background.position=CGPoint(x:self.frame.midX,y:self.frame.midY)
background.size=self.view!.bounds.size
background.ancorpoint=CGPoint(x:0.5,y:0.5)
background.blendMode=SKBlendMode.Replace
self.addChild(背景)
character=SKSpriteNode(图像名称:“character”)
character.position=CGPoint(x:self.frame.midX,y:0.0)
mainLayer.addChild(字符)
}
覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?){
真的
}
重写func didSimulatePhysics(){
如果你开枪
{
射击()
didShoot=false
}
mainLayer.EnumerateChildNodeWithName(“bullet”){(节点,停止)->中的Void
if!CGRectContainsPoint(self.frame,node.position)
{
node.removeFromParent()节点
}
}
}
射击()
{
让bullet=SKSpriteNode(图像名为:“bullet”)
/*
定位,物理体,等等…这是有效的。。。
*/
bullet.name=“bullet”
mainLayer.addChild(项目符号)
}
物理和定位在场景中非常有效,当我触摸屏幕时,屏幕上的节点数会增加,但我不会在每次运行应用程序时都看到它们,除了始终存在的背景。所以我必须在我的iOS设备或模拟器上重启游戏,然后它们会开始出现,在游戏的中间,它们会在某个时间点消失,然后再次出现……有什么想法吗?我使用的是XCode 7.2.1和Swift 2.1.1,这是最有可能的。将角色精灵的
zPosition
设置在背景层之上
为了提高速度,SpriteKit渲染精灵时不考虑z顺序。如果希望z顺序是特定的,则需要设置z顺序
mainLayer.zPosition = 1 //z position of 1. if bg is 0, main will be on top
它们出现和消失的原因是,精灵套件可能会在不同的帧上以不同的顺序绘制它们-如果不设置位置,它们渲染的顺序是随机的。最有可能的是Z定位。将角色精灵的
zPosition
设置在背景层之上
为了提高速度,SpriteKit渲染精灵时不考虑z顺序。如果希望z顺序是特定的,则需要设置z顺序
mainLayer.zPosition = 1 //z position of 1. if bg is 0, main will be on top
它们出现和消失的原因是,sprite kit可能会在不同的帧上以不同的顺序绘制它们-如果不设置位置,它们渲染的顺序是随机的。如果我看得正确,可能会发生一些事情。第一个问题是在主图层之后绘制背景。这是因为您的
zPosition
是相同的,因此它将按照添加的顺序(mainLayer,background)进行迭代和绘制。现在,背景节点大小是视图添加到场景中时的大小,但根据缩放模式的不同,场景大小可能会发生变化,因此您可以拥有比原始大小更大的视图,从而允许在背景之外绘制精灵,从而显示。
您还使用了SKBlend.Replace。这意味着源将替换目标像素。由于背景画在上面,它将擦除下面的任何内容。如果我看得对,可能会发生一些事情。第一个问题是在主图层之后绘制背景。这是因为您的
zPosition
是相同的,因此它将按照添加的顺序(mainLayer,background)进行迭代和绘制。现在,背景节点大小是视图添加到场景中时的大小,但根据缩放模式的不同,场景大小可能会发生变化,因此您可以拥有比原始大小更大的视图,从而允许在背景之外绘制精灵,从而显示。
您还使用了SKBlend.Replace。这意味着源将替换目标像素。由于背景画在顶部,它将擦除底部的任何内容。在所有答案注释中,检查zPositions man。在所有答案注释中,检查zPositions man。