2016-03-02 13 views
7

Sto provando a creare una piattaforma mobile su Swift e, per far muovere il giocatore insieme alla piattaforma, ho dovuto cambiare lo self.moveByX(), che era molto più semplice, allo physicsBody?.velocity (e aggiungere qualche attrito sia alla piattaforma che al giocatore).Swift: imposta la velocità per la distanza

Così, ho fatto una funzione come questa:

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

Il problema è che mi aspettavo la differenza tra le posizioni di essere esattamente 60 (20 * 3s), ma sto ricevendo i registri della piattaforma x posizione come questa:

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

Quindi, la differenza tra le posizioni è qualcosa tra 51 ~ 52

Come faccio a fare la mossa piattaforma in uno spec distanza esatta e esatta cambiando la velocità?

Edit: Non so se questo è rilevante, ma ho impostato il corpo della fisica della piattaforma come questo:

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

Non ho lavorato con il kit sprite per un po '. Ma suppongo che tu stia ripetendo la velocità più e più volte. Nel tuo "SKAction.runBlock" prova a ripristinare la velocità a zero prima di applicare "self.physicsBody? .velocity". Ancora una volta è solo una supposizione, non lavoro più con lo spritekit. Ma la perdita di attrito/velocità potrebbe non essere la stessa per entrambi gli oggetti. Reimpostare la velocità potrebbe ripararlo. Buona fortuna amico. –

+0

sì, l'ho provato anche io, il problema non cambia –

+0

Solo per test, hai provato a rendere entrambi gli oggetti della stessa dimensione/massa? Quando lo fai, il problema scompare? –

risposta

2

Non ho lavorato con Kit Sprite prima, ma penso che il vostro problema è che la proprietà linearDamping di un SKPhysicsBody è impostata di default su 0.1, con un rapido calcolo (20 * 3-20 * 3 * 0.1 = 54) questo suona bene se la velocità è in fase di smorzamento per ogni fotogramma.

Ecco la documentazione per la proprietà:

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

Edit: ho pensato che avrei dovuto controllare la mia risposta, almeno così ho scritto un rapido programma di (approssimativa):

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 

} 

Il anche piccole variazioni sulla distanza percorsa sono probabilmente dovute a piccoli cambiamenti nella frequenza dei fotogrammi. Quando lo dampingOccurancesPerSecond passa da 60 a 50, la distanza totale percorsa cambia da 52.1203109538336 -> 51.8808576268828

Spero che questo abbia aiutato !!

+0

Posso semplicemente rimuovere lo smorzamento lineare dal corpo fisico della piattaforma? –

+0

Sì, è sufficiente modificare la proprietà linearDamping del corpo fisico su 0.0: –

+0

self.physicsBody?. LinearearDamping = 0.0 –

Problemi correlati