2017-09-09 2 views
1

Ich versuche den Abstand zwischen zwei Knoten zu finden, speziell rocks. Das ist jetzt einfache Mathematik; aber ich laufe auf ein Problem. Ich möchte überprüfen, ob der topRock sich in einer Entfernung von btmRock befindet. Der Code, den ich habe, ist ->Berechnete Entfernung zwischen SKNodes ändert sich nicht, obwohl sie sich bewegen

extension CGPoint { 
    func distanceFromCGPoint(point:CGPoint)->CGFloat{ 
     return sqrt(pow(self.x - point.x,2) + pow(self.y - point.y,2)) 
    } 
} 

Jetzt in meinem Update-Funktion Ich habe ->

var updateTopTime : Double = 0 
var updateBottomTime : Double = 0 
var genInterval : Double = 2 
var genOffset : Double = 3.5 

override func update(_ currentTime: TimeInterval) { 
    moveBackgroundImg() 

    //optional prevents generation if game is not playing 
    //guard gameState == .playing else { return } 

    if updateTopTime == 0 { 
     updateTopTime = currentTime 
    } 

    if updateBottomTime == 0 { 
     updateBottomTime = currentTime 
    } 

    if currentTime - updateBottomTime > genOffset { 
     createBtmRock() 
     genOffset = genInterval 
     updateBottomTime = currentTime 
    } 
    else if currentTime - updateTopTime > genInterval { 
     createTopRock() 
     updateTopTime = currentTime 
    } 

    var distance = btmRock.position.distanceFromCGPoint(point: topRock.position) 
    print(distance) 

    if distance <= 10 { 
     btmRock.position.x += 10 
    } 

    if holdingTouch{ 
     progressBar.progress -= 0.001 
     voloc += 15 
     plane.physicsBody?.velocity = CGVector(dx: 0, dy: voloc) 
     //plane.physicsBody?.applyImpulse(CGVector(dx: 0, dy:)) 
    } 
} 

Das Problem ist, dass distance kehrt 244.201193259997. Meine topRock und btmRock sind zufällig generiert sowie sie bewegen. Selbst wenn sich die Knoten bewegen, bleibt das Ergebnis gleich. Dies ist, wie ich meine Knoten bewegen ->

func moveBackgroundImg(){ 
    self.enumerateChildNodes(withName: "BackgroundImg", using: ({ 
     (node, error) in 

     node.position.x -= self.backgroundMovingSpeed 

     if node.position.x < -((self.scene?.size.width)!){ 
      node.position.x += (self.scene?.size.width)! * 3 
     } 

    })) 

    self.enumerateChildNodes(withName: "GroundImg", using: ({ 
     (node, error) in 

     node.position.x -= self.backgroundMovingSpeed 

     if node.position.x < -((self.scene?.size.width)!){ 
      node.position.x += (self.scene?.size.width)! * 3 
     } 

    })) 

    self.enumerateChildNodes(withName: "TopRock", using: ({ 
     (node, error) in 

     node.position.x -= self.backgroundMovingSpeed 

     if node.position.x < -((self.scene?.size.width)!){ 
      node.removeFromParent() 
     } 

    })) 

    self.enumerateChildNodes(withName: "BtmRock", using: ({ 
     (node, error) in 

     node.position.x -= self.backgroundMovingSpeed 

     if node.position.x < -((self.scene?.size.width)!){ 
      node.removeFromParent() 
     } 

    })) 
} 

Ich bin verwirrt, wie meine Knoten zufällig erstellt werden, so dass sie unterschiedliche x und y Punkte haben; aber ich bekomme immer noch 244.201193259997. Wenn es dies hilft, ist, wie meine Knoten erstellt werden ->

func setupRocks() { 

    //create the base bottom rock 
    var btmRockChoice = [SKTexture(image: #imageLiteral(resourceName: "rock")), SKTexture(image: #imageLiteral(resourceName: "rockGrass")), SKTexture(image: #imageLiteral(resourceName: "rockSnow")), SKTexture(image: #imageLiteral(resourceName: "rockIce"))] 

    btmRock = SKSpriteNode(texture: btmRockChoice[mapChoice], size: CGSize(width: (self.scene?.size.width)!/10, height: (self.scene?.size.height)!/2.2)) 
    btmRock.zPosition = -9 
    btmRock.position = CGPoint(x: self.frame.width, y: frame.minY + btmRock.frame.height/2) 
    btmRock.name = "BtmRock" 

    btmRock.physicsBody = SKPhysicsBody(texture: btmRockChoice[mapChoice], size: CGSize(width: (self.scene?.size.width)!/10, height: (self.scene?.size.height)!/2.2)) 
    btmRock.physicsBody?.categoryBitMask = physicsCatagory.topRock 
    btmRock.physicsBody?.collisionBitMask = physicsCatagory.plane 
    btmRock.physicsBody?.contactTestBitMask = physicsCatagory.plane 
    btmRock.physicsBody?.affectedByGravity = false 
    btmRock.physicsBody?.isDynamic = false 

    //create the base top rock 
    var topRockChoice = [SKTexture(image: #imageLiteral(resourceName: "rockDown")), SKTexture(image: #imageLiteral(resourceName: "rockGrassDown")), SKTexture(image: #imageLiteral(resourceName: "rockSnowDown")), SKTexture(image: #imageLiteral(resourceName: "rockIceDown"))] 

    topRock = SKSpriteNode(texture: topRockChoice[mapChoice], size: CGSize(width: (self.scene?.size.width)!/10, height: (self.scene?.size.height)!/2.2)) 
    topRock.zPosition = -9 
    topRock.name = "TopRock" 
    topRock.position = CGPoint(x: self.frame.width + topRock.size.width * 2, y: frame.maxY - topRock.frame.height/2) 

    topRock.physicsBody = SKPhysicsBody(texture: topRockChoice[mapChoice], size: CGSize(width: (self.scene?.size.width)!/10, height: (self.scene?.size.height)!/2.2)) 
    topRock.physicsBody?.categoryBitMask = physicsCatagory.topRock 
    topRock.physicsBody?.collisionBitMask = physicsCatagory.plane 
    topRock.physicsBody?.contactTestBitMask = physicsCatagory.plane 
    topRock.physicsBody?.affectedByGravity = false 
    topRock.physicsBody?.isDynamic = false 
} 

func createTopRock() { 

    //You can make this number a class variable to increase the rate as the game progresses 
    let randomNum = arc4random_uniform(2) 

    //there is a 1 in 3 chance that this rock will get created 
    if randomNum == 0 { 

     let rock = topRock.copy() as! SKSpriteNode 
     self.addChild(rock) 
    } 
} 

func createBtmRock() { 

    //You can make this number a class variable to increase the rate as the game progresses 
    let randomNum = arc4random_uniform(2) 

    //there is a 1 in 2 chance that this rock will get created 
    if randomNum == 0 { 

     let rock = btmRock.copy() as! SKSpriteNode 
     self.addChild(rock) 
    } 
} 

override func didMove(to view: SKView) { 
    spawnDelayForeverTop = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.createTopRock), userInfo: nil, repeats: false) 

    spawnDelayForeverBtm = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(self.createBtmRock), userInfo: nil, repeats: false) 
} 

UPDATE: Ich glaube, es hat etwas mit Ankerpunkten zu tun hat, aber ich bin nicht sicher.

+0

Warum ändert sich Ihre Entfernung? Ihr oberer und unterster Stein bewegen sich mit der gleichen Geschwindigkeit nach links. – Knight0fDragon

+0

Alle Ihre Steine ​​sind in der gleichen Position erstellt, es gibt keinen zufälligen x Ort, und arc4random_uniform (2) ist 50/50 Chance, nicht 33/33/33 (nur Sie bekomme 0 oder 1) – Knight0fDragon

+0

@ Knight0fDragon der Timer, den ich eingerichtet habe, hat eine Zufallszahl, die sie hervorbringt. Sie werden also nicht gleichzeitig erstellt. Sie werden zu unterschiedlichen Zeiten mit unterschiedlichen Abständen zwischen ihnen erstellt. Sie werden auch vom Elternteil entfernt, wenn sie den Bildschirm verlassen und wieder erstellt werden, und sie befolgen auch den Timer, sobald er neu erstellt wurde. –

Antwort

1

Sie topRock und bottomRock-Knoten sind nicht die, die Sie in Ihrer Szene sehen, und werden nicht als untergeordnete Knoten hinzugefügt. Was Sie der Szene hinzufügen, sind Kopien dieser beiden "Vorlagen" -Objekte. Die Position von topRock und bottomRock wird nie geändert, da sie nicht zu den untergeordneten Elementen der Szene gehören (und ich sehe keine Stelle in Ihrem Code, an der Sie die Position dieser beiden Instanzen ändern).

Verwandte Themen