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.
Warum ändert sich Ihre Entfernung? Ihr oberer und unterster Stein bewegen sich mit der gleichen Geschwindigkeit nach links. – Knight0fDragon
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
@ 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. –