2015-09-30 2 views
4

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 
    } 
} 

Основные редактирует Шарик первоначально имел вложения. Я удалил их, чтобы упростить проблему. Вот почему комментарии могут не совпадать с кодом.

+1

Не могли бы вы показать нам код для физического соединения между серым баллом л и черный? Там может быть что-то, что не позволяет ему реагировать на физическое столкновение. – Gliderman

+0

@Gliderman Я только что обновил код! Спасибо за ваш ответ. – Sami

+1

Интересно, что вы говорите, что изменение реституции на 1 не изменилось. Вы пытались установить реституцию на true, а затем blackBall.physicsBody? .usePreciseCollisionDetection = true? Вы очень быстро перемещаете мяч, поэтому, возможно, это может решить проблему. – theprole

ответ

3

Если вы переместите узел (с физическим телом) с помощью настроек его положения, напрямую или с помощью 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 
    } 
} 
Смежные вопросы