Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 精灵节点随机渲染…需要帮助_Ios_Swift_Sprite Kit_Swift2 - Fatal编程技术网

Ios 精灵节点随机渲染…需要帮助

Ios 精灵节点随机渲染…需要帮助,ios,swift,sprite-kit,swift2,Ios,Swift,Sprite Kit,Swift2,这是我在这里的第一篇文章,我找不到与其他类似问题相关的答案 所以,问题是,我正在开发一款游戏,但它在模拟器上的这个项目上以及在我的iOS设备上的表现非常奇怪。精灵节点有时出现,有时不出现。这就像一个随机事件。我看到屏幕上的节点计数器正在添加它们,但我没有看到精灵。我在didMoveToView方法中添加了2个精灵和1个SKNode,它们应作为容器层,用于将精灵放置在背景上,并在全局范围中声明为mainLayer: var mainLayer = SKNode() var character:SK

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

所以,问题是,我正在开发一款游戏,但它在模拟器上的这个项目上以及在我的iOS设备上的表现非常奇怪。精灵节点有时出现,有时不出现。这就像一个随机事件。我看到屏幕上的节点计数器正在添加它们,但我没有看到精灵。我在didMoveToView方法中添加了2个精灵和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)
}
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。