【问题标题】:No bouncing occurs when dragging an object to collide with another object in Sprite Kit拖动对象与 Sprite Kit 中的另一个对象碰撞时不会发生弹跳
【发布时间】:2015-12-28 19:53:46
【问题描述】:

Here 是我遇到的问题的视频。正如您在视频中看到的那样,我移动了一个灰球以尝试与一个红球相撞。当两个物体碰撞时没有反弹,红球只是移动。我尝试过调整红球的密度,例如将红球的密度设为 0.00001。碰撞行为没有区别。

我怎样才能改变碰撞行为,以便有弹跳?

下面是灰球的属性:

func propertiesGrayBall() {
    gray = SKShapeNode(circleOfRadius: frame.width / 10 )
    gray.physicsBody = SKPhysicsBody(circleOfRadius: frame.width / 10 )
    gray.physicsBody?.affectedByGravity = false
    gray.physicsBody?.dynamic = true
    gray.physicsBody?.allowsRotation = false
    gray.physicsBody?.restitution = 1
}

以下是红球的属性:

func propertiesRedBall  {
    let redBall = SKShapeNode(circleOfRadius: self.size.width / 20
    redBall.physicsBody = SKPhysicsBody(self.size.width / 20)
    redBall.physicsBody?.affectedByGravity = false
    redBall.physicsBody?.dynamic = true
    redBall.physicsBody?.density = redBall.physicsBody!.density * 0.000001
    redBall.physicsBody?.allowsRotation = false
    redBall.physicsBody?.restitution = 1
}

这是我移动灰球的方法。

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if fingerIsOnGrayBall {
        let touch = touches.first
        var position = touch!.locationInView(self.view)
        position = self.convertPointFromView(position)
        grayBall.position = position
    }
}

主要修改 球最初有附件。我删除了它们以简化问题。这就是 cmets 可能无法与代码相加的原因。

【问题讨论】:

  • 你能告诉我们灰球和黑球之间物理连接的代码吗?那里可能有一些东西不允许它对物理碰撞做出响应。
  • @Gliderman 我刚刚更新了代码!感谢您的回复。
  • 有趣的是,您说将恢复原状更改为 1 并没有什么不同。您是否尝试过将 restitution 设置为 true 然后执行 blackBall.physicsBody?.usePreciseCollisionDetection = true ?你移动球的速度确实很快,所以也许这可以解决问题。
  • @theprole 感谢您的回复!是的,我认为将恢复原状更改为 1 并没有产生任何影响,这很奇怪。我刚刚尝试了您的建议,不幸的是设置blackBall.physicsBody?.usePreciseCollisionDetection = true 并没有解决问题。还有什么其他可能会限制我的对象正确响应吗?
  • @Sami 很有趣,也许您想尝试使用SKAction 来移动灰色圆圈(一个非常快速的动作,几乎可以立即移动)。这可以让物理引擎正常工作吗?有时直接设置位置是行不通的。

标签: ios swift sprite-kit collision skshapenode


【解决方案1】:

如果您通过直接或使用SKAction 设置节点位置来移动节点(带有物理实体),则该节点将不会成为物理模拟的一部分。相反,您应该通过施加力/脉冲或设置其速度来移动节点。以下是如何做到这一点的示例:

首先,定义一个变量来存储触摸的位置

class GameScene: SKScene {
    var point:CGPoint?

然后,从您的代码中删除以下语句

redBall.physicsBody?.density = redBall.physicsBody!.density * 0.000001

最后,添加以下触摸处理程序

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    /* Called when a touch begins */

    for touch in touches {
        let location = touch.locationInNode(self)

        let node = nodeAtPoint(location)
        if (node.name == "RedBall") {
            point = location
        }
    }
}

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
   /* Called when a touch begins */

    for touch in touches {
        let location = touch.locationInNode(self)
        if point != nil {
            point = location
        }
    }
}

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    point = nil
}

override func update(currentTime: CFTimeInterval) {
    if let location = point {
        let dx = location.x - redBall.position.x
        let dy = location.y - redBall.position.y
        let vector = CGVector(dx: dx*100, dy: dy*100)
        redBall.physicsBody?.velocity = vector
    }
}

【讨论】:

    猜你喜欢
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多