AND (&&) 运算符在 SWIFT 中未按预期工作
AND (&&) operator not working as expected in SWIFT
我试图在屏幕上随机生成节点而不重叠所以我决定从彼此中找到每个节点的range/distance并连续随机生成一个位置,其中每个节点的范围大于100,一旦范围超过 100,它将跳出 while 循环并将节点添加到视图
var p2Dp1: CGFloat = 0
var p3Dp1: CGFloat = 0
var p3Dp2: CGFloat = 0
planet1.position = CGPoint(x: Int(arc4random_uniform(220) + 80), y: Int(arc4random_uniform(500) + 100))
while p2Dp1 < 100.0 {
planet2.position = CGPoint(x: Int(arc4random_uniform(220) + 80), y: Int(arc4random_uniform(500) + 100))
p2Dp1 = SDistanceBetweenPoints(planet2.position, p2: planet1.position)
print(" planet 2 distance from 1: \(p2Dp1) ")
}
while p3Dp1 < 100.0 && p3Dp2 < 100.0 {
planet3.position = CGPoint(x: Int(arc4random_uniform(220) + 80), y: Int(arc4random_uniform(500) + 100))
p3Dp1 = SDistanceBetweenPoints(planet3.position, p2: planet1.position)
print(" planet 3 distance from 1: \(p3Dp1) ")
p3Dp2 = SDistanceBetweenPoints(planet3.position, p2: planet2.position)
print(" planet 3 distance from 2: \(p3Dp2) ")
}
self.addChild(planet1)
self.addChild(planet2)
self.addChild(planet3)
它首先随机给第一个节点(planet1)一个视图上的位置,然后随机给node2(planet2)一个与行星1和2的距离大于100的位置。第一个while循环似乎工作正常,它的第二个 while 循环给我带来了麻烦。根据控制台,“&&”运算符似乎不起作用
Console/Log:
行星2与1的距离:96.1665222413705 行星2与1的距离:185.407658957229 行星3与1的距离:136.30847369111 行星3与2的距离:55.1724568965349 EWWWWING WE='RE 29=]
我设置了 didBeginContact(contact: SKPhysicsContact),如果发生接触,它会打印出来
这是我用来计算距离的方法:
func SDistanceBetweenPoints(p1: CGPoint, p2: CGPoint) -> CGFloat {
return hypot(p2.x - p1.x, p2.y - p1.y);
}
有人可以告诉我我可能做错了什么吗?我计划总共添加 5 个行星,但现在我用 3
来测试它
你的 while
循环的条件是:
p3Dp1 < 100.0 && p3Dp2 < 100.0
这意味着 while 循环只会在两个条件都为真时继续。一旦条件的任何一部分为假(即距离大于 100),循环将停止执行。
您可能希望将条件更改为或 (||
),例如:
while p3Dp1 < 100.0 || p3Dp2 < 100.0 {
这将保持 运行 while 循环,直到两个距离都大于 100。
将&&改为||
你现在说当 p2 和 p3 都小于 100 时继续尝试,所以一旦 p2 大于 100 while 失败并且你不再关心 p3。
我试图在屏幕上随机生成节点而不重叠所以我决定从彼此中找到每个节点的range/distance并连续随机生成一个位置,其中每个节点的范围大于100,一旦范围超过 100,它将跳出 while 循环并将节点添加到视图
var p2Dp1: CGFloat = 0
var p3Dp1: CGFloat = 0
var p3Dp2: CGFloat = 0
planet1.position = CGPoint(x: Int(arc4random_uniform(220) + 80), y: Int(arc4random_uniform(500) + 100))
while p2Dp1 < 100.0 {
planet2.position = CGPoint(x: Int(arc4random_uniform(220) + 80), y: Int(arc4random_uniform(500) + 100))
p2Dp1 = SDistanceBetweenPoints(planet2.position, p2: planet1.position)
print(" planet 2 distance from 1: \(p2Dp1) ")
}
while p3Dp1 < 100.0 && p3Dp2 < 100.0 {
planet3.position = CGPoint(x: Int(arc4random_uniform(220) + 80), y: Int(arc4random_uniform(500) + 100))
p3Dp1 = SDistanceBetweenPoints(planet3.position, p2: planet1.position)
print(" planet 3 distance from 1: \(p3Dp1) ")
p3Dp2 = SDistanceBetweenPoints(planet3.position, p2: planet2.position)
print(" planet 3 distance from 2: \(p3Dp2) ")
}
self.addChild(planet1)
self.addChild(planet2)
self.addChild(planet3)
它首先随机给第一个节点(planet1)一个视图上的位置,然后随机给node2(planet2)一个与行星1和2的距离大于100的位置。第一个while循环似乎工作正常,它的第二个 while 循环给我带来了麻烦。根据控制台,“&&”运算符似乎不起作用
Console/Log:
行星2与1的距离:96.1665222413705 行星2与1的距离:185.407658957229 行星3与1的距离:136.30847369111 行星3与2的距离:55.1724568965349 EWWWWING WE='RE 29=]
我设置了 didBeginContact(contact: SKPhysicsContact),如果发生接触,它会打印出来
这是我用来计算距离的方法:
func SDistanceBetweenPoints(p1: CGPoint, p2: CGPoint) -> CGFloat {
return hypot(p2.x - p1.x, p2.y - p1.y);
}
有人可以告诉我我可能做错了什么吗?我计划总共添加 5 个行星,但现在我用 3
来测试它你的 while
循环的条件是:
p3Dp1 < 100.0 && p3Dp2 < 100.0
这意味着 while 循环只会在两个条件都为真时继续。一旦条件的任何一部分为假(即距离大于 100),循环将停止执行。
您可能希望将条件更改为或 (||
),例如:
while p3Dp1 < 100.0 || p3Dp2 < 100.0 {
这将保持 运行 while 循环,直到两个距离都大于 100。
将&&改为||
你现在说当 p2 和 p3 都小于 100 时继续尝试,所以一旦 p2 大于 100 while 失败并且你不再关心 p3。