【问题标题】:Why does SKLabelNode increment too much on Contact? (Swift)为什么 SKLabelNode 在 Contact 上增加太多? (迅速)
【发布时间】:2015-06-04 04:48:50
【问题描述】:

我试图让我的标签在每次精灵与联系人节点接触时增加 +1,但它会增加像 +23 这样的大数字。我认为正在发生的事情是它考虑到精灵接触节点的每一毫秒,但我不知道如何修复它。 这是我在 DidMoveToView 中的标签节点代码:

score = 0
        scoreLabelNode = SKLabelNode(fontNamed:"[z] Arista Light")
        scoreLabelNode.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/4)
        scoreLabelNode.zPosition = 100
        scoreLabelNode.fontSize = 500
        scoreLabelNode.alpha = 0.03
        scoreLabelNode.text = String(score)
        self.addChild(scoreLabelNode)

这是我的联系节点:

var contactNode = SKNode()
        contactNode.position = CGPoint(x: self.frame.size.width + asteroidTexture.size().height / 15 + rocket.size.width, y: 0.0)
        contactNode.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake( asteroid.size.width/16, self.frame.size.height*2 ))
        contactNode.physicsBody?.dynamic = false
        contactNode.physicsBody?.categoryBitMask = scoreCategory
        contactNode.physicsBody?.contactTestBitMask = rocketCategory
        contactNode.runAction(asteroidsMoveAndRemove)
        moving.addChild(contactNode)

这是我的代码,当我的火箭精灵与 contactNode 接触时,它会递增:

func didBeginContact(contact: SKPhysicsContact) {

        if moving.speed > 0 {
            if ( contact.bodyA.categoryBitMask & scoreCategory ) == scoreCategory || ( contact.bodyB.categoryBitMask & scoreCategory ) == scoreCategory {
                // Rocket has contact with score entity
                score++
                scoreLabelNode.text = String(score)
                println("HIT")
            }
            else{
                gameOver()
            }
        }

'moving' 是当我的小行星精灵移动时,接触节点随之移动

【问题讨论】:

    标签: swift physics bitmask


    【解决方案1】:

    可能不是每毫秒,而是每帧,这就是为什么你最终可能会得到像 +23 这样的数字(碰撞发生的时间为 1/3 秒,如果它以 60 FPS 的速度运行,大约20 帧左右)。

    您可以做的一件事是将SKNode 子类化为一个实际的ContactNode 类,该类具有一个属性hasBeenStruck,该属性最初设置为false 或类似的东西。

    那么当你检查联系人时,你首先检查hasBeenStruck是否为假。如果是,则注册命中并更新分数,然后将ContactNodehasBeenStruck 属性设置为true。这样,在接下来的 20 次左右检查是否发生联系时,它不会因为 if 条件失败而不断更新标签。

    但是,如果您的游戏允许用户两次点击相同的ContactNode 并获得两次得分,那么这不是一个完整的解决方案。如果是这种情况,您可以为给定的ContactNode 使用计时器或“无敌”时间段。

    【讨论】:

    • 太好了,希望一切都适合你!确保关闭问题/如果一切都已回答并正常工作,请选择一个答案:)
    猜你喜欢
    • 2015-06-25
    • 1970-01-01
    • 2019-05-30
    • 2020-12-20
    • 1970-01-01
    • 2017-12-02
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多