我在父节点B中有一个节点A.
我在节点B上使用setScale来给出缩放的幻觉,但是当我这样做时,节点A及其所有兄弟节点都没有预期的物理体。
即使A看起来越来越小,它的物理体也保持不变。这会导致古怪的行为。
我怎样才能“缩小”并且仍然有合理的物理?
答案 0 :(得分:3)
SKPhysicsBody无法缩放。作为一个黑客,你可以摧毁当前的物理体,并在你向上或向下扩展时添加一个较小的物理体,但不幸的是,这不是一个非常有效的解决方案。
答案 1 :(得分:2)
SKCameraNode
(在iOS9中添加)听起来非常适合您的场景。与更改场景中每个节点的比例相反,您只会更改摄像机节点的比例。
首先,您需要在场景的层次结构中添加SKCameraNode
(这也可以在Sprite Kit编辑器中完成)。
override func didMoveToView(view: SKView) {
super.didMoveToView(view)
let camera = SKCameraNode()
camera.position = CGPoint(x: size.width / 2, y: size.height / 2)
self.addChild(camera)
self.camera = camera
}
其次,由于SKCameraNode
是一个节点,因此您可以将SKActions
应用于该节点。对于缩小效果,您可以这样做:
guard let camera = camera else { return }
let scale = SKAction.scaleBy(2, duration: 5)
camera.runAction(scale)
有关详细信息,请查看WWDC 2015 talk: What's New In Sprite Kit。
答案 2 :(得分:1)
一个简单的例子,它表明物理体在缩放其父节点时可以适当地缩放/行为。点击以将精灵添加到场景中。
class GameScene: SKScene {
var toggle = false
var node = SKNode()
override func didMoveToView(view: SKView) {
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: view.frame)
scaleMode = .ResizeFill
view.showsPhysics = true
addChild(node)
let shrink = SKAction.scaleBy(0.25, duration: 5)
let grow = SKAction.scaleBy(4.0, duration: 5)
let action = SKAction.sequence([shrink,grow])
node.runAction(SKAction.repeatActionForever(action))
}
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
/* Called when a touch begins */
for touch in (touches as! Set<UITouch>) {
let location = touch.locationInNode(node)
let sprite = SKSpriteNode(imageNamed:"Spaceship")
if (toggle) {
sprite.physicsBody = SKPhysicsBody(circleOfRadius: sprite.size.width/2.0)
}
else {
sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
}
sprite.xScale = 0.125
sprite.yScale = 0.125
sprite.position = location
node.addChild(sprite)
toggle = !toggle
}
}
}