【问题标题】:SKSpriteNode's position changes after placement放置后 SKSpriteNode 的位置发生变化
【发布时间】:2016-07-07 21:37:50
【问题描述】:

我遇到了 SKSpriteNode 的问题。在我将它放在场景中的某个位置之后,它的位置开始变化非常缓慢。这只发生在我将 SKPhysicsBody 附加到它时,但不是没有它,所以它与此相关。

这是我放置的图块的代码:

import Foundation
import SpriteKit

class Tile : SKNode {

    var sprite = SKSpriteNode(imageNamed: "grassMid")

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented");
    }


    override init() {
        super.init();
        self.sprite.physicsBody = SKPhysicsBody(texture: self.sprite.texture!, size: CGSize(width: 32.0, height: 32.0))
        self.sprite.physicsBody?.dynamic = false
        self.sprite.physicsBody?.collisionBitMask = 0x0
        self.addChild(sprite)
    }
}

这是放置对象的代码:

func addNewTile(position: CGPoint) {
        let t = Tile()
        t.sprite.position = getClosestPointInGrid(position)
        t.sprite.size = CGSize(width: 32.0, height: 32.0)
        if(!doesPositionContainTile(t.sprite.position)) {
             self.addChild(t)
        }
        print(t.sprite.position)
}

例如:我在位置 (256, 32) 放置了一个图块,然后位置很快变为 (255.990264892578, 31.9987831115723) 并且一直在缓慢变化?我不明白。为什么会发生这种行为?

【问题讨论】:

    标签: swift macos sprite-kit skspritenode skphysicsbody


    【解决方案1】:

    发生这种行为是因为您在精灵中添加了物理环境,因此涉及到尊重您的physicsWorldphysicsBody 设置的所有参数(重力、恢复、线性阻尼、摩擦力......)。

    事实上,使用SKActions 是不正确的,因为你可能有像你这样的奇怪值。最好将addImpulsevelocity 用于您的精灵。

    希望它可以帮助您了解项目中发生的事情。

    【讨论】:

    • 有没有办法完全停止运动但保留碰撞?就像我不想离开这个位置一样。
    • 碰撞后可以设置速度为0,physicBody.speed
    • 问题是即使我将self.sprite.physicsbody.dynamic 设置为false,当我放置它时,对象仍然会向下移动一点。当动态为假时,它甚至不应该受到重力的影响。
    【解决方案2】:

    好的。

    我对这个问题做了一些研究,得出的结论是,如果一个 SKSpriteNode 是一个 SKNode 的父级,并且你将 SKSpriteNode 的 SKPhysicsObject 的动态属性设置为 false,那么该对象仍然会缓慢地向下漂移。将动态属性设置为 false 时,它​​根本不应该移动。如果 SKSpriteNode 的父节点是 SKScene,则不会发生此错误。

    此错误于 2015 年 11 月 27 日在 Apple 开发者论坛 thread 上报告。据说它在 12 月 20 日仍然存在。我现在可以说它在 2016 年 7 月 10 日仍然存在。我有 Xcode 7.0 和 OS X 10.11.5,我只熟悉 OS X 版本的 spritekit,我不知道这个 bug 是否也在 iOS 上.

    最初我的地图系统是这样设计的,地图是 SKNode,瓦片是 SKSpriteNodes。由于这个错误,我对其进行了更改,以便将 SKSpriteNodes(tiles) 直接添加到 SKScene。现在该错误没有发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      相关资源
      最近更新 更多