【问题标题】:SKSpriteNode slows down but shouldn'tSKSpriteNode 减慢但不应该
【发布时间】:2017-03-18 11:45:08
【问题描述】:

我试图让我的“词”在屏幕上浮动;恒速,无冲击,无重力,无摩擦。一切正常,除了这个词变慢了。

造字代码:

func createWordNode (word: String, atPos: CGPoint) -> SKSpriteNode {

    let doneSize = CGSize(width: 50, height: 50)

    let wordSprite = SKSpriteNode()
    wordSprite.size = CGSize(width: doneSize.width * CGFloat(word.len()), height: doneSize.height)
    wordSprite.position = atPos
    wordSprite.blendMode = .replace
    wordSprite.zPosition = zlvlBG + 1

    let ltrs = Array(word.uppercased().characters)

    for i in 0 ... ltrs.count - 1 {

        let done = SKSpriteNode(imageNamed: "LetterTiles/Tile" + String(ltrs[i]) + ".png")
        done.size = doneSize
        done.position = CGPoint(x: doneSize.width * CGFloat(Double(i) - 1.5), y: 0)
        done.blendMode = .replace
        done.zPosition = zlvlBG + 1

        wordSprite.addChild(done)

    }

    wordSprite.physicsBody?.restitution = 1
    wordSprite.physicsBody?.friction = 0
    wordSprite.physicsBody?.linearDamping = 0
    wordSprite.physicsBody?.angularDamping = 0
    wordSprite.physicsBody?.mass = 2000

    wordSprite.physicsBody = SKPhysicsBody(rectangleOf: wordSprite.size)
    wordSprite.physicsBody?.collisionBitMask = 0
    wordSprite.physicsBody?.contactTestBitMask = 0
    wordSprite.physicsBody?.categoryBitMask = categoryWords
    wordSprite.physicsBody?.fieldBitMask = 0

    wordSprite.physicsBody?.isDynamic = true
    wordSprite.physicsBody?.affectedByGravity = false
    wordSprite.physicsBody?.allowsRotation = false

    var velocity = CGVector()
    velocity.dx = 100
    velocity.dy = 0
    wordSprite.physicsBody?.velocity = velocity
    wordSprite.physicsBody?.applyImpulse(velocity)

    wordSprite.name = "Word:" + word


    return wordSprite
}

我这样调用函数:

addChild (createWordNode(word: "Done", atPos: CGPoint(x:-500, y:450)))

任何想法为什么单词变慢? 谢谢。

【问题讨论】:

    标签: ios swift skspritenode skphysicsbody


    【解决方案1】:

    看起来您正在创建一个不需要在物理模拟中的对象。因此,您可能需要重新考虑简单地删除与物理相关的代码并手动更新节点 position

    也就是说,如果您希望此节点保留在物理模拟中。在开始尝试修改属性之前,您需要将SKPhysicsBody 添加到SKSpriteNode。例如

    wordSprite.physicsBody = SKPhysicsBody(rectangleOf: wordSprite.size)
    wordSprite.physicsBody?.restitution = 1
    wordSprite.physicsBody?.friction = 0
    wordSprite.physicsBody?.linearDamping = 0
    wordSprite.physicsBody?.angularDamping = 0
    wordSprite.physicsBody?.mass = 2000
    

    【讨论】:

    • 谢谢。做到了。就像您建议的那样,我在添加到节点后更改了 psysicsbody 参数,并且效果很好。非常感谢。
    • 优秀的@MatthewLittle,如果你能接受这个答案,那就太好了。谢谢
    【解决方案2】:

    我曾与 sprite 一起工作过。但是,我不是专家。使用动作代替速度是否对您有用,例如:

    var moveRight = SKAction.moveTo(CGPointMake(400, 0), duration:2.0)
    wordSprite.runAction(moveRight)
    

    还有一点需要指出。为什么使用applyImpulse。速度应该足够了。您是否尝试将其删除?

    【讨论】:

    • 感谢您的回复。我会提出你的建议。我没有尝试过一个动作,因为我希望它在屏幕上移动,然后在它离开屏幕后重新出现在它开始的位置。在我看来,一个永不减速的浮动节点会起作用。接下来我会尝试行动。至于 applyimpulse,只是试图解决我的问题并添加我能找到的任何想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多