2016-03-02 31 views
7

Tôi đang cố gắng tạo nền tảng di chuyển trên Swift và để người chơi di chuyển cùng với nền tảng, tôi cần thay đổi self.moveByX(), đơn giản hơn nhiều, đến physicsBody?.velocity (và thêm một số ma sát cho cả nền tảng lẫn trình phát).Swift: Đặt tốc độ cho khoảng cách

Vì vậy, tôi đã thực hiện một chức năng như thế này:

self.runAction(
    SKAction.repeatActionForever(
     SKAction.sequence([ 
      SKAction.runBlock({ 
       print(self.position.x) 
       self.physicsBody?.velocity = CGVectorMake(20, 0.0) 
      }), 
      SKAction.waitForDuration(3), 
      SKAction.runBlock({ 
       print(self.position.x) 
       self.physicsBody?.velocity = CGVectorMake(-20, 0.0) 
      }), 
      SKAction.waitForDuration(3) 
     ]) 
    ) 
) 

Vấn đề là tôi mong đợi sự khác biệt giữa các vị trí chính xác là 60 (20 * 3s), nhưng tôi nhận được các bản ghi của nền tảng x vị trí như thế này:

596.042907714844 
544.228393554688 
596.048950195312 
544.234008789062 
596.054565429688 
544.116333007812 
595.936584472656 
544.121887207031 
595.942199707031 
544.127685546875 
595.824584960938 
544.009704589844 

Vì vậy, sự khác biệt giữa các vị trí là một cái gì đó giữa 51 ~ 52

làm thế nào để làm cho di chuyển nền tảng trong một spec ific và khoảng cách chính xác bằng cách thay đổi vận tốc?

Chỉnh sửa: Tôi không biết nếu điều này là có liên quan, nhưng tôi đã thiết lập cơ thể vật lý của nền tảng như thế này:

self.physicsBody = SKPhysicsBody(rectangleOfSize: self.size) 
self.physicsBody?.categoryBitMask = PhysicsCategory.Ground 
self.physicsBody?.contactTestBitMask = PhysicsCategory.Player 
self.physicsBody?.collisionBitMask = PhysicsCategory.Player 
self.physicsBody?.allowsRotation = false 
self.physicsBody?.affectedByGravity = false 
self.physicsBody?.dynamic = true 
self.physicsBody?.friction = 1.0 
self.physicsBody?.restitution = 0.0 
self.physicsBody?.mass = 99999999999 
+0

Tôi chưa từng làm việc với bộ công cụ giả lập trong một thời gian. Nhưng tôi đoán bạn đang lặp đi lặp lại vận tốc nhiều lần. Trong "SKAction.runBlock" của bạn, hãy thử đặt lại vận tốc của bạn về 0 trước khi áp dụng "self.physicsBody? .velocity". Một lần nữa đây chỉ là một đoán, tôi không làm việc với spritekit nữa. Nhưng sự mất ma sát/vận tốc có thể không giống nhau cho cả hai vật thể. Đặt lại vận tốc có thể khắc phục nó. Nguoi ban doi may man. –

+0

Vâng, tôi đã thử nó quá, vấn đề không thay đổi –

+0

Hoàn toàn để thử nghiệm, bạn đã cố gắng để làm cho cả hai đối tượng cùng kích thước/khối lượng? Khi bạn làm điều đó, vấn đề có biến mất không? –

Trả lời

2

Tôi chưa từng làm việc với Sprite Kit trước nhưng tôi nghĩ rằng vấn đề của bạn là rằng thuộc tính linearDamping của SKPhysicsBody được đặt mặc định là 0.1, với phép tính nhanh (20 * 3-20 * 3 * 0.1 = 54), điều này nghe có vẻ đúng nếu vận tốc nếu bị làm giảm mọi khung hình.

Đây là tài liệu dành cho bất động sản:

https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKPhysicsBody_Ref/index.html#//apple_ref/occ/instp/SKPhysicsBody/linearDamping

Edit: Tôi nghĩ tôi nên kiểm tra câu trả lời của tôi ít nhất vì vậy tôi đã viết một (thô) chương trình nhanh chóng:

var dampingOccurancesPerSecond = 60.0 //Corresponds to frame rate 
var numberOfSeconds = 3.0 
var time = 0.0 

@IBAction func test(sender: UIButton) { 
    let result = checkDistanceForVelocity(20, damping: 0.1, distanceTraveled: 0.0) 
    print(result) 
} 

func checkDistanceForVelocity(velocity: Double, damping: Double, distanceTraveled: Double) -> Double { 

    if time < numberOfSeconds { 

     time += 1/dampingOccurancesPerSecond 

     let newVelocity = velocity - (velocity * damping/dampingOccurancesPerSecond) 

     let newDistance = (distanceTraveled + velocity/dampingOccurancesPerSecond) 

     return checkDistanceForVelocity(newVelocity, damping: damping, distanceTraveled: newDistance) 

    } 

    return distanceTraveled 

} 

Các các biến thể nhỏ trên quãng đường đi của bạn cũng có thể do những thay đổi nhỏ trong tốc độ khung hình của bạn. Khi dampingOccurancesPerSecond thay đổi từ 60 -> 50 tổng khoảng cách đã thay đổi từ 52.1203109538336 -> 51.8808576268828

Hy vọng điều này sẽ hữu ích !!

+0

Tôi có thể loại bỏ sự giảm chấn tuyến tính khỏi cơ thể vật lý của nền tảng không? –

+0

Vâng, hoàn toàn, chỉ cần thay đổi thuộc tính linearDamping của cơ thể vật lý thành 0.0 như vậy: –

+0

self.physicsBody? .linearDamping = 0.0 –

Các vấn đề liên quan