【问题标题】:SpriteKit - Detect when two SKShapeNodes "pass" each otherSpriteKit - 检测两个 SKShapeNode 何时“通过”对方
【发布时间】:2015-02-28 21:19:19
【问题描述】:

它可能看起来很长,但大部分是相同的代码:P 希望我能很好地解释我自己:) 我希望我能解释一下我自己。 情况是这样: 我有一个 SKShapeNode 让我们称他为 X。 这就是我声明 X(ONLY ONCE IN didMoveToView ) 的方式:

 var X = SKShapeNode(circleOfRadius: 15)
        X.position = CGPointMake(100  , 100)
        X.fillColor = SKColor.yellowColor()
        X.physicsBody = SKPhysicsBody(circleOfRadius: coin.frame.width/2)
        X.physicsBody?.dynamic = true
        X.physicsBody?.linearDamping = 1        
        X.physicsBody?.affectedByGravity = false
        X.physicsBody?.categoryBitMask = coincategory
        X.physicsBody?.contactTestBitMask = coincategory
        self.addChild(coin)

现在我的第二个 SKShapeNode,让我们称他为 Y 有点棘手,出于我的游戏原因,我需要他的尺寸是动态的,所以这就是我所做的并且它正在工作,首先,在 didSimulatePhysics() 中声明了他 像这样:

 override func didSimulatePhysics() {
        let pixel = self.childNodeWithName(X.name!)
        var pathtodraw : CGMutablePathRef!
        pathtodraw = CGPathCreateMutable()
        CGPathMoveToPoint(pathtodraw, nil , pixel!.position.x, pixel!.position.y)
        CGPathAddLineToPoint(pathtodraw, nil, 0, 0)
        CGPathCloseSubpath(pathtodraw)
        Y.path = pathtodraw

        self.addChild(Y)

{

而且为了让他的大小是动态的(游戏包括 X 的移动),我每次都在 update 方法中删除他,以便路径可以保持更新:

 override func update(currentTime: NSTimeInterval) {


        Y.removeFromParent()


}

我想要实现的目标:每次对象 X 越过 Y println(“他们只是互相通过”),我不希望他们对接触做出反应,或者相互反弹,他们应该对每个人都不可见其他,但我需要检测它们何时相互通过。

问题是什么:当我将 Physics 添加到 Y 时,节点会删除他 self ,他会不断生成更多节点并用他自己填充屏幕。如果按照上面的方式保留它,它可以完美地工作,它会删除他自己并更新大小并始终只保留 1 个节点。 这是尝试添加到 Y 的内容:

override func didSimulatePhysics() {
        let pixel = self.childNodeWithName(X.name!)
        var pathtodraw : CGMutablePathRef!
        pathtodraw = CGPathCreateMutable()
        CGPathMoveToPoint(pathtodraw, nil , pixel!.position.x, pixel!.position.y)
        CGPathAddLineToPoint(pathtodraw, nil, 0, 0)
        CGPathCloseSubpath(pathtodraw)
        Y.path = pathtodraw

        self.addChild(Y)

        **linenode = SKShapeNode(path: pathtodraw)
        linenode.physicsBody = SKPhysicsBody(edgeChainFromPath: pathtodraw)**

      {

It Keep 会生成很多节点并删除它们。知道我能做些什么来做到这一点吗?谢谢大家!

【问题讨论】:

    标签: ios sprite-kit collision skphysicsbody


    【解决方案1】:

    由于形状节点的路径可以在不将节点从场景中移除然后添加回来的情况下更新,我建议您将Y添加到didMoveToView中的场景中并删除addToChildremoveFromParent中的didSimulatePhysicsupdate 方法。此外,将物理体添加到Y,而不是创建新的形状节点。最后,您将创建X,然后将coin 添加到场景中。

    【讨论】:

    • 他会在哪里动态更新节点的路径?
    • plus + 他需要动态更新 Y.physicsBody = SKPhysicsBody(edgeChainFromPath: Y.path) ||||||||| Y = SKShapeNode(路径: Y.path) |||||||?
    • @roimulia OP 更新路径的代码应该可以在没有更改的情况下工作。另外,我建议OP将物理体添加到Y
    • 什么是 OP?出于某种原因,我检查了它,它们由于某种原因相互碰撞。我已将 CollisionBit 设置为:让 X:UInt32 = 0x1
    • @roimulia OP = 原始海报(即提出问题的人)。您是否尝试将物理体的 collisionBitMask 设置为 0?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多