2016-03-02 20 views
7

Swift üzerinde hareketli bir platform yapmaya çalışıyorum ve oyuncu platformu ile birlikte hareket ettirmek için (physicsBody?.velocity) 'a çok daha kolay olan self.moveByX()'u değiştirmem gerekiyordu (ve hem platform hem de oyuncuya biraz sürtünme ekleyin).Swift: Hız için ayarlayın Hız

Yani, böyle bir işlevi yaptı:

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) 
     ]) 
    ) 
) 

Sorun pozisyonları arasındaki fark tam 60 (20 * 3 sn) olması bekleniyor yani, ama platformun günlükleri alıyorum böyle x pozisyon:

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

Yani, pozisyonları arasındaki fark nasıl spec platform hareket yapabilirim şey

52 ~ 51 arasındadır hızını değiştirerek ific ve tam mesafe?

Düzenleme: Bu alakalı olup olmadığını bilmiyorum, ama böyle platformun fizik vücudunu belirledik:

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

Bir süredir sprite kitiyle çalışmadım. Ama sanırım tekrar tekrar hızınızı tekrarlıyorsunuz. "SKAction.runBlock" ınızda "self.physicsBody? .velocity" uygulamadan önce hızınızı sıfıra sıfırlamayı deneyin. Yine bu sadece bir tahmin, artık spritekit ile çalışmıyorum. Ancak sürtünme/hız kaybı her iki nesne için de aynı olmayabilir. Sıfırlama hızı onu düzeltebilir. İyi şanslar dostum. –

+0

Evet, ben de denedim, sorun değişmiyor –

+0

Sadece test için, her iki nesneyi aynı boyutta/kütle yapmaya çalıştın mı? Bunu yaptığınızda, sorun ortadan kalkıyor mu? –

cevap

2

önce Sprite Kit ile çalışmamış ama senin sorunun olduğunu düşünüyorum SKPhysicsBody'nin linearDamping özelliğinin varsayılan olarak 0,1 değerine ayarlanması, hızlı bir hesaplama (20 * 3-20 * 3 * 0.1 = 54) ile her kare sönümlenirse hızın sağa gelmesidir.

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

Düzenleme: İşte

özellik için dokümantasyonudur Ben en azından bu yüzden hızlı (kaba) program yazdım cevabımı kontrol gerektiğini düşündüm:

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 

} 

Seyahat ettiğiniz mesafedeki küçük değişiklikler muhtemelen kare hızınızdaki küçük değişikliklerden kaynaklanmaktadır. SönümlemeOccurancesPerSecond 60 -> 50 arasında değiştiğinde, toplam mesafe 52.1203109538336 -> 51.8808576268828

olarak değişir.

+0

Sadece platformun fizik bedeninden lineer sönümleme kaldırabilir miyim? –

+0

Evet, sadece fizik gövdesinin linearDamping özelliğini 0.0 olarak değiştirin: –

+0

self.physicsBody? .linearDamping = 0.0 –