【问题标题】:Determine when a SpriteNode is leaving the screen?确定 SpriteNode 何时离开屏幕?
【发布时间】:2014-09-27 08:28:30
【问题描述】:

我想从屏幕上移除所有对象。目前我使用带有“障碍”的接触检测。

我初始化屏幕周围的障碍,当 SpriteNode 与其中一个接触时,它将从场景中移除。但是这种方法效果不佳,会使我的游戏崩溃。

你知道是否有一种简单的方法可以将所有对象移出屏幕吗?

这是我的带有障碍的代码:

// declarations
var barrierLeft:SKSpriteNode = SKSpriteNode()
var barrierRight:SKSpriteNode = SKSpriteNode()
var barrierTop:SKSpriteNode = SKSpriteNode()

// In didMoveToView method
barrierLeft.size = CGSizeMake(1, self.frame.height*2)
barrierLeft.physicsBody = SKPhysicsBody (rectangleOfSize: barrierLeft.size)
barrierRight.position = CGPointMake(0, 0)

barrierLeft.physicsBody?.dynamic = false
barrierLeft.physicsBody?.categoryBitMask = barrierCategory
barrierLeft.physicsBody?.contactTestBitMask = flechetteCategory
addChild(barrierLeft)

barrierRight.size = CGSizeMake(1, self.frame.height*2)
barrierRight.physicsBody = SKPhysicsBody (rectangleOfSize: barrierLeft.size)
barrierRight.position = CGPointMake(self.size.width+10, 0)
barrierRight.physicsBody?.dynamic = false
barrierRight.physicsBody?.categoryBitMask = barrierCategory
barrierRight.physicsBody?.contactTestBitMask = flechetteCategory
addChild(barrierRight)

//     
func didBeginContact(contact: SKPhysicsContact!)
{
    var firstBody: SKPhysicsBody
    var secondBody: SKPhysicsBody


    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
    {
        firstBody = contact.bodyA
        secondBody = contact.bodyB

    }
    else
    {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
    }

    if ((firstBody.categoryBitMask & flechetteCategory) != 0 && (secondBody.categoryBitMask & barrierCategory) != 0)
    {
        flecheDidCollideWithbarrier(firstBody.node as SKSpriteNode, barrier: secondBody.node as SKSpriteNode)
    }

//

func flecheDidCollideWithbarrier (fleche: SKSpriteNode, barrier: SKSpriteNode)
{
    println("barrière")
    counterGainTime = 0
    fleche.removeFromParent()


}

感谢您的帮助!

【问题讨论】:

    标签: ios iphone swift sprite-kit


    【解决方案1】:

    您可以检查每个节点的位置以确定它是否在场景中。然后,您可以相应地删除节点。

    override func update(currentTime: CFTimeInterval) {
        // Loop over all nodes in the scene
        self.enumerateChildNodesWithName("*") {
            node, stop in
            if (node is SKSpriteNode) {
                let sprite = node as SKSpriteNode
                // Check if the node is not in the scene
                if (sprite.position.x < -sprite.size.width/2.0 || sprite.position.x > self.size.width+sprite.size.width/2.0
                    || sprite.position.y < -sprite.size.height/2.0 || sprite.position.y > self.size.height+sprite.size.height/2.0) {
                        sprite.removeFromParent()
                }
            }
        }
    }
    

    【讨论】:

    • 我对您的解决方案有疑问。
    • 我有问题。我的函数更新已用于区间函数。当我在 func update 中添加您的方法时,节点不会被删除,并且当每个节点离开屏幕时,它会为我的分数添加 +1。我的分数是根据两个身体之间的每次接触计算的。我无法理解你的方法和我的分数之间的关系。此外,我在 func 更新之外编辑您的方法,如下所示: if (node.position.x self . size.width) ||节点位置.y self.size.height) {node.removeFromParent()} 该方法有效,但并非一直有效。你能帮帮我吗?
    • 场景周围有边缘循环吗?
    • 对不起,我刚开始快速编程,我不知道究竟什么是边缘循环。我在比赛期间有循环。以我的计时器为例。我的游戏包括从屏幕顶部添加随机间隔的物理体,我必须从底部摧毁它们(就像太空入侵者一样),玩 60 秒。
    • 您是否消除了代码中的障碍?我的代码旨在替换您问题中的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2011-09-14
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多