我的代码出了问题。当我的障碍永远消失时,"路径"广场应该经过的地方有时会离开屏幕,而不是定位在我想要的地方。我希望路径在屏幕宽度的1/4之间。我认为错误在宽度和randomXPos常量的某处。我怎样才能解决这个问题? (如果你想进一步解释,我可以解释一下。)
func addObstacles2() {
let obstacle2A = SKSpriteNode(imageNamed: "Obstacle")
let obstacle2B = SKSpriteNode(imageNamed: "Obstacle")
let width = UInt32(self.frame.size.width / 5)
let randomXPos = CGFloat(arc4random_uniform(UInt32(width)))
let gapWidth = square.size.width * 2
let moveDown2A = SKAction.moveByX(0, y: -self.size.width, duration: 2.5)
let repeatAction2A = SKAction.repeatActionForever(moveDown2A)
let removeObstacle2A = SKAction.removeFromParent()
let moveAndRemove2A = SKAction.sequence([repeatAction2A, removeObstacle2A])
obstacle2A.size = CGSize(width: self.frame.size.width, height: 300)
obstacle2A.position = CGPointMake(CGRectGetMidX(self.frame) + obstacle2A.size.width / 2 + gapWidth / 2 + randomXPos, self.frame.size.height * 2)
obstacle2A.zPosition = 40
obstacle2A.runAction(moveAndRemove2A)
self.addChild(obstacle2A)
let moveDown2B = SKAction.moveByX(0, y: -self.size.width, duration: 2.5)
let repeatAction2B = SKAction.repeatActionForever(moveDown2B)
let removeObstacle2B = SKAction.removeFromParent()
let moveAndRemove2B = SKAction.sequence([repeatAction2B, removeObstacle2B])
obstacle2B.size = CGSize(width: self.frame.size.width, height: 300)
obstacle2B.position = CGPointMake(CGRectGetMidX(self.frame) - obstacle2B.size.width / 2 - gapWidth / 2 + randomXPos, self.frame.size.height * 2)
obstacle2B.zPosition = 40
obstacle2B.runAction(moveAndRemove2B)
self.addChild(obstacle2B)
}
(请注意:我的功能已经使障碍物永远产生。)
答案 0 :(得分:0)
好的,好像你从Object2B的x位置减去了太多。
要意识到的第一件重要事情是self.frame.size.width
不会返回用户在其设备上看到的宽度。实际上,它会返回一点额外的,因为sprite kit默认配置为具有设置坐标系,以便允许开发人员在坐标中进行硬编码并在每个设备上看到相同的内容。 (它是场景默认的比例模式 - SKSceneScaleModeResizeFill
)。
所以,如果我们以数学方式看看你在做什么,我们会看到你是从视图的中间开始的,(x坐标512,我相信)。然后,你减去该值的一半,将你置于x坐标256(已经关闭已离开屏幕)。然后你减去更多,从而导致一些节点离开屏幕。
您的随机值没有问题。这是你的默认坐标系,你没有看到它们中的一些。尝试对
中的值进行硬编码