我在didMoveToView
中添加了以下内容:
var ground = SKNode()
ground.position = CGPointMake(0, 0)
ground.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
ground.physicsBody?.dynamic = false
ground.physicsBody?.friction = 1
self.addChild(ground)
在touchesBegan
中,我添加了以下内容:
mainChar.physicsBody?.velocity = CGVectorMake(0, 0)
mainChar.physicsBody?.applyImpulse(CGVectorMake(85, 0))
其中mainChar是之前定义的SKSpriteNode。我通过在y方向上改变applyImpulse的方向来测试上面的代码,并看到mainChar没有超出屏幕的顶部。但是当我将其保留为85或将其更改为-85时,它会从屏幕的右侧和左侧消失。
我可以做些什么来确保mainChar保持在屏幕的粘合框内?
感谢。
答案 0 :(得分:1)
赔率是您的场景与框架尺寸相同并且您使用的是.AspectFill
。
如果打开物理调试,您会发现上下左右都有绿线。
skView.showsPhysics = true
如果你这样做......
scene.scaleMode = .AspectFit
一切都可能神奇地起作用,但你会注意到一些黑条
如果您在didMoveToView中打印(如果.AspectFill)
println("\(self.frame)")
println("\(view.frame)")
您可能会看到您正在尝试将一个非常大的场景放入一个小视图中。您的场景会缩小到您的视图中,但大小保持不变。这会导致一些事情被切断(甚至是你的地面节点)你必须做一些数学计算才能找出顶部和底部被截断的东西。之后,您将需要基于该框架创建框架并偏移您的节点。
抱歉,我无法为你做数学计算,但我想如果我至少让你指向正确的方向,你就知道为什么然后你可以弄明白其余的。
答案 1 :(得分:0)
将dynamic设置为false可防止节点受到冲突的影响。
按如下方式更改您的代码:
var ground = SKNode()
ground.position = CGPointMake(0, 0)
ground.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
ground.physicsBody?.dynamic = true //This should be set to true
ground.physicsBody?.affectedByGravity = false
ground.physicsBody?.friction = 1
self.addChild(ground)
您还必须为每个physicsBody设置类别。